From 4d92991817a691776a0d37d855bf366d77ac0090 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beyhan=20O=C4=9Fur?= Date: Sun, 26 Apr 2026 21:30:42 +0300 Subject: [PATCH] first commit --- .air.toml | 58 + .env | 32 + .env.copy | 31 + .gitignore | 29 + Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXV | 9 + Dockerfile | 71 + belgeler/admin_panel.md | 96 + config/config.go | 119 + config/loger.go | 39 + controllers/admin_cart_controller.go | 52 + controllers/admin_controller.go | 1641 +++ controllers/admin_product_controller.go | 619 + controllers/api_cart_controller.go | 237 + controllers/blog_controller.go | 1123 ++ controllers/hero_controller.go | 164 + controllers/product_controller.go | 161 + controllers/security_controller.go | 419 + controllers/setting_controller.go | 150 + controllers/user.go | 798 + database/config/mysql_db.go | 46 + database/config/postgres_db.go | 46 + database/config/redis_db.go | 117 + database/migrate/migrate.go | 162 + database/models/blog.go | 53 + database/models/cart.go | 20 + database/models/cors.go | 34 + database/models/docs_models.go | 96 + database/models/hero.go | 23 + database/models/product.go | 53 + database/models/setting.go | 43 + database/models/user.go | 48 + database/seeder/seeder.go | 75 + docker-compose.c.yml | 20 + docker-compose.yml | 26 + docker-entrypoint.sh | 13 + docs/docs.go | 1377 ++ docs/swagger.json | 1348 ++ docs/swagger.yaml | 872 ++ go.mod | 70 + go.sum | 172 + info.log | 122 + main.go | 130 + middlewares/auth_middleware.go | 108 + middlewares/dynamic_cors.go | 151 + middlewares/rate_limit.go | 136 + middlewares/reject_all_middleware.go | 12 + pkg/utis/slug.go | 48 + pkg/utis/token.go | 15 + public/admin/css/theme.css | 146 + public/admin/js/main.js | 63 + public/assets/.package-lock.json | 77 + public/assets/@popperjs/core/LICENSE.md | 20 + public/assets/@popperjs/core/README.md | 376 + .../assets/@popperjs/core/dist/cjs/enums.js | 65 + .../@popperjs/core/dist/cjs/enums.js.flow | 3 + .../@popperjs/core/dist/cjs/enums.js.map | 1 + .../@popperjs/core/dist/cjs/popper-base.js | 939 ++ .../core/dist/cjs/popper-base.js.flow | 3 + .../core/dist/cjs/popper-base.js.map | 1 + .../@popperjs/core/dist/cjs/popper-lite.js | 1260 ++ .../core/dist/cjs/popper-lite.js.flow | 3 + .../core/dist/cjs/popper-lite.js.map | 1 + .../assets/@popperjs/core/dist/cjs/popper.js | 1819 +++ .../@popperjs/core/dist/cjs/popper.js.flow | 3 + .../@popperjs/core/dist/cjs/popper.js.map | 1 + .../@popperjs/core/dist/esm/createPopper.js | 199 + .../core/dist/esm/dom-utils/contains.js | 23 + .../esm/dom-utils/getBoundingClientRect.js | 41 + .../dist/esm/dom-utils/getClippingRect.js | 70 + .../dist/esm/dom-utils/getCompositeRect.js | 58 + .../dist/esm/dom-utils/getComputedStyle.js | 4 + .../dist/esm/dom-utils/getDocumentElement.js | 6 + .../dist/esm/dom-utils/getDocumentRect.js | 29 + .../esm/dom-utils/getHTMLElementScroll.js | 6 + .../core/dist/esm/dom-utils/getLayoutRect.js | 25 + .../core/dist/esm/dom-utils/getNodeName.js | 3 + .../core/dist/esm/dom-utils/getNodeScroll.js | 11 + .../dist/esm/dom-utils/getOffsetParent.js | 69 + .../core/dist/esm/dom-utils/getParentNode.js | 19 + .../dist/esm/dom-utils/getScrollParent.js | 16 + .../dist/esm/dom-utils/getViewportRect.js | 31 + .../core/dist/esm/dom-utils/getWindow.js | 12 + .../dist/esm/dom-utils/getWindowScroll.js | 10 + .../dist/esm/dom-utils/getWindowScrollBarX.js | 13 + .../core/dist/esm/dom-utils/instanceOf.js | 23 + .../dist/esm/dom-utils/isLayoutViewport.js | 4 + .../core/dist/esm/dom-utils/isScrollParent.js | 10 + .../core/dist/esm/dom-utils/isTableElement.js | 4 + .../dist/esm/dom-utils/listScrollParents.js | 26 + .../assets/@popperjs/core/dist/esm/enums.js | 31 + .../assets/@popperjs/core/dist/esm/index.js | 8 + .../core/dist/esm/modifiers/applyStyles.js | 84 + .../core/dist/esm/modifiers/arrow.js | 90 + .../core/dist/esm/modifiers/computeStyles.js | 169 + .../core/dist/esm/modifiers/eventListeners.js | 49 + .../@popperjs/core/dist/esm/modifiers/flip.js | 147 + .../@popperjs/core/dist/esm/modifiers/hide.js | 61 + .../core/dist/esm/modifiers/index.js | 9 + .../core/dist/esm/modifiers/offset.js | 54 + .../core/dist/esm/modifiers/popperOffsets.js | 25 + .../dist/esm/modifiers/preventOverflow.js | 142 + .../@popperjs/core/dist/esm/popper-base.js | 3 + .../@popperjs/core/dist/esm/popper-lite.js | 11 + .../assets/@popperjs/core/dist/esm/popper.js | 20 + .../assets/@popperjs/core/dist/esm/types.js | 0 .../dist/esm/utils/computeAutoPlacement.js | 43 + .../core/dist/esm/utils/computeOffsets.js | 70 + .../@popperjs/core/dist/esm/utils/debounce.js | 15 + .../core/dist/esm/utils/detectOverflow.js | 65 + .../core/dist/esm/utils/expandToHashMap.js | 6 + .../core/dist/esm/utils/getAltAxis.js | 3 + .../core/dist/esm/utils/getAltLen.js | 3 + .../core/dist/esm/utils/getBasePlacement.js | 4 + .../core/dist/esm/utils/getFreshSideObject.js | 8 + .../esm/utils/getMainAxisFromPlacement.js | 3 + .../dist/esm/utils/getOppositePlacement.js | 11 + .../utils/getOppositeVariationPlacement.js | 9 + .../core/dist/esm/utils/getVariation.js | 3 + .../@popperjs/core/dist/esm/utils/math.js | 3 + .../core/dist/esm/utils/mergeByName.js | 14 + .../core/dist/esm/utils/mergePaddingObject.js | 4 + .../core/dist/esm/utils/orderModifiers.js | 44 + .../core/dist/esm/utils/rectToClientRect.js | 8 + .../@popperjs/core/dist/esm/utils/uniqueBy.js | 11 + .../core/dist/esm/utils/userAgent.js | 11 + .../@popperjs/core/dist/esm/utils/within.js | 8 + .../assets/@popperjs/core/dist/umd/enums.js | 71 + .../@popperjs/core/dist/umd/enums.js.map | 1 + .../@popperjs/core/dist/umd/enums.min.js | 6 + .../@popperjs/core/dist/umd/enums.min.js.flow | 3 + .../@popperjs/core/dist/umd/enums.min.js.map | 1 + .../@popperjs/core/dist/umd/popper-base.js | 945 ++ .../core/dist/umd/popper-base.js.map | 1 + .../core/dist/umd/popper-base.min.js | 6 + .../core/dist/umd/popper-base.min.js.flow | 3 + .../core/dist/umd/popper-base.min.js.map | 1 + .../@popperjs/core/dist/umd/popper-lite.js | 1266 ++ .../core/dist/umd/popper-lite.js.map | 1 + .../core/dist/umd/popper-lite.min.js | 6 + .../core/dist/umd/popper-lite.min.js.flow | 3 + .../core/dist/umd/popper-lite.min.js.map | 1 + .../assets/@popperjs/core/dist/umd/popper.js | 1825 +++ .../@popperjs/core/dist/umd/popper.js.map | 1 + .../@popperjs/core/dist/umd/popper.min.js | 6 + .../core/dist/umd/popper.min.js.flow | 3 + .../@popperjs/core/dist/umd/popper.min.js.map | 1 + public/assets/@popperjs/core/index.d.ts | 1 + .../@popperjs/core/lib/createPopper.d.ts | 9 + .../assets/@popperjs/core/lib/createPopper.js | 199 + .../@popperjs/core/lib/createPopper.js.flow | 218 + .../core/lib/dom-utils/contains.d.ts | 1 + .../@popperjs/core/lib/dom-utils/contains.js | 23 + .../core/lib/dom-utils/contains.js.flow | 25 + .../lib/dom-utils/getBoundingClientRect.d.ts | 2 + .../lib/dom-utils/getBoundingClientRect.js | 41 + .../dom-utils/getBoundingClientRect.js.flow | 52 + .../core/lib/dom-utils/getClippingRect.d.ts | 3 + .../core/lib/dom-utils/getClippingRect.js | 70 + .../lib/dom-utils/getClippingRect.js.flow | 106 + .../core/lib/dom-utils/getCompositeRect.d.ts | 2 + .../core/lib/dom-utils/getCompositeRect.js | 58 + .../lib/dom-utils/getCompositeRect.js.flow | 64 + .../core/lib/dom-utils/getComputedStyle.d.ts | 1 + .../core/lib/dom-utils/getComputedStyle.js | 4 + .../lib/dom-utils/getComputedStyle.js.flow | 8 + .../lib/dom-utils/getDocumentElement.d.ts | 2 + .../core/lib/dom-utils/getDocumentElement.js | 6 + .../lib/dom-utils/getDocumentElement.js.flow | 15 + .../core/lib/dom-utils/getDocumentRect.d.ts | 2 + .../core/lib/dom-utils/getDocumentRect.js | 29 + .../lib/dom-utils/getDocumentRect.js.flow | 37 + .../lib/dom-utils/getHTMLElementScroll.d.ts | 4 + .../lib/dom-utils/getHTMLElementScroll.js | 6 + .../dom-utils/getHTMLElementScroll.js.flow | 8 + .../core/lib/dom-utils/getLayoutRect.d.ts | 2 + .../core/lib/dom-utils/getLayoutRect.js | 25 + .../core/lib/dom-utils/getLayoutRect.js.flow | 29 + .../core/lib/dom-utils/getNodeName.d.ts | 2 + .../core/lib/dom-utils/getNodeName.js | 3 + .../core/lib/dom-utils/getNodeName.js.flow | 6 + .../core/lib/dom-utils/getNodeScroll.d.ts | 5 + .../core/lib/dom-utils/getNodeScroll.js | 11 + .../core/lib/dom-utils/getNodeScroll.js.flow | 14 + .../core/lib/dom-utils/getOffsetParent.d.ts | 1 + .../core/lib/dom-utils/getOffsetParent.js | 69 + .../lib/dom-utils/getOffsetParent.js.flow | 93 + .../core/lib/dom-utils/getParentNode.d.ts | 1 + .../core/lib/dom-utils/getParentNode.js | 19 + .../core/lib/dom-utils/getParentNode.js.flow | 21 + .../core/lib/dom-utils/getScrollParent.d.ts | 1 + .../core/lib/dom-utils/getScrollParent.js | 16 + .../lib/dom-utils/getScrollParent.js.flow | 18 + .../core/lib/dom-utils/getViewportRect.d.ts | 7 + .../core/lib/dom-utils/getViewportRect.js | 31 + .../lib/dom-utils/getViewportRect.js.flow | 39 + .../core/lib/dom-utils/getWindow.d.ts | 1 + .../@popperjs/core/lib/dom-utils/getWindow.js | 12 + .../core/lib/dom-utils/getWindow.js.flow | 16 + .../core/lib/dom-utils/getWindowScroll.d.ts | 5 + .../core/lib/dom-utils/getWindowScroll.js | 10 + .../lib/dom-utils/getWindowScroll.js.flow | 14 + .../lib/dom-utils/getWindowScrollBarX.d.ts | 1 + .../core/lib/dom-utils/getWindowScrollBarX.js | 13 + .../lib/dom-utils/getWindowScrollBarX.js.flow | 18 + .../core/lib/dom-utils/instanceOf.d.ts | 4 + .../core/lib/dom-utils/instanceOf.js | 23 + .../core/lib/dom-utils/instanceOf.js.flow | 29 + .../core/lib/dom-utils/isLayoutViewport.d.ts | 1 + .../core/lib/dom-utils/isLayoutViewport.js | 4 + .../lib/dom-utils/isLayoutViewport.js.flow | 6 + .../core/lib/dom-utils/isScrollParent.d.ts | 1 + .../core/lib/dom-utils/isScrollParent.js | 10 + .../core/lib/dom-utils/isScrollParent.js.flow | 8 + .../core/lib/dom-utils/isTableElement.d.ts | 1 + .../core/lib/dom-utils/isTableElement.js | 4 + .../core/lib/dom-utils/isTableElement.js.flow | 6 + .../core/lib/dom-utils/listScrollParents.d.ts | 2 + .../core/lib/dom-utils/listScrollParents.js | 26 + .../lib/dom-utils/listScrollParents.js.flow | 33 + public/assets/@popperjs/core/lib/enums.d.ts | 34 + public/assets/@popperjs/core/lib/enums.js | 31 + .../assets/@popperjs/core/lib/enums.js.flow | 91 + public/assets/@popperjs/core/lib/index.d.ts | 6 + public/assets/@popperjs/core/lib/index.js | 8 + .../assets/@popperjs/core/lib/index.js.flow | 13 + .../core/lib/modifiers/applyStyles.d.ts | 4 + .../core/lib/modifiers/applyStyles.js | 84 + .../core/lib/modifiers/applyStyles.js.flow | 98 + .../@popperjs/core/lib/modifiers/arrow.d.ts | 13 + .../@popperjs/core/lib/modifiers/arrow.js | 90 + .../core/lib/modifiers/arrow.js.flow | 120 + .../core/lib/modifiers/computeStyles.d.ts | 38 + .../core/lib/modifiers/computeStyles.js | 169 + .../core/lib/modifiers/computeStyles.js.flow | 233 + .../core/lib/modifiers/eventListeners.d.ts | 8 + .../core/lib/modifiers/eventListeners.js | 49 + .../core/lib/modifiers/eventListeners.js.flow | 54 + .../@popperjs/core/lib/modifiers/flip.d.ts | 16 + .../@popperjs/core/lib/modifiers/flip.js | 147 + .../@popperjs/core/lib/modifiers/flip.js.flow | 177 + .../@popperjs/core/lib/modifiers/hide.d.ts | 4 + .../@popperjs/core/lib/modifiers/hide.js | 61 + .../@popperjs/core/lib/modifiers/hide.js.flow | 76 + .../@popperjs/core/lib/modifiers/index.d.ts | 9 + .../@popperjs/core/lib/modifiers/index.js | 9 + .../core/lib/modifiers/index.js.flow | 10 + .../@popperjs/core/lib/modifiers/offset.d.ts | 18 + .../@popperjs/core/lib/modifiers/offset.js | 54 + .../core/lib/modifiers/offset.js.flow | 71 + .../core/lib/modifiers/popperOffsets.d.ts | 4 + .../core/lib/modifiers/popperOffsets.js | 25 + .../core/lib/modifiers/popperOffsets.js.flow | 26 + .../core/lib/modifiers/preventOverflow.d.ts | 30 + .../core/lib/modifiers/preventOverflow.js | 142 + .../lib/modifiers/preventOverflow.js.flow | 220 + .../@popperjs/core/lib/popper-base.d.ts | 3 + .../assets/@popperjs/core/lib/popper-base.js | 3 + .../@popperjs/core/lib/popper-base.js.flow | 7 + .../@popperjs/core/lib/popper-lite.d.ts | 5 + .../assets/@popperjs/core/lib/popper-lite.js | 11 + .../@popperjs/core/lib/popper-lite.js.flow | 21 + public/assets/@popperjs/core/lib/popper.d.ts | 7 + public/assets/@popperjs/core/lib/popper.js | 20 + .../assets/@popperjs/core/lib/popper.js.flow | 35 + public/assets/@popperjs/core/lib/types.d.ts | 167 + public/assets/@popperjs/core/lib/types.js | 0 .../assets/@popperjs/core/lib/types.js.flow | 199 + .../core/lib/utils/computeAutoPlacement.d.ts | 12 + .../core/lib/utils/computeAutoPlacement.js | 43 + .../lib/utils/computeAutoPlacement.js.flow | 73 + .../core/lib/utils/computeOffsets.d.ts | 8 + .../core/lib/utils/computeOffsets.js | 70 + .../core/lib/utils/computeOffsets.js.flow | 82 + .../@popperjs/core/lib/utils/debounce.d.ts | 1 + .../@popperjs/core/lib/utils/debounce.js | 15 + .../@popperjs/core/lib/utils/debounce.js.flow | 17 + .../core/lib/utils/detectOverflow.d.ts | 12 + .../core/lib/utils/detectOverflow.js | 65 + .../core/lib/utils/detectOverflow.js.flow | 112 + .../core/lib/utils/expandToHashMap.d.ts | 3 + .../core/lib/utils/expandToHashMap.js | 6 + .../core/lib/utils/expandToHashMap.js.flow | 11 + .../@popperjs/core/lib/utils/getAltAxis.d.ts | 1 + .../@popperjs/core/lib/utils/getAltAxis.js | 3 + .../core/lib/utils/getAltAxis.js.flow | 5 + .../@popperjs/core/lib/utils/getAltLen.d.ts | 1 + .../@popperjs/core/lib/utils/getAltLen.js | 3 + .../core/lib/utils/getAltLen.js.flow | 5 + .../core/lib/utils/getBasePlacement.d.ts | 2 + .../core/lib/utils/getBasePlacement.js | 4 + .../core/lib/utils/getBasePlacement.js.flow | 8 + .../core/lib/utils/getFreshSideObject.d.ts | 2 + .../core/lib/utils/getFreshSideObject.js | 8 + .../core/lib/utils/getFreshSideObject.js.flow | 11 + .../lib/utils/getMainAxisFromPlacement.d.ts | 2 + .../lib/utils/getMainAxisFromPlacement.js | 3 + .../utils/getMainAxisFromPlacement.js.flow | 8 + .../core/lib/utils/getOppositePlacement.d.ts | 2 + .../core/lib/utils/getOppositePlacement.js | 11 + .../lib/utils/getOppositePlacement.js.flow | 11 + .../utils/getOppositeVariationPlacement.d.ts | 2 + .../utils/getOppositeVariationPlacement.js | 9 + .../getOppositeVariationPlacement.js.flow | 10 + .../core/lib/utils/getVariation.d.ts | 2 + .../@popperjs/core/lib/utils/getVariation.js | 3 + .../core/lib/utils/getVariation.js.flow | 6 + .../assets/@popperjs/core/lib/utils/math.d.ts | 3 + .../assets/@popperjs/core/lib/utils/math.js | 3 + .../@popperjs/core/lib/utils/math.js.flow | 4 + .../@popperjs/core/lib/utils/mergeByName.d.ts | 2 + .../@popperjs/core/lib/utils/mergeByName.js | 14 + .../core/lib/utils/mergeByName.js.flow | 22 + .../core/lib/utils/mergePaddingObject.d.ts | 2 + .../core/lib/utils/mergePaddingObject.js | 4 + .../core/lib/utils/mergePaddingObject.js.flow | 12 + .../core/lib/utils/orderModifiers.d.ts | 2 + .../core/lib/utils/orderModifiers.js | 44 + .../core/lib/utils/orderModifiers.js.flow | 59 + .../core/lib/utils/rectToClientRect.d.ts | 2 + .../core/lib/utils/rectToClientRect.js | 8 + .../core/lib/utils/rectToClientRect.js.flow | 12 + .../@popperjs/core/lib/utils/uniqueBy.d.ts | 1 + .../@popperjs/core/lib/utils/uniqueBy.js | 11 + .../@popperjs/core/lib/utils/uniqueBy.js.flow | 14 + .../@popperjs/core/lib/utils/userAgent.d.ts | 1 + .../@popperjs/core/lib/utils/userAgent.js | 11 + .../core/lib/utils/userAgent.js.flow | 20 + .../@popperjs/core/lib/utils/within.d.ts | 2 + .../assets/@popperjs/core/lib/utils/within.js | 8 + .../@popperjs/core/lib/utils/within.js.flow | 11 + public/assets/@popperjs/core/package.json | 119 + public/assets/@vue/reactivity/LICENSE | 21 + public/assets/@vue/reactivity/README.md | 19 + .../@vue/reactivity/dist/reactivity.cjs.js | 932 ++ .../reactivity/dist/reactivity.cjs.prod.js | 873 ++ .../@vue/reactivity/dist/reactivity.d.ts | 323 + .../reactivity/dist/reactivity.esm-browser.js | 959 ++ .../dist/reactivity.esm-browser.prod.js | 1 + .../reactivity/dist/reactivity.esm-bundler.js | 904 ++ .../@vue/reactivity/dist/reactivity.global.js | 994 ++ .../reactivity/dist/reactivity.global.prod.js | 1 + public/assets/@vue/reactivity/index.js | 7 + public/assets/@vue/reactivity/package.json | 41 + public/assets/@vue/shared/LICENSE | 21 + public/assets/@vue/shared/README.md | 3 + public/assets/@vue/shared/dist/shared.cjs.js | 568 + .../@vue/shared/dist/shared.cjs.prod.js | 567 + public/assets/@vue/shared/dist/shared.d.ts | 325 + .../@vue/shared/dist/shared.esm-bundler.js | 509 + public/assets/@vue/shared/index.js | 7 + public/assets/@vue/shared/package.json | 32 + public/assets/alpinejs/builds/cdn.js | 7 + public/assets/alpinejs/builds/module.js | 5 + public/assets/alpinejs/dist/cdn.js | 3529 +++++ public/assets/alpinejs/dist/cdn.min.js | 5 + public/assets/alpinejs/dist/module.cjs.js | 4239 ++++++ public/assets/alpinejs/dist/module.esm.js | 3528 +++++ public/assets/alpinejs/dist/module.esm.min.js | 5 + public/assets/alpinejs/package.json | 19 + public/assets/alpinejs/src/alpine.js | 89 + public/assets/alpinejs/src/binds.js | 67 + public/assets/alpinejs/src/clone.js | 89 + public/assets/alpinejs/src/datas.js | 22 + public/assets/alpinejs/src/directives.js | 229 + .../assets/alpinejs/src/directives/index.js | 31 + .../assets/alpinejs/src/directives/x-bind.js | 60 + .../assets/alpinejs/src/directives/x-cloak.js | 4 + .../assets/alpinejs/src/directives/x-data.js | 67 + .../alpinejs/src/directives/x-effect.js | 7 + .../assets/alpinejs/src/directives/x-for.js | 296 + .../assets/alpinejs/src/directives/x-html.js | 19 + public/assets/alpinejs/src/directives/x-id.js | 19 + public/assets/alpinejs/src/directives/x-if.js | 56 + .../alpinejs/src/directives/x-ignore.js | 17 + .../assets/alpinejs/src/directives/x-init.js | 13 + .../assets/alpinejs/src/directives/x-model.js | 259 + .../alpinejs/src/directives/x-modelable.js | 39 + public/assets/alpinejs/src/directives/x-on.js | 22 + .../assets/alpinejs/src/directives/x-ref.js | 16 + .../assets/alpinejs/src/directives/x-show.js | 68 + .../alpinejs/src/directives/x-teleport.js | 85 + .../assets/alpinejs/src/directives/x-text.js | 14 + .../alpinejs/src/directives/x-transition.js | 335 + public/assets/alpinejs/src/entangle.js | 41 + public/assets/alpinejs/src/evaluator.js | 229 + public/assets/alpinejs/src/ids.js | 20 + public/assets/alpinejs/src/index.js | 75 + public/assets/alpinejs/src/interceptor.js | 78 + public/assets/alpinejs/src/lifecycle.js | 142 + public/assets/alpinejs/src/magics.js | 34 + public/assets/alpinejs/src/magics/$data.js | 4 + .../assets/alpinejs/src/magics/$dispatch.js | 4 + public/assets/alpinejs/src/magics/$el.js | 3 + public/assets/alpinejs/src/magics/$id.js | 46 + .../assets/alpinejs/src/magics/$nextTick.js | 4 + public/assets/alpinejs/src/magics/$refs.js | 21 + public/assets/alpinejs/src/magics/$root.js | 4 + public/assets/alpinejs/src/magics/$store.js | 4 + public/assets/alpinejs/src/magics/$watch.js | 18 + public/assets/alpinejs/src/magics/index.js | 20 + public/assets/alpinejs/src/mutation.js | 220 + public/assets/alpinejs/src/nextTick.js | 29 + public/assets/alpinejs/src/plugin.js | 7 + public/assets/alpinejs/src/reactivity.js | 108 + public/assets/alpinejs/src/scheduler.js | 53 + public/assets/alpinejs/src/scope.js | 89 + public/assets/alpinejs/src/store.js | 23 + public/assets/alpinejs/src/utils/bind.js | 235 + public/assets/alpinejs/src/utils/classes.js | 58 + public/assets/alpinejs/src/utils/debounce.js | 18 + public/assets/alpinejs/src/utils/dispatch.js | 12 + public/assets/alpinejs/src/utils/error.js | 27 + public/assets/alpinejs/src/utils/on.js | 206 + public/assets/alpinejs/src/utils/once.js | 14 + public/assets/alpinejs/src/utils/styles.js | 50 + public/assets/alpinejs/src/utils/throttle.js | 16 + public/assets/alpinejs/src/utils/walk.js | 21 + public/assets/alpinejs/src/utils/warn.js | 4 + public/assets/bootstrap/LICENSE | 21 + public/assets/bootstrap/README.md | 246 + .../bootstrap/dist/css/bootstrap-grid.css | 4085 ++++++ .../bootstrap/dist/css/bootstrap-grid.css.map | 1 + .../bootstrap/dist/css/bootstrap-grid.min.css | 6 + .../dist/css/bootstrap-grid.min.css.map | 1 + .../bootstrap/dist/css/bootstrap-grid.rtl.css | 4084 ++++++ .../dist/css/bootstrap-grid.rtl.css.map | 1 + .../dist/css/bootstrap-grid.rtl.min.css | 6 + .../dist/css/bootstrap-grid.rtl.min.css.map | 1 + .../bootstrap/dist/css/bootstrap-reboot.css | 601 + .../dist/css/bootstrap-reboot.css.map | 1 + .../dist/css/bootstrap-reboot.min.css | 6 + .../dist/css/bootstrap-reboot.min.css.map | 1 + .../dist/css/bootstrap-reboot.rtl.css | 598 + .../dist/css/bootstrap-reboot.rtl.css.map | 1 + .../dist/css/bootstrap-reboot.rtl.min.css | 6 + .../dist/css/bootstrap-reboot.rtl.min.css.map | 1 + .../dist/css/bootstrap-utilities.css | 5406 +++++++ .../dist/css/bootstrap-utilities.css.map | 1 + .../dist/css/bootstrap-utilities.min.css | 6 + .../dist/css/bootstrap-utilities.min.css.map | 1 + .../dist/css/bootstrap-utilities.rtl.css | 5397 +++++++ .../dist/css/bootstrap-utilities.rtl.css.map | 1 + .../dist/css/bootstrap-utilities.rtl.min.css | 6 + .../css/bootstrap-utilities.rtl.min.css.map | 1 + .../assets/bootstrap/dist/css/bootstrap.css | 12048 ++++++++++++++++ .../bootstrap/dist/css/bootstrap.css.map | 1 + .../bootstrap/dist/css/bootstrap.min.css | 6 + .../bootstrap/dist/css/bootstrap.min.css.map | 1 + .../bootstrap/dist/css/bootstrap.rtl.css | 12021 +++++++++++++++ .../bootstrap/dist/css/bootstrap.rtl.css.map | 1 + .../bootstrap/dist/css/bootstrap.rtl.min.css | 6 + .../dist/css/bootstrap.rtl.min.css.map | 1 + .../bootstrap/dist/js/bootstrap.bundle.js | 6312 ++++++++ .../bootstrap/dist/js/bootstrap.bundle.js.map | 1 + .../bootstrap/dist/js/bootstrap.bundle.min.js | 7 + .../dist/js/bootstrap.bundle.min.js.map | 1 + .../assets/bootstrap/dist/js/bootstrap.esm.js | 4447 ++++++ .../bootstrap/dist/js/bootstrap.esm.js.map | 1 + .../bootstrap/dist/js/bootstrap.esm.min.js | 7 + .../dist/js/bootstrap.esm.min.js.map | 1 + public/assets/bootstrap/dist/js/bootstrap.js | 4494 ++++++ .../assets/bootstrap/dist/js/bootstrap.js.map | 1 + .../assets/bootstrap/dist/js/bootstrap.min.js | 7 + .../bootstrap/dist/js/bootstrap.min.js.map | 1 + public/assets/bootstrap/js/dist/alert.js | 90 + public/assets/bootstrap/js/dist/alert.js.map | 1 + .../bootstrap/js/dist/base-component.js | 86 + .../bootstrap/js/dist/base-component.js.map | 1 + public/assets/bootstrap/js/dist/button.js | 79 + public/assets/bootstrap/js/dist/button.js.map | 1 + public/assets/bootstrap/js/dist/carousel.js | 388 + .../assets/bootstrap/js/dist/carousel.js.map | 1 + public/assets/bootstrap/js/dist/collapse.js | 249 + .../assets/bootstrap/js/dist/collapse.js.map | 1 + public/assets/bootstrap/js/dist/dom/data.js | 63 + .../assets/bootstrap/js/dist/dom/data.js.map | 1 + .../bootstrap/js/dist/dom/event-handler.js | 237 + .../js/dist/dom/event-handler.js.map | 1 + .../bootstrap/js/dist/dom/manipulator.js | 72 + .../bootstrap/js/dist/dom/manipulator.js.map | 1 + .../bootstrap/js/dist/dom/selector-engine.js | 104 + .../js/dist/dom/selector-engine.js.map | 1 + public/assets/bootstrap/js/dist/dropdown.js | 402 + .../assets/bootstrap/js/dist/dropdown.js.map | 1 + public/assets/bootstrap/js/dist/modal.js | 320 + public/assets/bootstrap/js/dist/modal.js.map | 1 + public/assets/bootstrap/js/dist/offcanvas.js | 246 + .../assets/bootstrap/js/dist/offcanvas.js.map | 1 + public/assets/bootstrap/js/dist/popover.js | 96 + .../assets/bootstrap/js/dist/popover.js.map | 1 + public/assets/bootstrap/js/dist/scrollspy.js | 275 + .../assets/bootstrap/js/dist/scrollspy.js.map | 1 + public/assets/bootstrap/js/dist/tab.js | 285 + public/assets/bootstrap/js/dist/tab.js.map | 1 + public/assets/bootstrap/js/dist/toast.js | 198 + public/assets/bootstrap/js/dist/toast.js.map | 1 + public/assets/bootstrap/js/dist/tooltip.js | 546 + .../assets/bootstrap/js/dist/tooltip.js.map | 1 + .../assets/bootstrap/js/dist/util/backdrop.js | 139 + .../bootstrap/js/dist/util/backdrop.js.map | 1 + .../js/dist/util/component-functions.js | 42 + .../js/dist/util/component-functions.js.map | 1 + .../assets/bootstrap/js/dist/util/config.js | 68 + .../bootstrap/js/dist/util/config.js.map | 1 + .../bootstrap/js/dist/util/focustrap.js | 113 + .../bootstrap/js/dist/util/focustrap.js.map | 1 + public/assets/bootstrap/js/dist/util/index.js | 281 + .../bootstrap/js/dist/util/index.js.map | 1 + .../bootstrap/js/dist/util/sanitizer.js | 113 + .../bootstrap/js/dist/util/sanitizer.js.map | 1 + .../bootstrap/js/dist/util/scrollbar.js | 113 + .../bootstrap/js/dist/util/scrollbar.js.map | 1 + public/assets/bootstrap/js/dist/util/swipe.js | 135 + .../bootstrap/js/dist/util/swipe.js.map | 1 + .../js/dist/util/template-factory.js | 151 + .../js/dist/util/template-factory.js.map | 1 + public/assets/bootstrap/js/index.esm.js | 19 + public/assets/bootstrap/js/index.umd.js | 34 + public/assets/bootstrap/js/src/alert.js | 87 + .../assets/bootstrap/js/src/base-component.js | 86 + public/assets/bootstrap/js/src/button.js | 72 + public/assets/bootstrap/js/src/carousel.js | 474 + public/assets/bootstrap/js/src/collapse.js | 297 + public/assets/bootstrap/js/src/dom/data.js | 55 + .../bootstrap/js/src/dom/event-handler.js | 317 + .../bootstrap/js/src/dom/manipulator.js | 71 + .../bootstrap/js/src/dom/selector-engine.js | 126 + public/assets/bootstrap/js/src/dropdown.js | 455 + public/assets/bootstrap/js/src/modal.js | 378 + public/assets/bootstrap/js/src/offcanvas.js | 282 + public/assets/bootstrap/js/src/popover.js | 97 + public/assets/bootstrap/js/src/scrollspy.js | 296 + public/assets/bootstrap/js/src/tab.js | 315 + public/assets/bootstrap/js/src/toast.js | 224 + public/assets/bootstrap/js/src/tooltip.js | 633 + .../assets/bootstrap/js/src/util/backdrop.js | 151 + .../js/src/util/component-functions.js | 35 + public/assets/bootstrap/js/src/util/config.js | 65 + .../assets/bootstrap/js/src/util/focustrap.js | 115 + public/assets/bootstrap/js/src/util/index.js | 306 + .../assets/bootstrap/js/src/util/sanitizer.js | 116 + .../assets/bootstrap/js/src/util/scrollbar.js | 114 + public/assets/bootstrap/js/src/util/swipe.js | 146 + .../bootstrap/js/src/util/template-factory.js | 160 + public/assets/bootstrap/package.json | 210 + public/assets/bootstrap/scss/_accordion.scss | 153 + public/assets/bootstrap/scss/_alert.scss | 68 + public/assets/bootstrap/scss/_badge.scss | 38 + public/assets/bootstrap/scss/_breadcrumb.scss | 40 + .../assets/bootstrap/scss/_button-group.scss | 147 + public/assets/bootstrap/scss/_buttons.scss | 216 + public/assets/bootstrap/scss/_card.scss | 238 + public/assets/bootstrap/scss/_carousel.scss | 226 + public/assets/bootstrap/scss/_close.scss | 66 + public/assets/bootstrap/scss/_containers.scss | 41 + public/assets/bootstrap/scss/_dropdown.scss | 250 + public/assets/bootstrap/scss/_forms.scss | 9 + public/assets/bootstrap/scss/_functions.scss | 302 + public/assets/bootstrap/scss/_grid.scss | 39 + public/assets/bootstrap/scss/_helpers.scss | 12 + public/assets/bootstrap/scss/_images.scss | 42 + public/assets/bootstrap/scss/_list-group.scss | 199 + public/assets/bootstrap/scss/_maps.scss | 174 + public/assets/bootstrap/scss/_mixins.scss | 42 + public/assets/bootstrap/scss/_modal.scss | 240 + public/assets/bootstrap/scss/_nav.scss | 197 + public/assets/bootstrap/scss/_navbar.scss | 289 + public/assets/bootstrap/scss/_offcanvas.scss | 147 + public/assets/bootstrap/scss/_pagination.scss | 109 + .../assets/bootstrap/scss/_placeholders.scss | 51 + public/assets/bootstrap/scss/_popover.scss | 196 + public/assets/bootstrap/scss/_progress.scss | 68 + public/assets/bootstrap/scss/_reboot.scss | 617 + public/assets/bootstrap/scss/_root.scss | 187 + public/assets/bootstrap/scss/_spinners.scss | 86 + public/assets/bootstrap/scss/_tables.scss | 171 + public/assets/bootstrap/scss/_toasts.scss | 73 + public/assets/bootstrap/scss/_tooltip.scss | 119 + .../assets/bootstrap/scss/_transitions.scss | 27 + public/assets/bootstrap/scss/_type.scss | 106 + public/assets/bootstrap/scss/_utilities.scss | 806 ++ .../bootstrap/scss/_variables-dark.scss | 102 + public/assets/bootstrap/scss/_variables.scss | 1753 +++ .../assets/bootstrap/scss/bootstrap-grid.scss | 62 + .../bootstrap/scss/bootstrap-reboot.scss | 10 + .../bootstrap/scss/bootstrap-utilities.scss | 19 + public/assets/bootstrap/scss/bootstrap.scss | 52 + .../scss/forms/_floating-labels.scss | 97 + .../bootstrap/scss/forms/_form-check.scss | 189 + .../bootstrap/scss/forms/_form-control.scss | 214 + .../bootstrap/scss/forms/_form-range.scss | 91 + .../bootstrap/scss/forms/_form-select.scss | 80 + .../bootstrap/scss/forms/_form-text.scss | 11 + .../bootstrap/scss/forms/_input-group.scss | 132 + .../assets/bootstrap/scss/forms/_labels.scss | 36 + .../bootstrap/scss/forms/_validation.scss | 12 + .../bootstrap/scss/helpers/_clearfix.scss | 3 + .../bootstrap/scss/helpers/_color-bg.scss | 7 + .../scss/helpers/_colored-links.scss | 30 + .../bootstrap/scss/helpers/_focus-ring.scss | 5 + .../bootstrap/scss/helpers/_icon-link.scss | 25 + .../bootstrap/scss/helpers/_position.scss | 36 + .../assets/bootstrap/scss/helpers/_ratio.scss | 26 + .../bootstrap/scss/helpers/_stacks.scss | 15 + .../scss/helpers/_stretched-link.scss | 15 + .../scss/helpers/_text-truncation.scss | 7 + .../scss/helpers/_visually-hidden.scss | 8 + public/assets/bootstrap/scss/helpers/_vr.scss | 8 + .../assets/bootstrap/scss/mixins/_alert.scss | 18 + .../bootstrap/scss/mixins/_backdrop.scss | 14 + .../assets/bootstrap/scss/mixins/_banner.scss | 7 + .../bootstrap/scss/mixins/_border-radius.scss | 78 + .../bootstrap/scss/mixins/_box-shadow.scss | 24 + .../bootstrap/scss/mixins/_breakpoints.scss | 127 + .../bootstrap/scss/mixins/_buttons.scss | 70 + .../assets/bootstrap/scss/mixins/_caret.scss | 69 + .../bootstrap/scss/mixins/_clearfix.scss | 9 + .../bootstrap/scss/mixins/_color-mode.scss | 21 + .../bootstrap/scss/mixins/_color-scheme.scss | 7 + .../bootstrap/scss/mixins/_container.scss | 11 + .../bootstrap/scss/mixins/_deprecate.scss | 10 + .../assets/bootstrap/scss/mixins/_forms.scss | 163 + .../bootstrap/scss/mixins/_gradients.scss | 47 + .../assets/bootstrap/scss/mixins/_grid.scss | 151 + .../assets/bootstrap/scss/mixins/_image.scss | 16 + .../bootstrap/scss/mixins/_list-group.scss | 26 + .../assets/bootstrap/scss/mixins/_lists.scss | 7 + .../bootstrap/scss/mixins/_pagination.scss | 10 + .../bootstrap/scss/mixins/_reset-text.scss | 17 + .../assets/bootstrap/scss/mixins/_resize.scss | 6 + .../scss/mixins/_table-variants.scss | 24 + .../bootstrap/scss/mixins/_text-truncate.scss | 8 + .../bootstrap/scss/mixins/_transition.scss | 26 + .../bootstrap/scss/mixins/_utilities.scss | 97 + .../scss/mixins/_visually-hidden.scss | 38 + .../assets/bootstrap/scss/utilities/_api.scss | 47 + public/assets/bootstrap/scss/vendor/_rfs.scss | 348 + public/assets/eventemitter3/LICENSE | 21 + public/assets/eventemitter3/README.md | 85 + .../eventemitter3/dist/eventemitter3.esm.js | 355 + .../dist/eventemitter3.esm.min.js | 1 + .../dist/eventemitter3.esm.min.js.map | 1 + .../eventemitter3/dist/eventemitter3.umd.js | 363 + .../dist/eventemitter3.umd.min.js | 1 + .../dist/eventemitter3.umd.min.js.map | 1 + public/assets/eventemitter3/index.d.ts | 135 + public/assets/eventemitter3/index.js | 336 + public/assets/eventemitter3/index.mjs | 4 + public/assets/eventemitter3/package.json | 62 + public/assets/htmx/README.md | 79 + public/assets/htmx/TODO.md | 27 + public/assets/htmx/cli.js | 93 + public/assets/htmx/htmx.js | 1 + public/assets/htmx/package.json | 32 + public/assets/htmx/preprocess.js | 8 + public/assets/htmx/watch.js | 0 public/assets/jquery/AUTHORS.txt | 376 + public/assets/jquery/LICENSE.txt | 20 + public/assets/jquery/README.md | 183 + public/assets/jquery/bower.json | 14 + public/assets/jquery/changelog.md | 7 + .../dist-module/jquery.factory.module.js | 9675 +++++++++++++ .../dist-module/jquery.factory.slim.module.js | 6851 +++++++++ .../jquery/dist-module/jquery.module.js | 9672 +++++++++++++ .../jquery/dist-module/jquery.module.min.js | 5 + .../jquery/dist-module/jquery.module.min.map | 1 + .../jquery/dist-module/jquery.slim.module.js | 6848 +++++++++ .../dist-module/jquery.slim.module.min.js | 5 + .../dist-module/jquery.slim.module.min.map | 1 + public/assets/jquery/dist-module/package.json | 3 + .../wrappers/jquery.node-module-wrapper.js | 5 + .../jquery.node-module-wrapper.slim.js | 5 + public/assets/jquery/dist/jquery.factory.js | 9680 +++++++++++++ .../assets/jquery/dist/jquery.factory.slim.js | 6856 +++++++++ public/assets/jquery/dist/jquery.js | 9680 +++++++++++++ public/assets/jquery/dist/jquery.min.js | 2 + public/assets/jquery/dist/jquery.min.map | 1 + public/assets/jquery/dist/jquery.slim.js | 6856 +++++++++ public/assets/jquery/dist/jquery.slim.min.js | 2 + public/assets/jquery/dist/jquery.slim.min.map | 1 + public/assets/jquery/dist/package.json | 3 + .../jquery.bundler-require-wrapper.js | 5 + .../jquery.bundler-require-wrapper.slim.js | 5 + public/assets/jquery/package.json | 66 + public/assets/jquery/src/ajax.js | 877 ++ public/assets/jquery/src/ajax/binary.js | 21 + public/assets/jquery/src/ajax/jsonp.js | 93 + public/assets/jquery/src/ajax/load.js | 71 + public/assets/jquery/src/ajax/script.js | 85 + public/assets/jquery/src/ajax/var/location.js | 1 + public/assets/jquery/src/ajax/var/nonce.js | 1 + public/assets/jquery/src/ajax/var/rquery.js | 1 + public/assets/jquery/src/ajax/xhr.js | 114 + public/assets/jquery/src/attributes.js | 9 + public/assets/jquery/src/attributes/attr.js | 105 + .../assets/jquery/src/attributes/classes.js | 156 + public/assets/jquery/src/attributes/prop.js | 134 + public/assets/jquery/src/attributes/val.js | 169 + public/assets/jquery/src/callbacks.js | 230 + public/assets/jquery/src/core.js | 419 + public/assets/jquery/src/core/DOMEval.js | 26 + public/assets/jquery/src/core/access.js | 63 + public/assets/jquery/src/core/camelCase.js | 12 + public/assets/jquery/src/core/init.js | 122 + public/assets/jquery/src/core/isArrayLike.js | 15 + public/assets/jquery/src/core/isAttached.js | 19 + .../assets/jquery/src/core/isObviousHtml.js | 5 + public/assets/jquery/src/core/nodeName.js | 3 + public/assets/jquery/src/core/parseHTML.js | 44 + public/assets/jquery/src/core/parseXML.js | 27 + .../jquery/src/core/ready-no-deferred.js | 87 + public/assets/jquery/src/core/ready.js | 78 + .../assets/jquery/src/core/readyException.js | 7 + .../jquery/src/core/stripAndCollapse.js | 8 + public/assets/jquery/src/core/toType.js | 12 + .../assets/jquery/src/core/var/rsingleTag.js | 3 + public/assets/jquery/src/css.js | 404 + public/assets/jquery/src/css/adjustCSS.js | 68 + public/assets/jquery/src/css/cssCamelCase.js | 12 + public/assets/jquery/src/css/curCSS.js | 62 + public/assets/jquery/src/css/finalPropName.js | 27 + .../jquery/src/css/hiddenVisibleSelectors.js | 10 + public/assets/jquery/src/css/isAutoPx.js | 33 + public/assets/jquery/src/css/showHide.js | 98 + public/assets/jquery/src/css/support.js | 96 + public/assets/jquery/src/css/var/cssExpand.js | 1 + public/assets/jquery/src/css/var/getStyles.js | 15 + .../jquery/src/css/var/isHiddenWithinTree.js | 20 + .../assets/jquery/src/css/var/rcustomProp.js | 1 + public/assets/jquery/src/css/var/rnumnonpx.js | 3 + public/assets/jquery/src/css/var/swap.js | 20 + public/assets/jquery/src/data.js | 175 + public/assets/jquery/src/data/Data.js | 155 + .../assets/jquery/src/data/var/acceptData.js | 13 + public/assets/jquery/src/data/var/dataPriv.js | 3 + public/assets/jquery/src/data/var/dataUser.js | 3 + public/assets/jquery/src/deferred.js | 392 + .../jquery/src/deferred/exceptionHook.js | 21 + public/assets/jquery/src/deprecated.js | 48 + .../jquery/src/deprecated/ajax-event-alias.js | 17 + public/assets/jquery/src/deprecated/event.js | 46 + public/assets/jquery/src/dimensions.js | 56 + public/assets/jquery/src/effects.js | 687 + public/assets/jquery/src/effects/Tween.js | 110 + .../jquery/src/effects/animatedSelector.js | 10 + public/assets/jquery/src/event.js | 880 ++ public/assets/jquery/src/event/trigger.js | 192 + public/assets/jquery/src/exports/amd.js | 20 + public/assets/jquery/src/exports/global.js | 28 + public/assets/jquery/src/jquery.js | 38 + public/assets/jquery/src/manipulation.js | 335 + .../jquery/src/manipulation/_evalUrl.js | 25 + .../jquery/src/manipulation/buildFragment.js | 97 + .../jquery/src/manipulation/domManip.js | 107 + .../assets/jquery/src/manipulation/getAll.js | 28 + .../jquery/src/manipulation/setGlobalEval.js | 15 + .../src/manipulation/var/rscriptType.js | 1 + .../jquery/src/manipulation/var/rtagName.js | 4 + .../assets/jquery/src/manipulation/wrapMap.js | 15 + public/assets/jquery/src/offset.js | 201 + public/assets/jquery/src/queue.js | 141 + public/assets/jquery/src/queue/delay.js | 17 + public/assets/jquery/src/selector-native.js | 147 + public/assets/jquery/src/selector.js | 1376 ++ .../assets/jquery/src/selector/createCache.js | 24 + .../jquery/src/selector/escapeSelector.js | 25 + .../jquery/src/selector/filterMatchExpr.js | 16 + .../assets/jquery/src/selector/preFilter.js | 88 + .../assets/jquery/src/selector/rbuggyQSA.js | 17 + .../jquery/src/selector/selectorError.js | 5 + .../assets/jquery/src/selector/testContext.js | 8 + .../assets/jquery/src/selector/toSelector.js | 9 + public/assets/jquery/src/selector/tokenize.js | 81 + .../jquery/src/selector/unescapeSelector.js | 27 + .../assets/jquery/src/selector/uniqueSort.js | 94 + .../jquery/src/selector/var/attributes.js | 12 + .../jquery/src/selector/var/identifier.js | 5 + .../assets/jquery/src/selector/var/matches.js | 5 + .../assets/jquery/src/selector/var/pseudos.js | 15 + .../assets/jquery/src/selector/var/rcomma.js | 3 + .../jquery/src/selector/var/rdescend.js | 3 + .../src/selector/var/rleadingCombinator.js | 4 + .../assets/jquery/src/selector/var/rpseudo.js | 3 + .../jquery/src/selector/var/rsibling.js | 1 + public/assets/jquery/src/serialize.js | 129 + public/assets/jquery/src/traversing.js | 193 + .../jquery/src/traversing/findFilter.js | 91 + .../assets/jquery/src/traversing/var/dir.js | 16 + .../src/traversing/var/rneedsContext.js | 5 + .../jquery/src/traversing/var/siblings.js | 11 + .../jquery/src/var/ObjectFunctionString.js | 3 + public/assets/jquery/src/var/arr.js | 1 + public/assets/jquery/src/var/class2type.js | 2 + public/assets/jquery/src/var/document.js | 1 + .../assets/jquery/src/var/documentElement.js | 3 + public/assets/jquery/src/var/flat.js | 9 + public/assets/jquery/src/var/fnToString.js | 3 + public/assets/jquery/src/var/getProto.js | 1 + public/assets/jquery/src/var/hasOwn.js | 3 + public/assets/jquery/src/var/indexOf.js | 3 + public/assets/jquery/src/var/isIE.js | 3 + public/assets/jquery/src/var/isWindow.js | 3 + public/assets/jquery/src/var/pnum.js | 1 + public/assets/jquery/src/var/pop.js | 3 + public/assets/jquery/src/var/push.js | 3 + .../assets/jquery/src/var/rcheckableType.js | 1 + public/assets/jquery/src/var/rcssNum.js | 3 + public/assets/jquery/src/var/rnothtmlwhite.js | 4 + public/assets/jquery/src/var/rtrimCSS.js | 6 + public/assets/jquery/src/var/slice.js | 3 + public/assets/jquery/src/var/sort.js | 3 + public/assets/jquery/src/var/splice.js | 3 + public/assets/jquery/src/var/support.js | 2 + public/assets/jquery/src/var/toString.js | 3 + public/assets/jquery/src/var/whitespace.js | 2 + public/assets/jquery/src/wrap.js | 73 + public/assets/jquery/src/wrapper-esm.js | 30 + .../assets/jquery/src/wrapper-factory-esm.js | 33 + public/assets/jquery/src/wrapper-factory.js | 38 + public/assets/lodash-es/LICENSE | 47 + public/assets/lodash-es/README.md | 10 + public/assets/lodash-es/_DataView.js | 7 + public/assets/lodash-es/_Hash.js | 32 + public/assets/lodash-es/_LazyWrapper.js | 28 + public/assets/lodash-es/_ListCache.js | 32 + public/assets/lodash-es/_LodashWrapper.js | 22 + public/assets/lodash-es/_Map.js | 7 + public/assets/lodash-es/_MapCache.js | 32 + public/assets/lodash-es/_Promise.js | 7 + public/assets/lodash-es/_Set.js | 7 + public/assets/lodash-es/_SetCache.js | 27 + public/assets/lodash-es/_Stack.js | 27 + public/assets/lodash-es/_Symbol.js | 6 + public/assets/lodash-es/_Uint8Array.js | 6 + public/assets/lodash-es/_WeakMap.js | 7 + public/assets/lodash-es/_addMapEntry.js | 15 + public/assets/lodash-es/_addSetEntry.js | 15 + public/assets/lodash-es/_apply.js | 21 + public/assets/lodash-es/_arrayAggregator.js | 22 + public/assets/lodash-es/_arrayEach.js | 22 + public/assets/lodash-es/_arrayEachRight.js | 21 + public/assets/lodash-es/_arrayEvery.js | 23 + public/assets/lodash-es/_arrayFilter.js | 25 + public/assets/lodash-es/_arrayIncludes.js | 17 + public/assets/lodash-es/_arrayIncludesWith.js | 22 + public/assets/lodash-es/_arrayLikeKeys.js | 49 + public/assets/lodash-es/_arrayMap.js | 21 + public/assets/lodash-es/_arrayPush.js | 20 + public/assets/lodash-es/_arrayReduce.js | 26 + public/assets/lodash-es/_arrayReduceRight.js | 24 + public/assets/lodash-es/_arraySample.js | 15 + public/assets/lodash-es/_arraySampleSize.js | 17 + public/assets/lodash-es/_arrayShuffle.js | 15 + public/assets/lodash-es/_arraySome.js | 23 + public/assets/lodash-es/_asciiSize.js | 12 + public/assets/lodash-es/_asciiToArray.js | 12 + public/assets/lodash-es/_asciiWords.js | 15 + public/assets/lodash-es/_assignMergeValue.js | 20 + public/assets/lodash-es/_assignValue.js | 28 + public/assets/lodash-es/_assocIndexOf.js | 21 + public/assets/lodash-es/_baseAggregator.js | 21 + public/assets/lodash-es/_baseAssign.js | 17 + public/assets/lodash-es/_baseAssignIn.js | 17 + public/assets/lodash-es/_baseAssignValue.js | 25 + public/assets/lodash-es/_baseAt.js | 23 + public/assets/lodash-es/_baseClamp.js | 22 + public/assets/lodash-es/_baseClone.js | 166 + public/assets/lodash-es/_baseConforms.js | 18 + public/assets/lodash-es/_baseConformsTo.js | 27 + public/assets/lodash-es/_baseCreate.js | 30 + public/assets/lodash-es/_baseDelay.js | 21 + public/assets/lodash-es/_baseDifference.js | 67 + public/assets/lodash-es/_baseEach.js | 14 + public/assets/lodash-es/_baseEachRight.js | 14 + public/assets/lodash-es/_baseEvery.js | 21 + public/assets/lodash-es/_baseExtremum.js | 32 + public/assets/lodash-es/_baseFill.js | 32 + public/assets/lodash-es/_baseFilter.js | 21 + public/assets/lodash-es/_baseFindIndex.js | 24 + public/assets/lodash-es/_baseFindKey.js | 23 + public/assets/lodash-es/_baseFlatten.js | 38 + public/assets/lodash-es/_baseFor.js | 16 + public/assets/lodash-es/_baseForOwn.js | 16 + public/assets/lodash-es/_baseForOwnRight.js | 16 + public/assets/lodash-es/_baseForRight.js | 15 + public/assets/lodash-es/_baseFunctions.js | 19 + public/assets/lodash-es/_baseGet.js | 24 + public/assets/lodash-es/_baseGetAllKeys.js | 20 + public/assets/lodash-es/_baseGetTag.js | 28 + public/assets/lodash-es/_baseGt.js | 14 + public/assets/lodash-es/_baseHas.js | 19 + public/assets/lodash-es/_baseHasIn.js | 13 + public/assets/lodash-es/_baseInRange.js | 18 + public/assets/lodash-es/_baseIndexOf.js | 20 + public/assets/lodash-es/_baseIndexOfWith.js | 23 + public/assets/lodash-es/_baseIntersection.js | 74 + public/assets/lodash-es/_baseInverter.js | 21 + public/assets/lodash-es/_baseInvoke.js | 24 + public/assets/lodash-es/_baseIsArguments.js | 18 + public/assets/lodash-es/_baseIsArrayBuffer.js | 17 + public/assets/lodash-es/_baseIsDate.js | 18 + public/assets/lodash-es/_baseIsEqual.js | 28 + public/assets/lodash-es/_baseIsEqualDeep.js | 83 + public/assets/lodash-es/_baseIsMap.js | 18 + public/assets/lodash-es/_baseIsMatch.js | 62 + public/assets/lodash-es/_baseIsNaN.js | 12 + public/assets/lodash-es/_baseIsNative.js | 47 + public/assets/lodash-es/_baseIsRegExp.js | 18 + public/assets/lodash-es/_baseIsSet.js | 18 + public/assets/lodash-es/_baseIsTypedArray.js | 60 + public/assets/lodash-es/_baseIteratee.js | 31 + public/assets/lodash-es/_baseKeys.js | 30 + public/assets/lodash-es/_baseKeysIn.js | 33 + public/assets/lodash-es/_baseLodash.js | 10 + public/assets/lodash-es/_baseLt.js | 14 + public/assets/lodash-es/_baseMap.js | 22 + public/assets/lodash-es/_baseMatches.js | 22 + .../assets/lodash-es/_baseMatchesProperty.js | 33 + public/assets/lodash-es/_baseMean.js | 20 + public/assets/lodash-es/_baseMerge.js | 42 + public/assets/lodash-es/_baseMergeDeep.js | 94 + public/assets/lodash-es/_baseNth.js | 20 + public/assets/lodash-es/_baseOrderBy.js | 49 + public/assets/lodash-es/_basePick.js | 19 + public/assets/lodash-es/_basePickBy.js | 30 + public/assets/lodash-es/_baseProperty.js | 14 + public/assets/lodash-es/_basePropertyDeep.js | 16 + public/assets/lodash-es/_basePropertyOf.js | 14 + public/assets/lodash-es/_basePullAll.js | 51 + public/assets/lodash-es/_basePullAt.js | 37 + public/assets/lodash-es/_baseRandom.js | 18 + public/assets/lodash-es/_baseRange.js | 28 + public/assets/lodash-es/_baseReduce.js | 23 + public/assets/lodash-es/_baseRepeat.js | 35 + public/assets/lodash-es/_baseRest.js | 17 + public/assets/lodash-es/_baseSample.js | 15 + public/assets/lodash-es/_baseSampleSize.js | 18 + public/assets/lodash-es/_baseSet.js | 51 + public/assets/lodash-es/_baseSetData.js | 17 + public/assets/lodash-es/_baseSetToString.js | 22 + public/assets/lodash-es/_baseShuffle.js | 15 + public/assets/lodash-es/_baseSlice.js | 31 + public/assets/lodash-es/_baseSome.js | 22 + public/assets/lodash-es/_baseSortBy.js | 21 + public/assets/lodash-es/_baseSortedIndex.js | 42 + public/assets/lodash-es/_baseSortedIndexBy.js | 67 + public/assets/lodash-es/_baseSortedUniq.js | 30 + public/assets/lodash-es/_baseSum.js | 24 + public/assets/lodash-es/_baseTimes.js | 20 + public/assets/lodash-es/_baseToNumber.js | 24 + public/assets/lodash-es/_baseToPairs.js | 18 + public/assets/lodash-es/_baseToString.js | 37 + public/assets/lodash-es/_baseTrim.js | 19 + public/assets/lodash-es/_baseUnary.js | 14 + public/assets/lodash-es/_baseUniq.js | 72 + public/assets/lodash-es/_baseUnset.js | 65 + public/assets/lodash-es/_baseUpdate.js | 18 + public/assets/lodash-es/_baseValues.js | 19 + public/assets/lodash-es/_baseWhile.js | 26 + public/assets/lodash-es/_baseWrapperValue.js | 25 + public/assets/lodash-es/_baseXor.js | 36 + public/assets/lodash-es/_baseZipObject.js | 23 + public/assets/lodash-es/_cacheHas.js | 13 + .../assets/lodash-es/_castArrayLikeObject.js | 14 + public/assets/lodash-es/_castFunction.js | 14 + public/assets/lodash-es/_castPath.js | 21 + public/assets/lodash-es/_castRest.js | 14 + public/assets/lodash-es/_castSlice.js | 18 + public/assets/lodash-es/_charsEndIndex.js | 19 + public/assets/lodash-es/_charsStartIndex.js | 20 + public/assets/lodash-es/_cloneArrayBuffer.js | 16 + public/assets/lodash-es/_cloneBuffer.js | 35 + public/assets/lodash-es/_cloneDataView.js | 16 + public/assets/lodash-es/_cloneMap.js | 22 + public/assets/lodash-es/_cloneRegExp.js | 17 + public/assets/lodash-es/_cloneSet.js | 22 + public/assets/lodash-es/_cloneSymbol.js | 18 + public/assets/lodash-es/_cloneTypedArray.js | 16 + public/assets/lodash-es/_compareAscending.js | 41 + public/assets/lodash-es/_compareMultiple.js | 44 + public/assets/lodash-es/_composeArgs.js | 39 + public/assets/lodash-es/_composeArgsRight.js | 41 + public/assets/lodash-es/_copyArray.js | 20 + public/assets/lodash-es/_copyObject.js | 40 + public/assets/lodash-es/_copySymbols.js | 16 + public/assets/lodash-es/_copySymbolsIn.js | 16 + public/assets/lodash-es/_coreJsData.js | 6 + public/assets/lodash-es/_countHolders.js | 21 + public/assets/lodash-es/_createAggregator.js | 23 + public/assets/lodash-es/_createAssigner.js | 37 + public/assets/lodash-es/_createBaseEach.js | 32 + public/assets/lodash-es/_createBaseFor.js | 25 + public/assets/lodash-es/_createBind.js | 28 + public/assets/lodash-es/_createCaseFirst.js | 33 + public/assets/lodash-es/_createCompounder.js | 24 + public/assets/lodash-es/_createCtor.js | 37 + public/assets/lodash-es/_createCurry.js | 46 + public/assets/lodash-es/_createFind.js | 25 + public/assets/lodash-es/_createFlow.js | 78 + public/assets/lodash-es/_createHybrid.js | 92 + public/assets/lodash-es/_createInverter.js | 17 + .../assets/lodash-es/_createMathOperation.js | 38 + public/assets/lodash-es/_createOver.js | 27 + public/assets/lodash-es/_createPadding.js | 33 + public/assets/lodash-es/_createPartial.js | 43 + public/assets/lodash-es/_createRange.js | 30 + public/assets/lodash-es/_createRecurry.js | 56 + .../lodash-es/_createRelationalOperation.js | 20 + public/assets/lodash-es/_createRound.js | 35 + public/assets/lodash-es/_createSet.js | 19 + public/assets/lodash-es/_createToPairs.js | 30 + public/assets/lodash-es/_createWrap.js | 106 + .../lodash-es/_customDefaultsAssignIn.js | 29 + .../assets/lodash-es/_customDefaultsMerge.js | 28 + public/assets/lodash-es/_customOmitClone.js | 16 + public/assets/lodash-es/_deburrLetter.js | 71 + public/assets/lodash-es/_defineProperty.js | 11 + public/assets/lodash-es/_equalArrays.js | 84 + public/assets/lodash-es/_equalByTag.js | 112 + public/assets/lodash-es/_equalObjects.js | 90 + public/assets/lodash-es/_escapeHtmlChar.js | 21 + public/assets/lodash-es/_escapeStringChar.js | 22 + public/assets/lodash-es/_flatRest.js | 16 + public/assets/lodash-es/_freeGlobal.js | 4 + public/assets/lodash-es/_getAllKeys.js | 16 + public/assets/lodash-es/_getAllKeysIn.js | 17 + public/assets/lodash-es/_getData.js | 15 + public/assets/lodash-es/_getFuncName.js | 31 + public/assets/lodash-es/_getHolder.js | 13 + public/assets/lodash-es/_getMapData.js | 18 + public/assets/lodash-es/_getMatchData.js | 24 + public/assets/lodash-es/_getNative.js | 17 + public/assets/lodash-es/_getPrototype.js | 6 + public/assets/lodash-es/_getRawTag.js | 46 + public/assets/lodash-es/_getSymbols.js | 30 + public/assets/lodash-es/_getSymbolsIn.js | 25 + public/assets/lodash-es/_getTag.js | 58 + public/assets/lodash-es/_getValue.js | 13 + public/assets/lodash-es/_getView.js | 33 + public/assets/lodash-es/_getWrapDetails.js | 17 + public/assets/lodash-es/_hasPath.js | 39 + public/assets/lodash-es/_hasUnicode.js | 26 + public/assets/lodash-es/_hasUnicodeWord.js | 15 + public/assets/lodash-es/_hashClear.js | 15 + public/assets/lodash-es/_hashDelete.js | 17 + public/assets/lodash-es/_hashGet.js | 30 + public/assets/lodash-es/_hashHas.js | 23 + public/assets/lodash-es/_hashSet.js | 23 + public/assets/lodash-es/_initCloneArray.js | 26 + public/assets/lodash-es/_initCloneByTag.js | 77 + public/assets/lodash-es/_initCloneObject.js | 18 + public/assets/lodash-es/_insertWrapDetails.js | 23 + public/assets/lodash-es/_isFlattenable.js | 20 + public/assets/lodash-es/_isIndex.js | 25 + public/assets/lodash-es/_isIterateeCall.js | 30 + public/assets/lodash-es/_isKey.js | 29 + public/assets/lodash-es/_isKeyable.js | 15 + public/assets/lodash-es/_isLaziable.js | 28 + public/assets/lodash-es/_isMaskable.js | 14 + public/assets/lodash-es/_isMasked.js | 20 + public/assets/lodash-es/_isPrototype.js | 18 + .../assets/lodash-es/_isStrictComparable.js | 15 + public/assets/lodash-es/_iteratorToArray.js | 18 + public/assets/lodash-es/_lazyClone.js | 23 + public/assets/lodash-es/_lazyReverse.js | 23 + public/assets/lodash-es/_lazyValue.js | 69 + public/assets/lodash-es/_listCacheClear.js | 13 + public/assets/lodash-es/_listCacheDelete.js | 35 + public/assets/lodash-es/_listCacheGet.js | 19 + public/assets/lodash-es/_listCacheHas.js | 16 + public/assets/lodash-es/_listCacheSet.js | 26 + public/assets/lodash-es/_mapCacheClear.js | 21 + public/assets/lodash-es/_mapCacheDelete.js | 18 + public/assets/lodash-es/_mapCacheGet.js | 16 + public/assets/lodash-es/_mapCacheHas.js | 16 + public/assets/lodash-es/_mapCacheSet.js | 22 + public/assets/lodash-es/_mapToArray.js | 18 + .../lodash-es/_matchesStrictComparable.js | 20 + public/assets/lodash-es/_memoizeCapped.js | 26 + public/assets/lodash-es/_mergeData.js | 90 + public/assets/lodash-es/_metaMap.js | 6 + public/assets/lodash-es/_nativeCreate.js | 6 + public/assets/lodash-es/_nativeKeys.js | 6 + public/assets/lodash-es/_nativeKeysIn.js | 20 + public/assets/lodash-es/_nodeUtil.js | 30 + public/assets/lodash-es/_objectToString.js | 22 + public/assets/lodash-es/_overArg.js | 15 + public/assets/lodash-es/_overRest.js | 36 + public/assets/lodash-es/_parent.js | 16 + public/assets/lodash-es/_reEscape.js | 4 + public/assets/lodash-es/_reEvaluate.js | 4 + public/assets/lodash-es/_reInterpolate.js | 4 + public/assets/lodash-es/_realNames.js | 4 + public/assets/lodash-es/_reorder.js | 29 + public/assets/lodash-es/_replaceHolders.js | 29 + public/assets/lodash-es/_root.js | 9 + public/assets/lodash-es/_safeGet.js | 21 + public/assets/lodash-es/_setCacheAdd.js | 19 + public/assets/lodash-es/_setCacheHas.js | 14 + public/assets/lodash-es/_setData.js | 20 + public/assets/lodash-es/_setToArray.js | 18 + public/assets/lodash-es/_setToPairs.js | 18 + public/assets/lodash-es/_setToString.js | 14 + public/assets/lodash-es/_setWrapToString.js | 21 + public/assets/lodash-es/_shortOut.js | 37 + public/assets/lodash-es/_shuffleSelf.js | 28 + public/assets/lodash-es/_stackClear.js | 15 + public/assets/lodash-es/_stackDelete.js | 18 + public/assets/lodash-es/_stackGet.js | 14 + public/assets/lodash-es/_stackHas.js | 14 + public/assets/lodash-es/_stackSet.js | 34 + public/assets/lodash-es/_strictIndexOf.js | 23 + public/assets/lodash-es/_strictLastIndexOf.js | 21 + public/assets/lodash-es/_stringSize.js | 18 + public/assets/lodash-es/_stringToArray.js | 18 + public/assets/lodash-es/_stringToPath.js | 27 + public/assets/lodash-es/_toKey.js | 21 + public/assets/lodash-es/_toSource.js | 26 + public/assets/lodash-es/_trimmedEndIndex.js | 19 + public/assets/lodash-es/_unescapeHtmlChar.js | 21 + public/assets/lodash-es/_unicodeSize.js | 44 + public/assets/lodash-es/_unicodeToArray.js | 40 + public/assets/lodash-es/_unicodeWords.js | 69 + public/assets/lodash-es/_updateWrapDetails.js | 46 + public/assets/lodash-es/_wrapperClone.js | 23 + public/assets/lodash-es/add.js | 22 + public/assets/lodash-es/after.js | 42 + public/assets/lodash-es/array.default.js | 81 + public/assets/lodash-es/array.js | 66 + public/assets/lodash-es/ary.js | 29 + public/assets/lodash-es/assign.js | 58 + public/assets/lodash-es/assignIn.js | 40 + public/assets/lodash-es/assignInWith.js | 38 + public/assets/lodash-es/assignWith.js | 37 + public/assets/lodash-es/at.js | 23 + public/assets/lodash-es/attempt.js | 35 + public/assets/lodash-es/before.js | 40 + public/assets/lodash-es/bind.js | 57 + public/assets/lodash-es/bindAll.js | 41 + public/assets/lodash-es/bindKey.js | 68 + public/assets/lodash-es/camelCase.js | 29 + public/assets/lodash-es/capitalize.js | 23 + public/assets/lodash-es/castArray.js | 44 + public/assets/lodash-es/ceil.js | 26 + public/assets/lodash-es/chain.js | 38 + public/assets/lodash-es/chunk.js | 50 + public/assets/lodash-es/clamp.js | 39 + public/assets/lodash-es/clone.js | 36 + public/assets/lodash-es/cloneDeep.js | 29 + public/assets/lodash-es/cloneDeepWith.js | 40 + public/assets/lodash-es/cloneWith.js | 42 + public/assets/lodash-es/collection.default.js | 37 + public/assets/lodash-es/collection.js | 29 + public/assets/lodash-es/commit.js | 33 + public/assets/lodash-es/compact.js | 31 + public/assets/lodash-es/concat.js | 43 + public/assets/lodash-es/cond.js | 60 + public/assets/lodash-es/conforms.js | 35 + public/assets/lodash-es/conformsTo.js | 32 + public/assets/lodash-es/constant.js | 26 + public/assets/lodash-es/countBy.js | 40 + public/assets/lodash-es/create.js | 43 + public/assets/lodash-es/curry.js | 57 + public/assets/lodash-es/curryRight.js | 54 + public/assets/lodash-es/date.default.js | 5 + public/assets/lodash-es/date.js | 2 + public/assets/lodash-es/debounce.js | 191 + public/assets/lodash-es/deburr.js | 45 + public/assets/lodash-es/defaultTo.js | 25 + public/assets/lodash-es/defaults.js | 64 + public/assets/lodash-es/defaultsDeep.js | 30 + public/assets/lodash-es/defer.js | 26 + public/assets/lodash-es/delay.js | 28 + public/assets/lodash-es/difference.js | 33 + public/assets/lodash-es/differenceBy.js | 44 + public/assets/lodash-es/differenceWith.js | 40 + public/assets/lodash-es/divide.js | 22 + public/assets/lodash-es/drop.js | 38 + public/assets/lodash-es/dropRight.js | 39 + public/assets/lodash-es/dropRightWhile.js | 45 + public/assets/lodash-es/dropWhile.js | 45 + public/assets/lodash-es/each.js | 1 + public/assets/lodash-es/eachRight.js | 1 + public/assets/lodash-es/endsWith.js | 43 + public/assets/lodash-es/entries.js | 1 + public/assets/lodash-es/entriesIn.js | 1 + public/assets/lodash-es/eq.js | 37 + public/assets/lodash-es/escape.js | 43 + public/assets/lodash-es/escapeRegExp.js | 32 + public/assets/lodash-es/every.js | 56 + public/assets/lodash-es/extend.js | 1 + public/assets/lodash-es/extendWith.js | 1 + public/assets/lodash-es/fill.js | 45 + public/assets/lodash-es/filter.js | 52 + public/assets/lodash-es/find.js | 42 + public/assets/lodash-es/findIndex.js | 55 + public/assets/lodash-es/findKey.js | 44 + public/assets/lodash-es/findLast.js | 25 + public/assets/lodash-es/findLastIndex.js | 59 + public/assets/lodash-es/findLastKey.js | 44 + public/assets/lodash-es/first.js | 1 + public/assets/lodash-es/flatMap.js | 29 + public/assets/lodash-es/flatMapDeep.js | 31 + public/assets/lodash-es/flatMapDepth.js | 31 + public/assets/lodash-es/flatten.js | 22 + public/assets/lodash-es/flattenDeep.js | 25 + public/assets/lodash-es/flattenDepth.js | 33 + public/assets/lodash-es/flip.js | 28 + public/assets/lodash-es/floor.js | 26 + public/assets/lodash-es/flow.js | 27 + public/assets/lodash-es/flowRight.js | 26 + public/assets/lodash-es/forEach.js | 41 + public/assets/lodash-es/forEachRight.js | 31 + public/assets/lodash-es/forIn.js | 39 + public/assets/lodash-es/forInRight.js | 37 + public/assets/lodash-es/forOwn.js | 36 + public/assets/lodash-es/forOwnRight.js | 34 + public/assets/lodash-es/fromPairs.js | 28 + public/assets/lodash-es/function.default.js | 31 + public/assets/lodash-es/function.js | 24 + public/assets/lodash-es/functions.js | 31 + public/assets/lodash-es/functionsIn.js | 31 + public/assets/lodash-es/get.js | 33 + public/assets/lodash-es/groupBy.js | 41 + public/assets/lodash-es/gt.js | 29 + public/assets/lodash-es/gte.js | 30 + public/assets/lodash-es/has.js | 35 + public/assets/lodash-es/hasIn.js | 34 + public/assets/lodash-es/head.js | 23 + public/assets/lodash-es/identity.js | 21 + public/assets/lodash-es/inRange.js | 55 + public/assets/lodash-es/includes.js | 53 + public/assets/lodash-es/indexOf.js | 42 + public/assets/lodash-es/initial.js | 22 + public/assets/lodash-es/intersection.js | 30 + public/assets/lodash-es/intersectionBy.js | 45 + public/assets/lodash-es/intersectionWith.js | 41 + public/assets/lodash-es/invert.js | 42 + public/assets/lodash-es/invertBy.js | 56 + public/assets/lodash-es/invoke.js | 24 + public/assets/lodash-es/invokeMap.js | 41 + public/assets/lodash-es/isArguments.js | 36 + public/assets/lodash-es/isArray.js | 26 + public/assets/lodash-es/isArrayBuffer.js | 27 + public/assets/lodash-es/isArrayLike.js | 33 + public/assets/lodash-es/isArrayLikeObject.js | 33 + public/assets/lodash-es/isBoolean.js | 29 + public/assets/lodash-es/isBuffer.js | 38 + public/assets/lodash-es/isDate.js | 27 + public/assets/lodash-es/isElement.js | 25 + public/assets/lodash-es/isEmpty.js | 77 + public/assets/lodash-es/isEqual.js | 35 + public/assets/lodash-es/isEqualWith.js | 41 + public/assets/lodash-es/isError.js | 36 + public/assets/lodash-es/isFinite.js | 36 + public/assets/lodash-es/isFunction.js | 37 + public/assets/lodash-es/isInteger.js | 33 + public/assets/lodash-es/isLength.js | 35 + public/assets/lodash-es/isMap.js | 27 + public/assets/lodash-es/isMatch.js | 36 + public/assets/lodash-es/isMatchWith.js | 41 + public/assets/lodash-es/isNaN.js | 38 + public/assets/lodash-es/isNative.js | 40 + public/assets/lodash-es/isNil.js | 25 + public/assets/lodash-es/isNull.js | 22 + public/assets/lodash-es/isNumber.js | 38 + public/assets/lodash-es/isObject.js | 31 + public/assets/lodash-es/isObjectLike.js | 29 + public/assets/lodash-es/isPlainObject.js | 62 + public/assets/lodash-es/isRegExp.js | 27 + public/assets/lodash-es/isSafeInteger.js | 37 + public/assets/lodash-es/isSet.js | 27 + public/assets/lodash-es/isString.js | 30 + public/assets/lodash-es/isSymbol.js | 29 + public/assets/lodash-es/isTypedArray.js | 27 + public/assets/lodash-es/isUndefined.js | 22 + public/assets/lodash-es/isWeakMap.js | 28 + public/assets/lodash-es/isWeakSet.js | 28 + public/assets/lodash-es/iteratee.js | 53 + public/assets/lodash-es/join.js | 26 + public/assets/lodash-es/kebabCase.js | 28 + public/assets/lodash-es/keyBy.js | 36 + public/assets/lodash-es/keys.js | 37 + public/assets/lodash-es/keysIn.js | 32 + public/assets/lodash-es/lang.default.js | 71 + public/assets/lodash-es/lang.js | 57 + public/assets/lodash-es/last.js | 20 + public/assets/lodash-es/lastIndexOf.js | 46 + public/assets/lodash-es/lodash.default.js | 643 + public/assets/lodash-es/lodash.js | 331 + public/assets/lodash-es/lowerCase.js | 27 + public/assets/lodash-es/lowerFirst.js | 22 + public/assets/lodash-es/lt.js | 29 + public/assets/lodash-es/lte.js | 30 + public/assets/lodash-es/map.js | 53 + public/assets/lodash-es/mapKeys.js | 36 + public/assets/lodash-es/mapValues.js | 43 + public/assets/lodash-es/matches.js | 46 + public/assets/lodash-es/matchesProperty.js | 44 + public/assets/lodash-es/math.default.js | 21 + public/assets/lodash-es/math.js | 16 + public/assets/lodash-es/max.js | 29 + public/assets/lodash-es/maxBy.js | 34 + public/assets/lodash-es/mean.js | 22 + public/assets/lodash-es/meanBy.js | 31 + public/assets/lodash-es/memoize.js | 73 + public/assets/lodash-es/merge.js | 39 + public/assets/lodash-es/mergeWith.js | 39 + public/assets/lodash-es/method.js | 34 + public/assets/lodash-es/methodOf.js | 33 + public/assets/lodash-es/min.js | 29 + public/assets/lodash-es/minBy.js | 34 + public/assets/lodash-es/mixin.js | 74 + public/assets/lodash-es/multiply.js | 22 + public/assets/lodash-es/negate.js | 40 + public/assets/lodash-es/next.js | 35 + public/assets/lodash-es/noop.js | 17 + public/assets/lodash-es/now.js | 23 + public/assets/lodash-es/nth.js | 29 + public/assets/lodash-es/nthArg.js | 32 + public/assets/lodash-es/number.default.js | 7 + public/assets/lodash-es/number.js | 4 + public/assets/lodash-es/object.default.js | 60 + public/assets/lodash-es/object.js | 48 + public/assets/lodash-es/omit.js | 57 + public/assets/lodash-es/omitBy.js | 29 + public/assets/lodash-es/once.js | 25 + public/assets/lodash-es/orderBy.js | 47 + public/assets/lodash-es/over.js | 24 + public/assets/lodash-es/overArgs.js | 61 + public/assets/lodash-es/overEvery.js | 34 + public/assets/lodash-es/overSome.js | 37 + public/assets/lodash-es/package.json | 21 + public/assets/lodash-es/pad.js | 49 + public/assets/lodash-es/padEnd.js | 39 + public/assets/lodash-es/padStart.js | 39 + public/assets/lodash-es/parseInt.js | 43 + public/assets/lodash-es/partial.js | 50 + public/assets/lodash-es/partialRight.js | 49 + public/assets/lodash-es/partition.js | 43 + public/assets/lodash-es/pick.js | 25 + public/assets/lodash-es/pickBy.js | 37 + public/assets/lodash-es/plant.js | 48 + public/assets/lodash-es/property.js | 32 + public/assets/lodash-es/propertyOf.js | 30 + public/assets/lodash-es/pull.js | 29 + public/assets/lodash-es/pullAll.js | 29 + public/assets/lodash-es/pullAllBy.js | 33 + public/assets/lodash-es/pullAllWith.js | 32 + public/assets/lodash-es/pullAt.js | 43 + public/assets/lodash-es/random.js | 82 + public/assets/lodash-es/range.js | 46 + public/assets/lodash-es/rangeRight.js | 41 + public/assets/lodash-es/rearg.js | 33 + public/assets/lodash-es/reduce.js | 51 + public/assets/lodash-es/reduceRight.js | 36 + public/assets/lodash-es/reject.js | 46 + public/assets/lodash-es/remove.js | 53 + public/assets/lodash-es/repeat.js | 37 + public/assets/lodash-es/replace.js | 29 + public/assets/lodash-es/rest.js | 40 + public/assets/lodash-es/result.js | 56 + public/assets/lodash-es/reverse.js | 34 + public/assets/lodash-es/round.js | 26 + public/assets/lodash-es/sample.js | 24 + public/assets/lodash-es/sampleSize.js | 37 + public/assets/lodash-es/seq.default.js | 20 + public/assets/lodash-es/seq.js | 15 + public/assets/lodash-es/set.js | 35 + public/assets/lodash-es/setWith.js | 32 + public/assets/lodash-es/shuffle.js | 25 + public/assets/lodash-es/size.js | 46 + public/assets/lodash-es/slice.js | 37 + public/assets/lodash-es/snakeCase.js | 28 + public/assets/lodash-es/some.js | 51 + public/assets/lodash-es/sortBy.js | 48 + public/assets/lodash-es/sortedIndex.js | 24 + public/assets/lodash-es/sortedIndexBy.js | 33 + public/assets/lodash-es/sortedIndexOf.js | 31 + public/assets/lodash-es/sortedLastIndex.js | 25 + public/assets/lodash-es/sortedLastIndexBy.js | 33 + public/assets/lodash-es/sortedLastIndexOf.js | 31 + public/assets/lodash-es/sortedUniq.js | 24 + public/assets/lodash-es/sortedUniqBy.js | 26 + public/assets/lodash-es/split.js | 52 + public/assets/lodash-es/spread.js | 63 + public/assets/lodash-es/startCase.js | 29 + public/assets/lodash-es/startsWith.js | 39 + public/assets/lodash-es/string.default.js | 41 + public/assets/lodash-es/string.js | 32 + public/assets/lodash-es/stubArray.js | 23 + public/assets/lodash-es/stubFalse.js | 18 + public/assets/lodash-es/stubObject.js | 23 + public/assets/lodash-es/stubString.js | 18 + public/assets/lodash-es/stubTrue.js | 18 + public/assets/lodash-es/subtract.js | 22 + public/assets/lodash-es/sum.js | 24 + public/assets/lodash-es/sumBy.js | 33 + public/assets/lodash-es/tail.js | 22 + public/assets/lodash-es/take.js | 37 + public/assets/lodash-es/takeRight.js | 39 + public/assets/lodash-es/takeRightWhile.js | 45 + public/assets/lodash-es/takeWhile.js | 45 + public/assets/lodash-es/tap.js | 29 + public/assets/lodash-es/template.js | 272 + public/assets/lodash-es/templateSettings.js | 67 + public/assets/lodash-es/throttle.js | 69 + public/assets/lodash-es/thru.js | 28 + public/assets/lodash-es/times.js | 51 + public/assets/lodash-es/toArray.js | 58 + public/assets/lodash-es/toFinite.js | 42 + public/assets/lodash-es/toInteger.js | 36 + public/assets/lodash-es/toIterator.js | 23 + public/assets/lodash-es/toJSON.js | 1 + public/assets/lodash-es/toLength.js | 38 + public/assets/lodash-es/toLower.js | 28 + public/assets/lodash-es/toNumber.js | 64 + public/assets/lodash-es/toPairs.js | 30 + public/assets/lodash-es/toPairsIn.js | 30 + public/assets/lodash-es/toPath.js | 33 + public/assets/lodash-es/toPlainObject.js | 32 + public/assets/lodash-es/toSafeInteger.js | 37 + public/assets/lodash-es/toString.js | 28 + public/assets/lodash-es/toUpper.js | 28 + public/assets/lodash-es/transform.js | 65 + public/assets/lodash-es/trim.js | 47 + public/assets/lodash-es/trimEnd.js | 41 + public/assets/lodash-es/trimStart.js | 43 + public/assets/lodash-es/truncate.js | 111 + public/assets/lodash-es/unary.js | 22 + public/assets/lodash-es/unescape.js | 34 + public/assets/lodash-es/union.js | 26 + public/assets/lodash-es/unionBy.js | 39 + public/assets/lodash-es/unionWith.js | 34 + public/assets/lodash-es/uniq.js | 25 + public/assets/lodash-es/uniqBy.js | 31 + public/assets/lodash-es/uniqWith.js | 28 + public/assets/lodash-es/uniqueId.js | 28 + public/assets/lodash-es/unset.js | 34 + public/assets/lodash-es/unzip.js | 45 + public/assets/lodash-es/unzipWith.js | 39 + public/assets/lodash-es/update.js | 35 + public/assets/lodash-es/updateWith.js | 33 + public/assets/lodash-es/upperCase.js | 27 + public/assets/lodash-es/upperFirst.js | 22 + public/assets/lodash-es/util.default.js | 42 + public/assets/lodash-es/util.js | 33 + public/assets/lodash-es/value.js | 1 + public/assets/lodash-es/valueOf.js | 1 + public/assets/lodash-es/values.js | 34 + public/assets/lodash-es/valuesIn.js | 32 + public/assets/lodash-es/without.js | 31 + public/assets/lodash-es/words.js | 35 + public/assets/lodash-es/wrap.js | 30 + public/assets/lodash-es/wrapperAt.js | 48 + public/assets/lodash-es/wrapperChain.js | 34 + public/assets/lodash-es/wrapperLodash.js | 147 + public/assets/lodash-es/wrapperReverse.js | 44 + public/assets/lodash-es/wrapperValue.js | 21 + public/assets/lodash-es/xor.js | 28 + public/assets/lodash-es/xorBy.js | 39 + public/assets/lodash-es/xorWith.js | 34 + public/assets/lodash-es/zip.js | 22 + public/assets/lodash-es/zipObject.js | 24 + public/assets/lodash-es/zipObjectDeep.js | 23 + public/assets/lodash-es/zipWith.js | 32 + public/assets/lodash.clonedeep/LICENSE | 47 + public/assets/lodash.clonedeep/README.md | 18 + public/assets/lodash.clonedeep/index.js | 1748 +++ public/assets/lodash.clonedeep/package.json | 17 + public/assets/lodash.isequal/LICENSE | 47 + public/assets/lodash.isequal/README.md | 18 + public/assets/lodash.isequal/index.js | 1848 +++ public/assets/lodash.isequal/package.json | 16 + public/assets/parchment/LICENSE | 30 + public/assets/parchment/README.md | 271 + public/assets/parchment/dist/parchment.d.ts | 453 + public/assets/parchment/dist/parchment.js | 847 ++ public/assets/parchment/dist/parchment.js.map | 1 + .../assets/parchment/dist/parchment.umd.cjs | 2 + .../parchment/dist/parchment.umd.cjs.map | 1 + public/assets/parchment/package.json | 53 + .../parchment/src/attributor/attributor.ts | 62 + .../assets/parchment/src/attributor/class.ts | 43 + .../assets/parchment/src/attributor/store.ts | 79 + .../assets/parchment/src/attributor/style.ts | 44 + .../parchment/src/blot/abstract/blot.ts | 128 + .../parchment/src/blot/abstract/container.ts | 48 + .../parchment/src/blot/abstract/leaf.ts | 57 + .../parchment/src/blot/abstract/parent.ts | 400 + .../parchment/src/blot/abstract/shadow.ts | 188 + public/assets/parchment/src/blot/block.ts | 123 + public/assets/parchment/src/blot/embed.ts | 34 + public/assets/parchment/src/blot/inline.ts | 159 + public/assets/parchment/src/blot/scroll.ts | 216 + public/assets/parchment/src/blot/text.ts | 100 + .../parchment/src/collection/linked-list.ts | 201 + .../parchment/src/collection/linked-node.ts | 8 + public/assets/parchment/src/error.ts | 12 + public/assets/parchment/src/parchment.ts | 48 + public/assets/parchment/src/registry.ts | 155 + public/assets/parchment/src/scope.ts | 18 + public/assets/parchment/tsconfig.json | 16 + public/assets/quill-delta/LICENSE | 14 + public/assets/quill-delta/README.md | 672 + .../assets/quill-delta/dist/AttributeMap.d.ts | 10 + .../assets/quill-delta/dist/AttributeMap.js | 86 + .../quill-delta/dist/AttributeMap.js.map | 1 + public/assets/quill-delta/dist/Delta.d.ts | 45 + public/assets/quill-delta/dist/Delta.js | 478 + public/assets/quill-delta/dist/Delta.js.map | 1 + public/assets/quill-delta/dist/Op.d.ts | 11 + public/assets/quill-delta/dist/Op.js | 22 + public/assets/quill-delta/dist/Op.js.map | 1 + .../assets/quill-delta/dist/OpIterator.d.ts | 13 + public/assets/quill-delta/dist/OpIterator.js | 106 + .../assets/quill-delta/dist/OpIterator.js.map | 1 + public/assets/quill-delta/package.json | 77 + public/assets/quill-delta/src/AttributeMap.ts | 101 + public/assets/quill-delta/src/Delta.ts | 573 + public/assets/quill-delta/src/Op.ts | 26 + public/assets/quill-delta/src/OpIterator.ts | 106 + public/assets/quill-delta/tsconfig.json | 15 + public/assets/quill/LICENSE | 31 + public/assets/quill/README.md | 104 + public/assets/quill/assets/base.styl | 309 + public/assets/quill/assets/bubble.styl | 45 + .../assets/quill/assets/bubble/toolbar.styl | 14 + .../assets/quill/assets/bubble/tooltip.styl | 49 + public/assets/quill/assets/core.styl | 215 + public/assets/quill/assets/favicon.png | Bin 0 -> 696 bytes .../quill/assets/icons/align-center.svg | 5 + .../quill/assets/icons/align-justify.svg | 5 + .../assets/quill/assets/icons/align-left.svg | 5 + .../assets/quill/assets/icons/align-right.svg | 5 + .../assets/quill/assets/icons/attachment.svg | 3 + public/assets/quill/assets/icons/audio.svg | 5 + .../assets/quill/assets/icons/authorship.svg | 5 + .../assets/quill/assets/icons/background.svg | 52 + .../assets/quill/assets/icons/blockquote.svg | 6 + public/assets/quill/assets/icons/bold.svg | 4 + public/assets/quill/assets/icons/clean.svg | 7 + public/assets/quill/assets/icons/code.svg | 5 + public/assets/quill/assets/icons/color.svg | 5 + public/assets/quill/assets/icons/comment.svg | 3 + .../quill/assets/icons/direction-ltr.svg | 7 + .../quill/assets/icons/direction-rtl.svg | 7 + public/assets/quill/assets/icons/dropdown.svg | 4 + public/assets/quill/assets/icons/embed.svg | 3 + public/assets/quill/assets/icons/emoji.svg | 6 + .../quill/assets/icons/float-center.svg | 5 + .../assets/quill/assets/icons/float-full.svg | 5 + .../assets/quill/assets/icons/float-left.svg | 7 + .../assets/quill/assets/icons/float-right.svg | 7 + public/assets/quill/assets/icons/font.svg | 5 + public/assets/quill/assets/icons/formula.svg | 5 + public/assets/quill/assets/icons/hashtag.svg | 6 + public/assets/quill/assets/icons/header-2.svg | 3 + public/assets/quill/assets/icons/header-3.svg | 3 + public/assets/quill/assets/icons/header-4.svg | 3 + public/assets/quill/assets/icons/header-5.svg | 3 + public/assets/quill/assets/icons/header-6.svg | 3 + public/assets/quill/assets/icons/header.svg | 3 + .../quill/assets/icons/horizontal-rule.svg | 4 + public/assets/quill/assets/icons/image.svg | 5 + public/assets/quill/assets/icons/indent.svg | 6 + public/assets/quill/assets/icons/italic.svg | 5 + public/assets/quill/assets/icons/link.svg | 5 + .../assets/quill/assets/icons/list-bullet.svg | 8 + .../assets/quill/assets/icons/list-check.svg | 8 + .../quill/assets/icons/list-ordered.svg | 9 + public/assets/quill/assets/icons/map.svg | 5 + public/assets/quill/assets/icons/mention.svg | 4 + public/assets/quill/assets/icons/more.svg | 3 + public/assets/quill/assets/icons/outdent.svg | 6 + public/assets/quill/assets/icons/redo.svg | 4 + .../quill/assets/icons/size-decrease.svg | 5 + .../quill/assets/icons/size-increase.svg | 6 + public/assets/quill/assets/icons/size.svg | 6 + public/assets/quill/assets/icons/spacing.svg | 9 + public/assets/quill/assets/icons/speech.svg | 6 + public/assets/quill/assets/icons/strike.svg | 5 + .../assets/quill/assets/icons/subscript.svg | 4 + .../assets/quill/assets/icons/superscript.svg | 4 + .../quill/assets/icons/table-border-all.svg | 5 + .../assets/icons/table-border-bottom.svg | 28 + .../quill/assets/icons/table-border-left.svg | 28 + .../quill/assets/icons/table-border-none.svg | 25 + .../assets/icons/table-border-outside.svg | 35 + .../quill/assets/icons/table-border-right.svg | 28 + .../quill/assets/icons/table-border-top.svg | 28 + .../quill/assets/icons/table-delete-cells.svg | 13 + .../assets/icons/table-delete-columns.svg | 8 + .../quill/assets/icons/table-delete-rows.svg | 9 + .../quill/assets/icons/table-insert-cells.svg | 13 + .../assets/icons/table-insert-columns.svg | 8 + .../quill/assets/icons/table-insert-rows.svg | 9 + .../quill/assets/icons/table-merge-cells.svg | 4 + .../assets/icons/table-unmerge-cells.svg | 7 + public/assets/quill/assets/icons/table.svg | 11 + .../assets/quill/assets/icons/underline.svg | 4 + public/assets/quill/assets/icons/undo.svg | 4 + public/assets/quill/assets/icons/video.svg | 14 + public/assets/quill/assets/snow.styl | 18 + public/assets/quill/assets/snow/toolbar.styl | 26 + public/assets/quill/assets/snow/tooltip.styl | 53 + public/assets/quill/blots/block.d.ts | 34 + public/assets/quill/blots/block.js | 182 + public/assets/quill/blots/block.js.map | 1 + public/assets/quill/blots/break.d.ts | 8 + public/assets/quill/blots/break.js | 21 + public/assets/quill/blots/break.js.map | 1 + public/assets/quill/blots/container.d.ts | 4 + public/assets/quill/blots/container.js | 4 + public/assets/quill/blots/container.js.map | 1 + public/assets/quill/blots/cursor.d.ts | 26 + public/assets/quill/blots/cursor.js | 170 + public/assets/quill/blots/cursor.js.map | 1 + public/assets/quill/blots/embed.d.ts | 18 + public/assets/quill/blots/embed.js | 72 + public/assets/quill/blots/embed.js.map | 1 + public/assets/quill/blots/inline.d.ts | 12 + public/assets/quill/blots/inline.js | 48 + public/assets/quill/blots/inline.js.map | 1 + public/assets/quill/blots/scroll.d.ts | 49 + public/assets/quill/blots/scroll.js | 349 + public/assets/quill/blots/scroll.js.map | 1 + public/assets/quill/blots/text.d.ts | 5 + public/assets/quill/blots/text.js | 16 + public/assets/quill/blots/text.js.map | 1 + public/assets/quill/core.d.ts | 7 + public/assets/quill/core.js | 37 + public/assets/quill/core.js.map | 1 + public/assets/quill/core/composition.d.ts | 12 + public/assets/quill/core/composition.js | 44 + public/assets/quill/core/composition.js.map | 1 + public/assets/quill/core/editor.d.ts | 28 + public/assets/quill/core/editor.js | 404 + public/assets/quill/core/editor.js.map | 1 + public/assets/quill/core/emitter.d.ts | 33 + public/assets/quill/core/emitter.js | 78 + public/assets/quill/core/emitter.js.map | 1 + public/assets/quill/core/instances.d.ts | 3 + public/assets/quill/core/instances.js | 2 + public/assets/quill/core/instances.js.map | 1 + public/assets/quill/core/logger.d.ts | 7 + public/assets/quill/core/logger.js | 24 + public/assets/quill/core/logger.js.map | 1 + public/assets/quill/core/module.d.ts | 8 + public/assets/quill/core/module.js | 10 + public/assets/quill/core/module.js.map | 1 + public/assets/quill/core/quill.d.ts | 218 + public/assets/quill/core/quill.js | 628 + public/assets/quill/core/quill.js.map | 1 + public/assets/quill/core/selection.d.ts | 74 + public/assets/quill/core/selection.js | 374 + public/assets/quill/core/selection.js.map | 1 + public/assets/quill/core/theme.d.ts | 32 + public/assets/quill/core/theme.js | 28 + public/assets/quill/core/theme.js.map | 1 + .../core/utils/createRegistryWithFormats.d.ts | 5 + .../core/utils/createRegistryWithFormats.js | 29 + .../utils/createRegistryWithFormats.js.map | 1 + .../quill/core/utils/scrollRectIntoView.d.ts | 8 + .../quill/core/utils/scrollRectIntoView.js | 75 + .../core/utils/scrollRectIntoView.js.map | 1 + public/assets/quill/dist/quill.bubble.css | 10 + public/assets/quill/dist/quill.bubble.css.map | 1 + public/assets/quill/dist/quill.core.css | 10 + public/assets/quill/dist/quill.core.css.map | 1 + public/assets/quill/dist/quill.core.js | 3 + .../quill/dist/quill.core.js.LICENSE.txt | 7 + public/assets/quill/dist/quill.core.js.map | 1 + public/assets/quill/dist/quill.js | 3 + public/assets/quill/dist/quill.js.LICENSE.txt | 7 + public/assets/quill/dist/quill.js.map | 1 + public/assets/quill/dist/quill.snow.css | 10 + public/assets/quill/dist/quill.snow.css.map | 1 + public/assets/quill/formats/align.d.ts | 5 + public/assets/quill/formats/align.js | 10 + public/assets/quill/formats/align.js.map | 1 + public/assets/quill/formats/background.d.ts | 5 + public/assets/quill/formats/background.js | 10 + public/assets/quill/formats/background.js.map | 1 + public/assets/quill/formats/blockquote.d.ts | 6 + public/assets/quill/formats/blockquote.js | 7 + public/assets/quill/formats/blockquote.js.map | 1 + public/assets/quill/formats/bold.d.ts | 11 + public/assets/quill/formats/bold.js | 19 + public/assets/quill/formats/bold.js.map | 1 + public/assets/quill/formats/code.d.ts | 15 + public/assets/quill/formats/code.js | 44 + public/assets/quill/formats/code.js.map | 1 + public/assets/quill/formats/color.d.ts | 7 + public/assets/quill/formats/color.js | 18 + public/assets/quill/formats/color.js.map | 1 + public/assets/quill/formats/direction.d.ts | 5 + public/assets/quill/formats/direction.js | 10 + public/assets/quill/formats/direction.js.map | 1 + public/assets/quill/formats/font.d.ts | 7 + public/assets/quill/formats/font.js | 14 + public/assets/quill/formats/font.js.map | 1 + public/assets/quill/formats/formula.d.ts | 10 + public/assets/quill/formats/formula.js | 33 + public/assets/quill/formats/formula.js.map | 1 + public/assets/quill/formats/header.d.ts | 7 + public/assets/quill/formats/header.js | 10 + public/assets/quill/formats/header.js.map | 1 + public/assets/quill/formats/image.d.ts | 13 + public/assets/quill/formats/image.js | 44 + public/assets/quill/formats/image.js.map | 1 + public/assets/quill/formats/indent.d.ts | 8 + public/assets/quill/formats/indent.js | 30 + public/assets/quill/formats/indent.js.map | 1 + public/assets/quill/formats/italic.d.ts | 6 + public/assets/quill/formats/italic.js | 7 + public/assets/quill/formats/italic.js.map | 1 + public/assets/quill/formats/link.d.ts | 13 + public/assets/quill/formats/link.js | 36 + public/assets/quill/formats/link.js.map | 1 + public/assets/quill/formats/list.d.ts | 13 + public/assets/quill/formats/list.js | 50 + public/assets/quill/formats/list.js.map | 1 + public/assets/quill/formats/script.d.ts | 8 + public/assets/quill/formats/script.js | 21 + public/assets/quill/formats/script.js.map | 1 + public/assets/quill/formats/size.d.ts | 4 + public/assets/quill/formats/size.js | 11 + public/assets/quill/formats/size.js.map | 1 + public/assets/quill/formats/strike.d.ts | 6 + public/assets/quill/formats/strike.js | 7 + public/assets/quill/formats/strike.js.map | 1 + public/assets/quill/formats/table.d.ts | 45 + public/assets/quill/formats/table.js | 176 + public/assets/quill/formats/table.js.map | 1 + public/assets/quill/formats/underline.d.ts | 6 + public/assets/quill/formats/underline.js | 7 + public/assets/quill/formats/underline.js.map | 1 + public/assets/quill/formats/video.d.ts | 14 + public/assets/quill/formats/video.js | 48 + public/assets/quill/formats/video.js.map | 1 + public/assets/quill/modules/clipboard.d.ts | 43 + public/assets/quill/modules/clipboard.js | 477 + public/assets/quill/modules/clipboard.js.map | 1 + public/assets/quill/modules/history.d.ts | 36 + public/assets/quill/modules/history.js | 178 + public/assets/quill/modules/history.js.map | 1 + public/assets/quill/modules/input.d.ts | 10 + public/assets/quill/modules/input.js | 83 + public/assets/quill/modules/input.js.map | 1 + public/assets/quill/modules/keyboard.d.ts | 58 + public/assets/quill/modules/keyboard.js | 713 + public/assets/quill/modules/keyboard.js.map | 1 + .../modules/normalizeExternalHTML/index.d.ts | 2 + .../modules/normalizeExternalHTML/index.js | 12 + .../normalizeExternalHTML/index.js.map | 1 + .../normalizers/googleDocs.d.ts | 1 + .../normalizers/googleDocs.js | 24 + .../normalizers/googleDocs.js.map | 1 + .../normalizers/msWord.d.ts | 1 + .../normalizers/msWord.js | 87 + .../normalizers/msWord.js.map | 1 + public/assets/quill/modules/syntax.d.ts | 50 + public/assets/quill/modules/syntax.js | 332 + public/assets/quill/modules/syntax.js.map | 1 + public/assets/quill/modules/table.d.ts | 20 + public/assets/quill/modules/table.js | 125 + public/assets/quill/modules/table.js.map | 1 + public/assets/quill/modules/tableEmbed.d.ts | 27 + public/assets/quill/modules/tableEmbed.js | 209 + public/assets/quill/modules/tableEmbed.js.map | 1 + public/assets/quill/modules/toolbar.d.ts | 24 + public/assets/quill/modules/toolbar.js | 265 + public/assets/quill/modules/toolbar.js.map | 1 + public/assets/quill/modules/uiNode.d.ts | 19 + public/assets/quill/modules/uiNode.js | 95 + public/assets/quill/modules/uiNode.js.map | 1 + public/assets/quill/modules/uploader.d.ts | 15 + public/assets/quill/modules/uploader.js | 69 + public/assets/quill/modules/uploader.js.map | 1 + public/assets/quill/package.json | 101 + public/assets/quill/quill.d.ts | 5 + public/assets/quill/quill.js | 82 + public/assets/quill/quill.js.map | 1 + public/assets/quill/themes/base.d.ts | 35 + public/assets/quill/themes/base.js | 257 + public/assets/quill/themes/base.js.map | 1 + public/assets/quill/themes/bubble.d.ts | 18 + public/assets/quill/themes/bubble.js | 114 + public/assets/quill/themes/bubble.js.map | 1 + public/assets/quill/themes/snow.d.ts | 9 + public/assets/quill/themes/snow.js | 122 + public/assets/quill/themes/snow.js.map | 1 + public/assets/quill/types.d.js | 2 + public/assets/quill/types.d.js.map | 1 + public/assets/quill/ui/color-picker.d.ts | 7 + public/assets/quill/ui/color-picker.js | 30 + public/assets/quill/ui/color-picker.js.map | 1 + public/assets/quill/ui/icon-picker.d.ts | 7 + public/assets/quill/ui/icon-picker.js | 22 + public/assets/quill/ui/icon-picker.js.map | 1 + public/assets/quill/ui/icons.d.ts | 49 + public/assets/quill/ui/icons.js | 82 + public/assets/quill/ui/icons.js.map | 1 + public/assets/quill/ui/picker.d.ts | 16 + public/assets/quill/ui/picker.js | 171 + public/assets/quill/ui/picker.js.map | 1 + public/assets/quill/ui/tooltip.d.ts | 12 + public/assets/quill/ui/tooltip.js | 56 + public/assets/quill/ui/tooltip.js.map | 1 + public/assets/sweetalert2/LICENSE | 22 + public/assets/sweetalert2/README.md | 95 + .../sweetalert2/dist/sweetalert2.all.js | 4825 +++++++ .../sweetalert2/dist/sweetalert2.all.min.js | 6 + .../assets/sweetalert2/dist/sweetalert2.css | 1233 ++ .../sweetalert2/dist/sweetalert2.esm.all.js | 4816 ++++++ .../dist/sweetalert2.esm.all.min.js | 6 + .../sweetalert2/dist/sweetalert2.esm.js | 4815 ++++++ .../sweetalert2/dist/sweetalert2.esm.min.js | 5 + public/assets/sweetalert2/dist/sweetalert2.js | 4824 +++++++ .../sweetalert2/dist/sweetalert2.min.css | 1 + .../sweetalert2/dist/sweetalert2.min.js | 5 + public/assets/sweetalert2/package.json | 87 + public/assets/sweetalert2/src/SweetAlert.js | 355 + .../sweetalert2/src/buttons-handlers.js | 177 + public/assets/sweetalert2/src/constants.js | 1 + public/assets/sweetalert2/src/globalState.js | 38 + .../assets/sweetalert2/src/instanceMethods.js | 7 + .../src/instanceMethods/_destroy.js | 104 + .../sweetalert2/src/instanceMethods/close.js | 229 + .../enable-disable-elements.js | 67 + .../src/instanceMethods/getInput.js | 17 + .../src/instanceMethods/hideLoading.js | 45 + .../sweetalert2/src/instanceMethods/update.js | 60 + .../src/instanceMethods/validation-message.js | 47 + .../assets/sweetalert2/src/keydown-handler.js | 222 + .../sweetalert2/src/popup-click-handler.js | 104 + .../assets/sweetalert2/src/privateMethods.js | 14 + public/assets/sweetalert2/src/privateProps.js | 14 + .../assets/sweetalert2/src/staticMethods.js | 9 + .../src/staticMethods/argsToParams.js | 35 + .../src/staticMethods/bindClickHandler.js | 31 + .../sweetalert2/src/staticMethods/dom.js | 47 + .../src/staticMethods/eventHandlers.js | 48 + .../sweetalert2/src/staticMethods/fire.js | 10 + .../sweetalert2/src/staticMethods/mixin.js | 34 + .../src/staticMethods/showLoading.js | 58 + .../sweetalert2/src/staticMethods/timer.js | 76 + public/assets/sweetalert2/src/sweetalert2.js | 7 + .../assets/sweetalert2/src/sweetalert2.scss | 1793 +++ public/assets/sweetalert2/src/types.js | 125 + .../sweetalert2/src/utils/DismissReason.js | 8 + .../sweetalert2/src/utils/EventEmitter.js | 94 + public/assets/sweetalert2/src/utils/Timer.js | 71 + public/assets/sweetalert2/src/utils/aria.js | 33 + .../assets/sweetalert2/src/utils/classes.js | 97 + .../src/utils/defaultInputValidators.js | 23 + .../sweetalert2/src/utils/dom/domUtils.js | 365 + .../sweetalert2/src/utils/dom/getters.js | 198 + .../assets/sweetalert2/src/utils/dom/index.js | 5 + .../assets/sweetalert2/src/utils/dom/init.js | 193 + .../sweetalert2/src/utils/dom/inputUtils.js | 239 + .../src/utils/dom/parseHtmlToContainer.js | 53 + .../src/utils/dom/renderers/render.js | 37 + .../src/utils/dom/renderers/renderActions.js | 127 + .../utils/dom/renderers/renderCloseButton.js | 20 + .../utils/dom/renderers/renderContainer.js | 62 + .../src/utils/dom/renderers/renderContent.js | 36 + .../src/utils/dom/renderers/renderFooter.js | 23 + .../src/utils/dom/renderers/renderIcon.js | 164 + .../src/utils/dom/renderers/renderImage.js | 32 + .../src/utils/dom/renderers/renderInput.js | 353 + .../src/utils/dom/renderers/renderPopup.js | 83 + .../dom/renderers/renderProgressSteps.js | 67 + .../src/utils/dom/renderers/renderTitle.js | 27 + .../assets/sweetalert2/src/utils/draggable.js | 99 + .../src/utils/getTemplateParams.js | 265 + public/assets/sweetalert2/src/utils/iosFix.js | 112 + .../assets/sweetalert2/src/utils/isNodeEnv.js | 6 + .../assets/sweetalert2/src/utils/openPopup.js | 139 + public/assets/sweetalert2/src/utils/params.js | 269 + .../assets/sweetalert2/src/utils/scrollbar.js | 48 + .../sweetalert2/src/utils/setParameters.js | 61 + public/assets/sweetalert2/src/utils/utils.js | 88 + public/assets/sweetalert2/sweetalert2.d.ts | 1315 ++ .../assets/sweetalert2/themes/bootstrap-4.css | 167 + .../assets/sweetalert2/themes/bootstrap-5.css | 173 + .../assets/sweetalert2/themes/borderless.css | 46 + public/assets/sweetalert2/themes/bulma.css | 94 + .../sweetalert2/themes/embed-iframe.css | 29 + .../assets/sweetalert2/themes/material-ui.css | 183 + public/assets/sweetalert2/themes/minimal.css | 40 + routes/admin_routes.go | 156 + routes/router.go | 147 + scripts/run_seed.go | 21 + scripts/seed.go | 235 + services/email_service.go | 53 + services/image_service.go | 190 + services/jwt_service.go | 125 + uploads/avatars/1771463327203925000.avif | Bin 0 -> 2193 bytes uploads/heroes/1771462786293897000.avif | Bin 0 -> 5411 bytes uploads/heroes/1771862104815889000.avif | Bin 0 -> 10437 bytes uploads/heroes/1771865266626275000.avif | Bin 0 -> 8204 bytes uploads/heroes/1771865441019283000.avif | Bin 0 -> 26790 bytes uploads/heroes/1771866031442506000.avif | Bin 0 -> 9476 bytes uploads/posts/1771859718082392000.avif | Bin 0 -> 108328 bytes uploads/posts/1771859721468633000.avif | Bin 0 -> 8975 bytes uploads/posts/1771859721610410000.avif | Bin 0 -> 1000 bytes uploads/posts/post_10_6d0da2.jpg | Bin 0 -> 232021 bytes uploads/posts/post_11_81d5ea.jpg | Bin 0 -> 232494 bytes uploads/posts/post_12_a0f35d.jpg | Bin 0 -> 62338 bytes uploads/posts/post_13_984031.jpg | Bin 0 -> 83506 bytes uploads/posts/post_14_43802d.jpg | Bin 0 -> 88896 bytes uploads/posts/post_15_0e7af1.jpg | Bin 0 -> 197291 bytes uploads/posts/post_16_cec1c8.jpg | Bin 0 -> 115237 bytes uploads/posts/post_17_be7a83.jpg | Bin 0 -> 49669 bytes uploads/posts/post_18_318387.jpg | Bin 0 -> 228228 bytes uploads/posts/post_19_0c9543.jpg | Bin 0 -> 46872 bytes uploads/posts/post_1_f40ccf.jpg | Bin 0 -> 55535 bytes uploads/posts/post_20_254902.jpg | Bin 0 -> 118484 bytes uploads/posts/post_21_04e3ed.jpg | Bin 0 -> 114646 bytes uploads/posts/post_22_7d2def.jpg | Bin 0 -> 95334 bytes uploads/posts/post_23_9ac486.jpg | Bin 0 -> 172925 bytes uploads/posts/post_24_3bcfff.jpg | Bin 0 -> 68565 bytes uploads/posts/post_25_396008.jpg | Bin 0 -> 129907 bytes uploads/posts/post_26_4a43f6.jpg | Bin 0 -> 64828 bytes uploads/posts/post_27_341378.jpg | Bin 0 -> 50592 bytes uploads/posts/post_28_f7cabe.jpg | Bin 0 -> 50799 bytes uploads/posts/post_29_8bdb87.jpg | Bin 0 -> 48713 bytes uploads/posts/post_2_a8f92e.jpg | Bin 0 -> 84489 bytes uploads/posts/post_30_36ddf7.jpg | Bin 0 -> 122638 bytes uploads/posts/post_31_7723a9.jpg | Bin 0 -> 185415 bytes uploads/posts/post_32_242d41.jpg | Bin 0 -> 105024 bytes uploads/posts/post_33_a677ef.jpg | Bin 0 -> 207007 bytes uploads/posts/post_34_602386.jpg | Bin 0 -> 35018 bytes uploads/posts/post_35_98d2e4.jpg | Bin 0 -> 78603 bytes uploads/posts/post_36_480892.jpg | Bin 0 -> 115391 bytes uploads/posts/post_37_88102c.jpg | Bin 0 -> 78737 bytes uploads/posts/post_38_d71be4.jpg | Bin 0 -> 206347 bytes uploads/posts/post_39_cfa50c.jpg | Bin 0 -> 62338 bytes uploads/posts/post_3_4dd9d8.jpg | Bin 0 -> 180461 bytes uploads/posts/post_4_f4d82a.jpg | Bin 0 -> 99800 bytes uploads/posts/post_5_3586d4.jpg | Bin 0 -> 122638 bytes uploads/posts/post_6_6b99f4.jpg | Bin 0 -> 313614 bytes uploads/posts/post_7_7c5ec2.jpg | Bin 0 -> 84670 bytes uploads/posts/post_8_b68a8f.jpg | Bin 0 -> 185799 bytes uploads/posts/post_9_4afa25.jpg | Bin 0 -> 119848 bytes uploads/products/1771671930149210000.avif | Bin 0 -> 5782 bytes uploads/products/1771672200043681000.avif | Bin 0 -> 17352 bytes uploads/products/1771672263636058000.avif | Bin 0 -> 20332 bytes uploads/products/1771672413521924000.avif | Bin 0 -> 19696 bytes uploads/products/1771672442685189000.avif | Bin 0 -> 26465 bytes uploads/products/1771672519906779000.avif | Bin 0 -> 96321 bytes uploads/products/1771672563773818000.avif | Bin 0 -> 13880 bytes uploads/products/1771672644175870000.avif | Bin 0 -> 58074 bytes uploads/settings/1771462772417753000.avif | Bin 0 -> 5411 bytes uploads/settings/1771462773364545000.avif | Bin 0 -> 5411 bytes views/admin/layout.html | 442 + views/admin/login.html | 66 + views/admin/pages/category_form.html | 75 + views/admin/pages/hero_form.html | 113 + views/admin/pages/post_form.html | 161 + views/admin/pages/product_category_form.html | 87 + views/admin/pages/product_form.html | 191 + views/admin/pages/product_tag_form.html | 22 + views/admin/pages/tag_form.html | 21 + views/admin/pages/user_form.html | 79 + views/admin/partials/carts.html | 64 + views/admin/partials/categories.html | 82 + views/admin/partials/category_views.html | 71 + views/admin/partials/comments.html | 74 + views/admin/partials/dashboard.html | 75 + views/admin/partials/posts.html | 90 + views/admin/partials/product_categories.html | 73 + .../partials/product_category_views.html | 46 + views/admin/partials/product_comments.html | 65 + views/admin/partials/product_tags.html | 63 + views/admin/partials/products.html | 102 + views/admin/partials/settings.html | 538 + views/admin/partials/tags.html | 71 + views/admin/partials/users.html | 118 + views/coming_soon.html | 172 + 1982 files changed, 284835 insertions(+) create mode 100644 .air.toml create mode 100644 .env create mode 100644 .env.copy create mode 100644 .gitignore create mode 100644 Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXV create mode 100644 Dockerfile create mode 100644 belgeler/admin_panel.md create mode 100644 config/config.go create mode 100644 config/loger.go create mode 100644 controllers/admin_cart_controller.go create mode 100644 controllers/admin_controller.go create mode 100644 controllers/admin_product_controller.go create mode 100644 controllers/api_cart_controller.go create mode 100644 controllers/blog_controller.go create mode 100644 controllers/hero_controller.go create mode 100644 controllers/product_controller.go create mode 100644 controllers/security_controller.go create mode 100644 controllers/setting_controller.go create mode 100644 controllers/user.go create mode 100644 database/config/mysql_db.go create mode 100644 database/config/postgres_db.go create mode 100644 database/config/redis_db.go create mode 100644 database/migrate/migrate.go create mode 100644 database/models/blog.go create mode 100644 database/models/cart.go create mode 100644 database/models/cors.go create mode 100644 database/models/docs_models.go create mode 100644 database/models/hero.go create mode 100644 database/models/product.go create mode 100644 database/models/setting.go create mode 100644 database/models/user.go create mode 100644 database/seeder/seeder.go create mode 100644 docker-compose.c.yml create mode 100644 docker-compose.yml create mode 100644 docker-entrypoint.sh create mode 100644 docs/docs.go create mode 100644 docs/swagger.json create mode 100644 docs/swagger.yaml create mode 100644 go.mod create mode 100644 go.sum create mode 100644 info.log create mode 100644 main.go create mode 100644 middlewares/auth_middleware.go create mode 100644 middlewares/dynamic_cors.go create mode 100644 middlewares/rate_limit.go create mode 100644 middlewares/reject_all_middleware.go create mode 100644 pkg/utis/slug.go create mode 100644 pkg/utis/token.go create mode 100644 public/admin/css/theme.css create mode 100644 public/admin/js/main.js create mode 100644 public/assets/.package-lock.json create mode 100644 public/assets/@popperjs/core/LICENSE.md create mode 100644 public/assets/@popperjs/core/README.md create mode 100644 public/assets/@popperjs/core/dist/cjs/enums.js create mode 100644 public/assets/@popperjs/core/dist/cjs/enums.js.flow create mode 100644 public/assets/@popperjs/core/dist/cjs/enums.js.map create mode 100644 public/assets/@popperjs/core/dist/cjs/popper-base.js create mode 100644 public/assets/@popperjs/core/dist/cjs/popper-base.js.flow create mode 100644 public/assets/@popperjs/core/dist/cjs/popper-base.js.map create mode 100644 public/assets/@popperjs/core/dist/cjs/popper-lite.js create mode 100644 public/assets/@popperjs/core/dist/cjs/popper-lite.js.flow create mode 100644 public/assets/@popperjs/core/dist/cjs/popper-lite.js.map create mode 100644 public/assets/@popperjs/core/dist/cjs/popper.js create mode 100644 public/assets/@popperjs/core/dist/cjs/popper.js.flow create mode 100644 public/assets/@popperjs/core/dist/cjs/popper.js.map create mode 100644 public/assets/@popperjs/core/dist/esm/createPopper.js create mode 100644 public/assets/@popperjs/core/dist/esm/dom-utils/contains.js create mode 100644 public/assets/@popperjs/core/dist/esm/dom-utils/getBoundingClientRect.js create mode 100644 public/assets/@popperjs/core/dist/esm/dom-utils/getClippingRect.js create mode 100644 public/assets/@popperjs/core/dist/esm/dom-utils/getCompositeRect.js create mode 100644 public/assets/@popperjs/core/dist/esm/dom-utils/getComputedStyle.js create mode 100644 public/assets/@popperjs/core/dist/esm/dom-utils/getDocumentElement.js create mode 100644 public/assets/@popperjs/core/dist/esm/dom-utils/getDocumentRect.js create mode 100644 public/assets/@popperjs/core/dist/esm/dom-utils/getHTMLElementScroll.js create mode 100644 public/assets/@popperjs/core/dist/esm/dom-utils/getLayoutRect.js create mode 100644 public/assets/@popperjs/core/dist/esm/dom-utils/getNodeName.js create mode 100644 public/assets/@popperjs/core/dist/esm/dom-utils/getNodeScroll.js create mode 100644 public/assets/@popperjs/core/dist/esm/dom-utils/getOffsetParent.js create mode 100644 public/assets/@popperjs/core/dist/esm/dom-utils/getParentNode.js create mode 100644 public/assets/@popperjs/core/dist/esm/dom-utils/getScrollParent.js create mode 100644 public/assets/@popperjs/core/dist/esm/dom-utils/getViewportRect.js create mode 100644 public/assets/@popperjs/core/dist/esm/dom-utils/getWindow.js create mode 100644 public/assets/@popperjs/core/dist/esm/dom-utils/getWindowScroll.js create mode 100644 public/assets/@popperjs/core/dist/esm/dom-utils/getWindowScrollBarX.js create mode 100644 public/assets/@popperjs/core/dist/esm/dom-utils/instanceOf.js create mode 100644 public/assets/@popperjs/core/dist/esm/dom-utils/isLayoutViewport.js create mode 100644 public/assets/@popperjs/core/dist/esm/dom-utils/isScrollParent.js create mode 100644 public/assets/@popperjs/core/dist/esm/dom-utils/isTableElement.js create mode 100644 public/assets/@popperjs/core/dist/esm/dom-utils/listScrollParents.js create mode 100644 public/assets/@popperjs/core/dist/esm/enums.js create mode 100644 public/assets/@popperjs/core/dist/esm/index.js create mode 100644 public/assets/@popperjs/core/dist/esm/modifiers/applyStyles.js create mode 100644 public/assets/@popperjs/core/dist/esm/modifiers/arrow.js create mode 100644 public/assets/@popperjs/core/dist/esm/modifiers/computeStyles.js create mode 100644 public/assets/@popperjs/core/dist/esm/modifiers/eventListeners.js create mode 100644 public/assets/@popperjs/core/dist/esm/modifiers/flip.js create mode 100644 public/assets/@popperjs/core/dist/esm/modifiers/hide.js create mode 100644 public/assets/@popperjs/core/dist/esm/modifiers/index.js create mode 100644 public/assets/@popperjs/core/dist/esm/modifiers/offset.js create mode 100644 public/assets/@popperjs/core/dist/esm/modifiers/popperOffsets.js create mode 100644 public/assets/@popperjs/core/dist/esm/modifiers/preventOverflow.js create mode 100644 public/assets/@popperjs/core/dist/esm/popper-base.js create mode 100644 public/assets/@popperjs/core/dist/esm/popper-lite.js create mode 100644 public/assets/@popperjs/core/dist/esm/popper.js create mode 100644 public/assets/@popperjs/core/dist/esm/types.js create mode 100644 public/assets/@popperjs/core/dist/esm/utils/computeAutoPlacement.js create mode 100644 public/assets/@popperjs/core/dist/esm/utils/computeOffsets.js create mode 100644 public/assets/@popperjs/core/dist/esm/utils/debounce.js create mode 100644 public/assets/@popperjs/core/dist/esm/utils/detectOverflow.js create mode 100644 public/assets/@popperjs/core/dist/esm/utils/expandToHashMap.js create mode 100644 public/assets/@popperjs/core/dist/esm/utils/getAltAxis.js create mode 100644 public/assets/@popperjs/core/dist/esm/utils/getAltLen.js create mode 100644 public/assets/@popperjs/core/dist/esm/utils/getBasePlacement.js create mode 100644 public/assets/@popperjs/core/dist/esm/utils/getFreshSideObject.js create mode 100644 public/assets/@popperjs/core/dist/esm/utils/getMainAxisFromPlacement.js create mode 100644 public/assets/@popperjs/core/dist/esm/utils/getOppositePlacement.js create mode 100644 public/assets/@popperjs/core/dist/esm/utils/getOppositeVariationPlacement.js create mode 100644 public/assets/@popperjs/core/dist/esm/utils/getVariation.js create mode 100644 public/assets/@popperjs/core/dist/esm/utils/math.js create mode 100644 public/assets/@popperjs/core/dist/esm/utils/mergeByName.js create mode 100644 public/assets/@popperjs/core/dist/esm/utils/mergePaddingObject.js create mode 100644 public/assets/@popperjs/core/dist/esm/utils/orderModifiers.js create mode 100644 public/assets/@popperjs/core/dist/esm/utils/rectToClientRect.js create mode 100644 public/assets/@popperjs/core/dist/esm/utils/uniqueBy.js create mode 100644 public/assets/@popperjs/core/dist/esm/utils/userAgent.js create mode 100644 public/assets/@popperjs/core/dist/esm/utils/within.js create mode 100644 public/assets/@popperjs/core/dist/umd/enums.js create mode 100644 public/assets/@popperjs/core/dist/umd/enums.js.map create mode 100644 public/assets/@popperjs/core/dist/umd/enums.min.js create mode 100644 public/assets/@popperjs/core/dist/umd/enums.min.js.flow create mode 100644 public/assets/@popperjs/core/dist/umd/enums.min.js.map create mode 100644 public/assets/@popperjs/core/dist/umd/popper-base.js create mode 100644 public/assets/@popperjs/core/dist/umd/popper-base.js.map create mode 100644 public/assets/@popperjs/core/dist/umd/popper-base.min.js create mode 100644 public/assets/@popperjs/core/dist/umd/popper-base.min.js.flow create mode 100644 public/assets/@popperjs/core/dist/umd/popper-base.min.js.map create mode 100644 public/assets/@popperjs/core/dist/umd/popper-lite.js create mode 100644 public/assets/@popperjs/core/dist/umd/popper-lite.js.map create mode 100644 public/assets/@popperjs/core/dist/umd/popper-lite.min.js create mode 100644 public/assets/@popperjs/core/dist/umd/popper-lite.min.js.flow create mode 100644 public/assets/@popperjs/core/dist/umd/popper-lite.min.js.map create mode 100644 public/assets/@popperjs/core/dist/umd/popper.js create mode 100644 public/assets/@popperjs/core/dist/umd/popper.js.map create mode 100644 public/assets/@popperjs/core/dist/umd/popper.min.js create mode 100644 public/assets/@popperjs/core/dist/umd/popper.min.js.flow create mode 100644 public/assets/@popperjs/core/dist/umd/popper.min.js.map create mode 100644 public/assets/@popperjs/core/index.d.ts create mode 100644 public/assets/@popperjs/core/lib/createPopper.d.ts create mode 100644 public/assets/@popperjs/core/lib/createPopper.js create mode 100644 public/assets/@popperjs/core/lib/createPopper.js.flow create mode 100644 public/assets/@popperjs/core/lib/dom-utils/contains.d.ts create mode 100644 public/assets/@popperjs/core/lib/dom-utils/contains.js create mode 100644 public/assets/@popperjs/core/lib/dom-utils/contains.js.flow create mode 100644 public/assets/@popperjs/core/lib/dom-utils/getBoundingClientRect.d.ts create mode 100644 public/assets/@popperjs/core/lib/dom-utils/getBoundingClientRect.js create mode 100644 public/assets/@popperjs/core/lib/dom-utils/getBoundingClientRect.js.flow create mode 100644 public/assets/@popperjs/core/lib/dom-utils/getClippingRect.d.ts create mode 100644 public/assets/@popperjs/core/lib/dom-utils/getClippingRect.js create mode 100644 public/assets/@popperjs/core/lib/dom-utils/getClippingRect.js.flow create mode 100644 public/assets/@popperjs/core/lib/dom-utils/getCompositeRect.d.ts create mode 100644 public/assets/@popperjs/core/lib/dom-utils/getCompositeRect.js create mode 100644 public/assets/@popperjs/core/lib/dom-utils/getCompositeRect.js.flow create mode 100644 public/assets/@popperjs/core/lib/dom-utils/getComputedStyle.d.ts create mode 100644 public/assets/@popperjs/core/lib/dom-utils/getComputedStyle.js create mode 100644 public/assets/@popperjs/core/lib/dom-utils/getComputedStyle.js.flow create mode 100644 public/assets/@popperjs/core/lib/dom-utils/getDocumentElement.d.ts create mode 100644 public/assets/@popperjs/core/lib/dom-utils/getDocumentElement.js create mode 100644 public/assets/@popperjs/core/lib/dom-utils/getDocumentElement.js.flow create mode 100644 public/assets/@popperjs/core/lib/dom-utils/getDocumentRect.d.ts create mode 100644 public/assets/@popperjs/core/lib/dom-utils/getDocumentRect.js create mode 100644 public/assets/@popperjs/core/lib/dom-utils/getDocumentRect.js.flow create mode 100644 public/assets/@popperjs/core/lib/dom-utils/getHTMLElementScroll.d.ts create mode 100644 public/assets/@popperjs/core/lib/dom-utils/getHTMLElementScroll.js create mode 100644 public/assets/@popperjs/core/lib/dom-utils/getHTMLElementScroll.js.flow create mode 100644 public/assets/@popperjs/core/lib/dom-utils/getLayoutRect.d.ts create mode 100644 public/assets/@popperjs/core/lib/dom-utils/getLayoutRect.js create mode 100644 public/assets/@popperjs/core/lib/dom-utils/getLayoutRect.js.flow create mode 100644 public/assets/@popperjs/core/lib/dom-utils/getNodeName.d.ts create mode 100644 public/assets/@popperjs/core/lib/dom-utils/getNodeName.js create mode 100644 public/assets/@popperjs/core/lib/dom-utils/getNodeName.js.flow create mode 100644 public/assets/@popperjs/core/lib/dom-utils/getNodeScroll.d.ts create mode 100644 public/assets/@popperjs/core/lib/dom-utils/getNodeScroll.js create mode 100644 public/assets/@popperjs/core/lib/dom-utils/getNodeScroll.js.flow create mode 100644 public/assets/@popperjs/core/lib/dom-utils/getOffsetParent.d.ts create mode 100644 public/assets/@popperjs/core/lib/dom-utils/getOffsetParent.js create mode 100644 public/assets/@popperjs/core/lib/dom-utils/getOffsetParent.js.flow create mode 100644 public/assets/@popperjs/core/lib/dom-utils/getParentNode.d.ts create mode 100644 public/assets/@popperjs/core/lib/dom-utils/getParentNode.js create mode 100644 public/assets/@popperjs/core/lib/dom-utils/getParentNode.js.flow create mode 100644 public/assets/@popperjs/core/lib/dom-utils/getScrollParent.d.ts create mode 100644 public/assets/@popperjs/core/lib/dom-utils/getScrollParent.js create mode 100644 public/assets/@popperjs/core/lib/dom-utils/getScrollParent.js.flow create mode 100644 public/assets/@popperjs/core/lib/dom-utils/getViewportRect.d.ts create mode 100644 public/assets/@popperjs/core/lib/dom-utils/getViewportRect.js create mode 100644 public/assets/@popperjs/core/lib/dom-utils/getViewportRect.js.flow create mode 100644 public/assets/@popperjs/core/lib/dom-utils/getWindow.d.ts create mode 100644 public/assets/@popperjs/core/lib/dom-utils/getWindow.js create mode 100644 public/assets/@popperjs/core/lib/dom-utils/getWindow.js.flow create mode 100644 public/assets/@popperjs/core/lib/dom-utils/getWindowScroll.d.ts create mode 100644 public/assets/@popperjs/core/lib/dom-utils/getWindowScroll.js create mode 100644 public/assets/@popperjs/core/lib/dom-utils/getWindowScroll.js.flow create mode 100644 public/assets/@popperjs/core/lib/dom-utils/getWindowScrollBarX.d.ts create mode 100644 public/assets/@popperjs/core/lib/dom-utils/getWindowScrollBarX.js create mode 100644 public/assets/@popperjs/core/lib/dom-utils/getWindowScrollBarX.js.flow create mode 100644 public/assets/@popperjs/core/lib/dom-utils/instanceOf.d.ts create mode 100644 public/assets/@popperjs/core/lib/dom-utils/instanceOf.js create mode 100644 public/assets/@popperjs/core/lib/dom-utils/instanceOf.js.flow create mode 100644 public/assets/@popperjs/core/lib/dom-utils/isLayoutViewport.d.ts create mode 100644 public/assets/@popperjs/core/lib/dom-utils/isLayoutViewport.js create mode 100644 public/assets/@popperjs/core/lib/dom-utils/isLayoutViewport.js.flow create mode 100644 public/assets/@popperjs/core/lib/dom-utils/isScrollParent.d.ts create mode 100644 public/assets/@popperjs/core/lib/dom-utils/isScrollParent.js create mode 100644 public/assets/@popperjs/core/lib/dom-utils/isScrollParent.js.flow create mode 100644 public/assets/@popperjs/core/lib/dom-utils/isTableElement.d.ts create mode 100644 public/assets/@popperjs/core/lib/dom-utils/isTableElement.js create mode 100644 public/assets/@popperjs/core/lib/dom-utils/isTableElement.js.flow create mode 100644 public/assets/@popperjs/core/lib/dom-utils/listScrollParents.d.ts create mode 100644 public/assets/@popperjs/core/lib/dom-utils/listScrollParents.js create mode 100644 public/assets/@popperjs/core/lib/dom-utils/listScrollParents.js.flow create mode 100644 public/assets/@popperjs/core/lib/enums.d.ts create mode 100644 public/assets/@popperjs/core/lib/enums.js create mode 100644 public/assets/@popperjs/core/lib/enums.js.flow create mode 100644 public/assets/@popperjs/core/lib/index.d.ts create mode 100644 public/assets/@popperjs/core/lib/index.js create mode 100644 public/assets/@popperjs/core/lib/index.js.flow create mode 100644 public/assets/@popperjs/core/lib/modifiers/applyStyles.d.ts create mode 100644 public/assets/@popperjs/core/lib/modifiers/applyStyles.js create mode 100644 public/assets/@popperjs/core/lib/modifiers/applyStyles.js.flow create mode 100644 public/assets/@popperjs/core/lib/modifiers/arrow.d.ts create mode 100644 public/assets/@popperjs/core/lib/modifiers/arrow.js create mode 100644 public/assets/@popperjs/core/lib/modifiers/arrow.js.flow create mode 100644 public/assets/@popperjs/core/lib/modifiers/computeStyles.d.ts create mode 100644 public/assets/@popperjs/core/lib/modifiers/computeStyles.js create mode 100644 public/assets/@popperjs/core/lib/modifiers/computeStyles.js.flow create mode 100644 public/assets/@popperjs/core/lib/modifiers/eventListeners.d.ts create mode 100644 public/assets/@popperjs/core/lib/modifiers/eventListeners.js create mode 100644 public/assets/@popperjs/core/lib/modifiers/eventListeners.js.flow create mode 100644 public/assets/@popperjs/core/lib/modifiers/flip.d.ts create mode 100644 public/assets/@popperjs/core/lib/modifiers/flip.js create mode 100644 public/assets/@popperjs/core/lib/modifiers/flip.js.flow create mode 100644 public/assets/@popperjs/core/lib/modifiers/hide.d.ts create mode 100644 public/assets/@popperjs/core/lib/modifiers/hide.js create mode 100644 public/assets/@popperjs/core/lib/modifiers/hide.js.flow create mode 100644 public/assets/@popperjs/core/lib/modifiers/index.d.ts create mode 100644 public/assets/@popperjs/core/lib/modifiers/index.js create mode 100644 public/assets/@popperjs/core/lib/modifiers/index.js.flow create mode 100644 public/assets/@popperjs/core/lib/modifiers/offset.d.ts create mode 100644 public/assets/@popperjs/core/lib/modifiers/offset.js create mode 100644 public/assets/@popperjs/core/lib/modifiers/offset.js.flow create mode 100644 public/assets/@popperjs/core/lib/modifiers/popperOffsets.d.ts create mode 100644 public/assets/@popperjs/core/lib/modifiers/popperOffsets.js create mode 100644 public/assets/@popperjs/core/lib/modifiers/popperOffsets.js.flow create mode 100644 public/assets/@popperjs/core/lib/modifiers/preventOverflow.d.ts create mode 100644 public/assets/@popperjs/core/lib/modifiers/preventOverflow.js create mode 100644 public/assets/@popperjs/core/lib/modifiers/preventOverflow.js.flow create mode 100644 public/assets/@popperjs/core/lib/popper-base.d.ts create mode 100644 public/assets/@popperjs/core/lib/popper-base.js create mode 100644 public/assets/@popperjs/core/lib/popper-base.js.flow create mode 100644 public/assets/@popperjs/core/lib/popper-lite.d.ts create mode 100644 public/assets/@popperjs/core/lib/popper-lite.js create mode 100644 public/assets/@popperjs/core/lib/popper-lite.js.flow create mode 100644 public/assets/@popperjs/core/lib/popper.d.ts create mode 100644 public/assets/@popperjs/core/lib/popper.js create mode 100644 public/assets/@popperjs/core/lib/popper.js.flow create mode 100644 public/assets/@popperjs/core/lib/types.d.ts create mode 100644 public/assets/@popperjs/core/lib/types.js create mode 100644 public/assets/@popperjs/core/lib/types.js.flow create mode 100644 public/assets/@popperjs/core/lib/utils/computeAutoPlacement.d.ts create mode 100644 public/assets/@popperjs/core/lib/utils/computeAutoPlacement.js create mode 100644 public/assets/@popperjs/core/lib/utils/computeAutoPlacement.js.flow create mode 100644 public/assets/@popperjs/core/lib/utils/computeOffsets.d.ts create mode 100644 public/assets/@popperjs/core/lib/utils/computeOffsets.js create mode 100644 public/assets/@popperjs/core/lib/utils/computeOffsets.js.flow create mode 100644 public/assets/@popperjs/core/lib/utils/debounce.d.ts create mode 100644 public/assets/@popperjs/core/lib/utils/debounce.js create mode 100644 public/assets/@popperjs/core/lib/utils/debounce.js.flow create mode 100644 public/assets/@popperjs/core/lib/utils/detectOverflow.d.ts create mode 100644 public/assets/@popperjs/core/lib/utils/detectOverflow.js create mode 100644 public/assets/@popperjs/core/lib/utils/detectOverflow.js.flow create mode 100644 public/assets/@popperjs/core/lib/utils/expandToHashMap.d.ts create mode 100644 public/assets/@popperjs/core/lib/utils/expandToHashMap.js create mode 100644 public/assets/@popperjs/core/lib/utils/expandToHashMap.js.flow create mode 100644 public/assets/@popperjs/core/lib/utils/getAltAxis.d.ts create mode 100644 public/assets/@popperjs/core/lib/utils/getAltAxis.js create mode 100644 public/assets/@popperjs/core/lib/utils/getAltAxis.js.flow create mode 100644 public/assets/@popperjs/core/lib/utils/getAltLen.d.ts create mode 100644 public/assets/@popperjs/core/lib/utils/getAltLen.js create mode 100644 public/assets/@popperjs/core/lib/utils/getAltLen.js.flow create mode 100644 public/assets/@popperjs/core/lib/utils/getBasePlacement.d.ts create mode 100644 public/assets/@popperjs/core/lib/utils/getBasePlacement.js create mode 100644 public/assets/@popperjs/core/lib/utils/getBasePlacement.js.flow create mode 100644 public/assets/@popperjs/core/lib/utils/getFreshSideObject.d.ts create mode 100644 public/assets/@popperjs/core/lib/utils/getFreshSideObject.js create mode 100644 public/assets/@popperjs/core/lib/utils/getFreshSideObject.js.flow create mode 100644 public/assets/@popperjs/core/lib/utils/getMainAxisFromPlacement.d.ts create mode 100644 public/assets/@popperjs/core/lib/utils/getMainAxisFromPlacement.js create mode 100644 public/assets/@popperjs/core/lib/utils/getMainAxisFromPlacement.js.flow create mode 100644 public/assets/@popperjs/core/lib/utils/getOppositePlacement.d.ts create mode 100644 public/assets/@popperjs/core/lib/utils/getOppositePlacement.js create mode 100644 public/assets/@popperjs/core/lib/utils/getOppositePlacement.js.flow create mode 100644 public/assets/@popperjs/core/lib/utils/getOppositeVariationPlacement.d.ts create mode 100644 public/assets/@popperjs/core/lib/utils/getOppositeVariationPlacement.js create mode 100644 public/assets/@popperjs/core/lib/utils/getOppositeVariationPlacement.js.flow create mode 100644 public/assets/@popperjs/core/lib/utils/getVariation.d.ts create mode 100644 public/assets/@popperjs/core/lib/utils/getVariation.js create mode 100644 public/assets/@popperjs/core/lib/utils/getVariation.js.flow create mode 100644 public/assets/@popperjs/core/lib/utils/math.d.ts create mode 100644 public/assets/@popperjs/core/lib/utils/math.js create mode 100644 public/assets/@popperjs/core/lib/utils/math.js.flow create mode 100644 public/assets/@popperjs/core/lib/utils/mergeByName.d.ts create mode 100644 public/assets/@popperjs/core/lib/utils/mergeByName.js create mode 100644 public/assets/@popperjs/core/lib/utils/mergeByName.js.flow create mode 100644 public/assets/@popperjs/core/lib/utils/mergePaddingObject.d.ts create mode 100644 public/assets/@popperjs/core/lib/utils/mergePaddingObject.js create mode 100644 public/assets/@popperjs/core/lib/utils/mergePaddingObject.js.flow create mode 100644 public/assets/@popperjs/core/lib/utils/orderModifiers.d.ts create mode 100644 public/assets/@popperjs/core/lib/utils/orderModifiers.js create mode 100644 public/assets/@popperjs/core/lib/utils/orderModifiers.js.flow create mode 100644 public/assets/@popperjs/core/lib/utils/rectToClientRect.d.ts create mode 100644 public/assets/@popperjs/core/lib/utils/rectToClientRect.js create mode 100644 public/assets/@popperjs/core/lib/utils/rectToClientRect.js.flow create mode 100644 public/assets/@popperjs/core/lib/utils/uniqueBy.d.ts create mode 100644 public/assets/@popperjs/core/lib/utils/uniqueBy.js create mode 100644 public/assets/@popperjs/core/lib/utils/uniqueBy.js.flow create mode 100644 public/assets/@popperjs/core/lib/utils/userAgent.d.ts create mode 100644 public/assets/@popperjs/core/lib/utils/userAgent.js create mode 100644 public/assets/@popperjs/core/lib/utils/userAgent.js.flow create mode 100644 public/assets/@popperjs/core/lib/utils/within.d.ts create mode 100644 public/assets/@popperjs/core/lib/utils/within.js create mode 100644 public/assets/@popperjs/core/lib/utils/within.js.flow create mode 100644 public/assets/@popperjs/core/package.json create mode 100644 public/assets/@vue/reactivity/LICENSE create mode 100644 public/assets/@vue/reactivity/README.md create mode 100644 public/assets/@vue/reactivity/dist/reactivity.cjs.js create mode 100644 public/assets/@vue/reactivity/dist/reactivity.cjs.prod.js create mode 100644 public/assets/@vue/reactivity/dist/reactivity.d.ts create mode 100644 public/assets/@vue/reactivity/dist/reactivity.esm-browser.js create mode 100644 public/assets/@vue/reactivity/dist/reactivity.esm-browser.prod.js create mode 100644 public/assets/@vue/reactivity/dist/reactivity.esm-bundler.js create mode 100644 public/assets/@vue/reactivity/dist/reactivity.global.js create mode 100644 public/assets/@vue/reactivity/dist/reactivity.global.prod.js create mode 100644 public/assets/@vue/reactivity/index.js create mode 100644 public/assets/@vue/reactivity/package.json create mode 100644 public/assets/@vue/shared/LICENSE create mode 100644 public/assets/@vue/shared/README.md create mode 100644 public/assets/@vue/shared/dist/shared.cjs.js create mode 100644 public/assets/@vue/shared/dist/shared.cjs.prod.js create mode 100644 public/assets/@vue/shared/dist/shared.d.ts create mode 100644 public/assets/@vue/shared/dist/shared.esm-bundler.js create mode 100644 public/assets/@vue/shared/index.js create mode 100644 public/assets/@vue/shared/package.json create mode 100644 public/assets/alpinejs/builds/cdn.js create mode 100644 public/assets/alpinejs/builds/module.js create mode 100644 public/assets/alpinejs/dist/cdn.js create mode 100644 public/assets/alpinejs/dist/cdn.min.js create mode 100644 public/assets/alpinejs/dist/module.cjs.js create mode 100644 public/assets/alpinejs/dist/module.esm.js create mode 100644 public/assets/alpinejs/dist/module.esm.min.js create mode 100644 public/assets/alpinejs/package.json create mode 100644 public/assets/alpinejs/src/alpine.js create mode 100644 public/assets/alpinejs/src/binds.js create mode 100644 public/assets/alpinejs/src/clone.js create mode 100644 public/assets/alpinejs/src/datas.js create mode 100644 public/assets/alpinejs/src/directives.js create mode 100644 public/assets/alpinejs/src/directives/index.js create mode 100644 public/assets/alpinejs/src/directives/x-bind.js create mode 100644 public/assets/alpinejs/src/directives/x-cloak.js create mode 100644 public/assets/alpinejs/src/directives/x-data.js create mode 100644 public/assets/alpinejs/src/directives/x-effect.js create mode 100644 public/assets/alpinejs/src/directives/x-for.js create mode 100644 public/assets/alpinejs/src/directives/x-html.js create mode 100644 public/assets/alpinejs/src/directives/x-id.js create mode 100644 public/assets/alpinejs/src/directives/x-if.js create mode 100644 public/assets/alpinejs/src/directives/x-ignore.js create mode 100644 public/assets/alpinejs/src/directives/x-init.js create mode 100644 public/assets/alpinejs/src/directives/x-model.js create mode 100644 public/assets/alpinejs/src/directives/x-modelable.js create mode 100644 public/assets/alpinejs/src/directives/x-on.js create mode 100644 public/assets/alpinejs/src/directives/x-ref.js create mode 100644 public/assets/alpinejs/src/directives/x-show.js create mode 100644 public/assets/alpinejs/src/directives/x-teleport.js create mode 100644 public/assets/alpinejs/src/directives/x-text.js create mode 100644 public/assets/alpinejs/src/directives/x-transition.js create mode 100644 public/assets/alpinejs/src/entangle.js create mode 100644 public/assets/alpinejs/src/evaluator.js create mode 100644 public/assets/alpinejs/src/ids.js create mode 100644 public/assets/alpinejs/src/index.js create mode 100644 public/assets/alpinejs/src/interceptor.js create mode 100644 public/assets/alpinejs/src/lifecycle.js create mode 100644 public/assets/alpinejs/src/magics.js create mode 100644 public/assets/alpinejs/src/magics/$data.js create mode 100644 public/assets/alpinejs/src/magics/$dispatch.js create mode 100644 public/assets/alpinejs/src/magics/$el.js create mode 100644 public/assets/alpinejs/src/magics/$id.js create mode 100644 public/assets/alpinejs/src/magics/$nextTick.js create mode 100644 public/assets/alpinejs/src/magics/$refs.js create mode 100644 public/assets/alpinejs/src/magics/$root.js create mode 100644 public/assets/alpinejs/src/magics/$store.js create mode 100644 public/assets/alpinejs/src/magics/$watch.js create mode 100644 public/assets/alpinejs/src/magics/index.js create mode 100644 public/assets/alpinejs/src/mutation.js create mode 100644 public/assets/alpinejs/src/nextTick.js create mode 100644 public/assets/alpinejs/src/plugin.js create mode 100644 public/assets/alpinejs/src/reactivity.js create mode 100644 public/assets/alpinejs/src/scheduler.js create mode 100644 public/assets/alpinejs/src/scope.js create mode 100644 public/assets/alpinejs/src/store.js create mode 100644 public/assets/alpinejs/src/utils/bind.js create mode 100644 public/assets/alpinejs/src/utils/classes.js create mode 100644 public/assets/alpinejs/src/utils/debounce.js create mode 100644 public/assets/alpinejs/src/utils/dispatch.js create mode 100644 public/assets/alpinejs/src/utils/error.js create mode 100644 public/assets/alpinejs/src/utils/on.js create mode 100644 public/assets/alpinejs/src/utils/once.js create mode 100644 public/assets/alpinejs/src/utils/styles.js create mode 100644 public/assets/alpinejs/src/utils/throttle.js create mode 100644 public/assets/alpinejs/src/utils/walk.js create mode 100644 public/assets/alpinejs/src/utils/warn.js create mode 100644 public/assets/bootstrap/LICENSE create mode 100644 public/assets/bootstrap/README.md create mode 100644 public/assets/bootstrap/dist/css/bootstrap-grid.css create mode 100644 public/assets/bootstrap/dist/css/bootstrap-grid.css.map create mode 100644 public/assets/bootstrap/dist/css/bootstrap-grid.min.css create mode 100644 public/assets/bootstrap/dist/css/bootstrap-grid.min.css.map create mode 100644 public/assets/bootstrap/dist/css/bootstrap-grid.rtl.css create mode 100644 public/assets/bootstrap/dist/css/bootstrap-grid.rtl.css.map create mode 100644 public/assets/bootstrap/dist/css/bootstrap-grid.rtl.min.css create mode 100644 public/assets/bootstrap/dist/css/bootstrap-grid.rtl.min.css.map create mode 100644 public/assets/bootstrap/dist/css/bootstrap-reboot.css create mode 100644 public/assets/bootstrap/dist/css/bootstrap-reboot.css.map create mode 100644 public/assets/bootstrap/dist/css/bootstrap-reboot.min.css create mode 100644 public/assets/bootstrap/dist/css/bootstrap-reboot.min.css.map create mode 100644 public/assets/bootstrap/dist/css/bootstrap-reboot.rtl.css create mode 100644 public/assets/bootstrap/dist/css/bootstrap-reboot.rtl.css.map create mode 100644 public/assets/bootstrap/dist/css/bootstrap-reboot.rtl.min.css create mode 100644 public/assets/bootstrap/dist/css/bootstrap-reboot.rtl.min.css.map create mode 100644 public/assets/bootstrap/dist/css/bootstrap-utilities.css create mode 100644 public/assets/bootstrap/dist/css/bootstrap-utilities.css.map create mode 100644 public/assets/bootstrap/dist/css/bootstrap-utilities.min.css create mode 100644 public/assets/bootstrap/dist/css/bootstrap-utilities.min.css.map create mode 100644 public/assets/bootstrap/dist/css/bootstrap-utilities.rtl.css create mode 100644 public/assets/bootstrap/dist/css/bootstrap-utilities.rtl.css.map create mode 100644 public/assets/bootstrap/dist/css/bootstrap-utilities.rtl.min.css create mode 100644 public/assets/bootstrap/dist/css/bootstrap-utilities.rtl.min.css.map create mode 100644 public/assets/bootstrap/dist/css/bootstrap.css create mode 100644 public/assets/bootstrap/dist/css/bootstrap.css.map create mode 100644 public/assets/bootstrap/dist/css/bootstrap.min.css create mode 100644 public/assets/bootstrap/dist/css/bootstrap.min.css.map create mode 100644 public/assets/bootstrap/dist/css/bootstrap.rtl.css create mode 100644 public/assets/bootstrap/dist/css/bootstrap.rtl.css.map create mode 100644 public/assets/bootstrap/dist/css/bootstrap.rtl.min.css create mode 100644 public/assets/bootstrap/dist/css/bootstrap.rtl.min.css.map create mode 100644 public/assets/bootstrap/dist/js/bootstrap.bundle.js create mode 100644 public/assets/bootstrap/dist/js/bootstrap.bundle.js.map create mode 100644 public/assets/bootstrap/dist/js/bootstrap.bundle.min.js create mode 100644 public/assets/bootstrap/dist/js/bootstrap.bundle.min.js.map create mode 100644 public/assets/bootstrap/dist/js/bootstrap.esm.js create mode 100644 public/assets/bootstrap/dist/js/bootstrap.esm.js.map create mode 100644 public/assets/bootstrap/dist/js/bootstrap.esm.min.js create mode 100644 public/assets/bootstrap/dist/js/bootstrap.esm.min.js.map create mode 100644 public/assets/bootstrap/dist/js/bootstrap.js create mode 100644 public/assets/bootstrap/dist/js/bootstrap.js.map create mode 100644 public/assets/bootstrap/dist/js/bootstrap.min.js create mode 100644 public/assets/bootstrap/dist/js/bootstrap.min.js.map create mode 100644 public/assets/bootstrap/js/dist/alert.js create mode 100644 public/assets/bootstrap/js/dist/alert.js.map create mode 100644 public/assets/bootstrap/js/dist/base-component.js create mode 100644 public/assets/bootstrap/js/dist/base-component.js.map create mode 100644 public/assets/bootstrap/js/dist/button.js create mode 100644 public/assets/bootstrap/js/dist/button.js.map create mode 100644 public/assets/bootstrap/js/dist/carousel.js create mode 100644 public/assets/bootstrap/js/dist/carousel.js.map create mode 100644 public/assets/bootstrap/js/dist/collapse.js create mode 100644 public/assets/bootstrap/js/dist/collapse.js.map create mode 100644 public/assets/bootstrap/js/dist/dom/data.js create mode 100644 public/assets/bootstrap/js/dist/dom/data.js.map create mode 100644 public/assets/bootstrap/js/dist/dom/event-handler.js create mode 100644 public/assets/bootstrap/js/dist/dom/event-handler.js.map create mode 100644 public/assets/bootstrap/js/dist/dom/manipulator.js create mode 100644 public/assets/bootstrap/js/dist/dom/manipulator.js.map create mode 100644 public/assets/bootstrap/js/dist/dom/selector-engine.js create mode 100644 public/assets/bootstrap/js/dist/dom/selector-engine.js.map create mode 100644 public/assets/bootstrap/js/dist/dropdown.js create mode 100644 public/assets/bootstrap/js/dist/dropdown.js.map create mode 100644 public/assets/bootstrap/js/dist/modal.js create mode 100644 public/assets/bootstrap/js/dist/modal.js.map create mode 100644 public/assets/bootstrap/js/dist/offcanvas.js create mode 100644 public/assets/bootstrap/js/dist/offcanvas.js.map create mode 100644 public/assets/bootstrap/js/dist/popover.js create mode 100644 public/assets/bootstrap/js/dist/popover.js.map create mode 100644 public/assets/bootstrap/js/dist/scrollspy.js create mode 100644 public/assets/bootstrap/js/dist/scrollspy.js.map create mode 100644 public/assets/bootstrap/js/dist/tab.js create mode 100644 public/assets/bootstrap/js/dist/tab.js.map create mode 100644 public/assets/bootstrap/js/dist/toast.js create mode 100644 public/assets/bootstrap/js/dist/toast.js.map create mode 100644 public/assets/bootstrap/js/dist/tooltip.js create mode 100644 public/assets/bootstrap/js/dist/tooltip.js.map create mode 100644 public/assets/bootstrap/js/dist/util/backdrop.js create mode 100644 public/assets/bootstrap/js/dist/util/backdrop.js.map create mode 100644 public/assets/bootstrap/js/dist/util/component-functions.js create mode 100644 public/assets/bootstrap/js/dist/util/component-functions.js.map create mode 100644 public/assets/bootstrap/js/dist/util/config.js create mode 100644 public/assets/bootstrap/js/dist/util/config.js.map create mode 100644 public/assets/bootstrap/js/dist/util/focustrap.js create mode 100644 public/assets/bootstrap/js/dist/util/focustrap.js.map create mode 100644 public/assets/bootstrap/js/dist/util/index.js create mode 100644 public/assets/bootstrap/js/dist/util/index.js.map create mode 100644 public/assets/bootstrap/js/dist/util/sanitizer.js create mode 100644 public/assets/bootstrap/js/dist/util/sanitizer.js.map create mode 100644 public/assets/bootstrap/js/dist/util/scrollbar.js create mode 100644 public/assets/bootstrap/js/dist/util/scrollbar.js.map create mode 100644 public/assets/bootstrap/js/dist/util/swipe.js create mode 100644 public/assets/bootstrap/js/dist/util/swipe.js.map create mode 100644 public/assets/bootstrap/js/dist/util/template-factory.js create mode 100644 public/assets/bootstrap/js/dist/util/template-factory.js.map create mode 100644 public/assets/bootstrap/js/index.esm.js create mode 100644 public/assets/bootstrap/js/index.umd.js create mode 100644 public/assets/bootstrap/js/src/alert.js create mode 100644 public/assets/bootstrap/js/src/base-component.js create mode 100644 public/assets/bootstrap/js/src/button.js create mode 100644 public/assets/bootstrap/js/src/carousel.js create mode 100644 public/assets/bootstrap/js/src/collapse.js create mode 100644 public/assets/bootstrap/js/src/dom/data.js create mode 100644 public/assets/bootstrap/js/src/dom/event-handler.js create mode 100644 public/assets/bootstrap/js/src/dom/manipulator.js create mode 100644 public/assets/bootstrap/js/src/dom/selector-engine.js create mode 100644 public/assets/bootstrap/js/src/dropdown.js create mode 100644 public/assets/bootstrap/js/src/modal.js create mode 100644 public/assets/bootstrap/js/src/offcanvas.js create mode 100644 public/assets/bootstrap/js/src/popover.js create mode 100644 public/assets/bootstrap/js/src/scrollspy.js create mode 100644 public/assets/bootstrap/js/src/tab.js create mode 100644 public/assets/bootstrap/js/src/toast.js create mode 100644 public/assets/bootstrap/js/src/tooltip.js create mode 100644 public/assets/bootstrap/js/src/util/backdrop.js create mode 100644 public/assets/bootstrap/js/src/util/component-functions.js create mode 100644 public/assets/bootstrap/js/src/util/config.js create mode 100644 public/assets/bootstrap/js/src/util/focustrap.js create mode 100644 public/assets/bootstrap/js/src/util/index.js create mode 100644 public/assets/bootstrap/js/src/util/sanitizer.js create mode 100644 public/assets/bootstrap/js/src/util/scrollbar.js create mode 100644 public/assets/bootstrap/js/src/util/swipe.js create mode 100644 public/assets/bootstrap/js/src/util/template-factory.js create mode 100644 public/assets/bootstrap/package.json create mode 100644 public/assets/bootstrap/scss/_accordion.scss create mode 100644 public/assets/bootstrap/scss/_alert.scss create mode 100644 public/assets/bootstrap/scss/_badge.scss create mode 100644 public/assets/bootstrap/scss/_breadcrumb.scss create mode 100644 public/assets/bootstrap/scss/_button-group.scss create mode 100644 public/assets/bootstrap/scss/_buttons.scss create mode 100644 public/assets/bootstrap/scss/_card.scss create mode 100644 public/assets/bootstrap/scss/_carousel.scss create mode 100644 public/assets/bootstrap/scss/_close.scss create mode 100644 public/assets/bootstrap/scss/_containers.scss create mode 100644 public/assets/bootstrap/scss/_dropdown.scss create mode 100644 public/assets/bootstrap/scss/_forms.scss create mode 100644 public/assets/bootstrap/scss/_functions.scss create mode 100644 public/assets/bootstrap/scss/_grid.scss create mode 100644 public/assets/bootstrap/scss/_helpers.scss create mode 100644 public/assets/bootstrap/scss/_images.scss create mode 100644 public/assets/bootstrap/scss/_list-group.scss create mode 100644 public/assets/bootstrap/scss/_maps.scss create mode 100644 public/assets/bootstrap/scss/_mixins.scss create mode 100644 public/assets/bootstrap/scss/_modal.scss create mode 100644 public/assets/bootstrap/scss/_nav.scss create mode 100644 public/assets/bootstrap/scss/_navbar.scss create mode 100644 public/assets/bootstrap/scss/_offcanvas.scss create mode 100644 public/assets/bootstrap/scss/_pagination.scss create mode 100644 public/assets/bootstrap/scss/_placeholders.scss create mode 100644 public/assets/bootstrap/scss/_popover.scss create mode 100644 public/assets/bootstrap/scss/_progress.scss create mode 100644 public/assets/bootstrap/scss/_reboot.scss create mode 100644 public/assets/bootstrap/scss/_root.scss create mode 100644 public/assets/bootstrap/scss/_spinners.scss create mode 100644 public/assets/bootstrap/scss/_tables.scss create mode 100644 public/assets/bootstrap/scss/_toasts.scss create mode 100644 public/assets/bootstrap/scss/_tooltip.scss create mode 100644 public/assets/bootstrap/scss/_transitions.scss create mode 100644 public/assets/bootstrap/scss/_type.scss create mode 100644 public/assets/bootstrap/scss/_utilities.scss create mode 100644 public/assets/bootstrap/scss/_variables-dark.scss create mode 100644 public/assets/bootstrap/scss/_variables.scss create mode 100644 public/assets/bootstrap/scss/bootstrap-grid.scss create mode 100644 public/assets/bootstrap/scss/bootstrap-reboot.scss create mode 100644 public/assets/bootstrap/scss/bootstrap-utilities.scss create mode 100644 public/assets/bootstrap/scss/bootstrap.scss create mode 100644 public/assets/bootstrap/scss/forms/_floating-labels.scss create mode 100644 public/assets/bootstrap/scss/forms/_form-check.scss create mode 100644 public/assets/bootstrap/scss/forms/_form-control.scss create mode 100644 public/assets/bootstrap/scss/forms/_form-range.scss create mode 100644 public/assets/bootstrap/scss/forms/_form-select.scss create mode 100644 public/assets/bootstrap/scss/forms/_form-text.scss create mode 100644 public/assets/bootstrap/scss/forms/_input-group.scss create mode 100644 public/assets/bootstrap/scss/forms/_labels.scss create mode 100644 public/assets/bootstrap/scss/forms/_validation.scss create mode 100644 public/assets/bootstrap/scss/helpers/_clearfix.scss create mode 100644 public/assets/bootstrap/scss/helpers/_color-bg.scss create mode 100644 public/assets/bootstrap/scss/helpers/_colored-links.scss create mode 100644 public/assets/bootstrap/scss/helpers/_focus-ring.scss create mode 100644 public/assets/bootstrap/scss/helpers/_icon-link.scss create mode 100644 public/assets/bootstrap/scss/helpers/_position.scss create mode 100644 public/assets/bootstrap/scss/helpers/_ratio.scss create mode 100644 public/assets/bootstrap/scss/helpers/_stacks.scss create mode 100644 public/assets/bootstrap/scss/helpers/_stretched-link.scss create mode 100644 public/assets/bootstrap/scss/helpers/_text-truncation.scss create mode 100644 public/assets/bootstrap/scss/helpers/_visually-hidden.scss create mode 100644 public/assets/bootstrap/scss/helpers/_vr.scss create mode 100644 public/assets/bootstrap/scss/mixins/_alert.scss create mode 100644 public/assets/bootstrap/scss/mixins/_backdrop.scss create mode 100644 public/assets/bootstrap/scss/mixins/_banner.scss create mode 100644 public/assets/bootstrap/scss/mixins/_border-radius.scss create mode 100644 public/assets/bootstrap/scss/mixins/_box-shadow.scss create mode 100644 public/assets/bootstrap/scss/mixins/_breakpoints.scss create mode 100644 public/assets/bootstrap/scss/mixins/_buttons.scss create mode 100644 public/assets/bootstrap/scss/mixins/_caret.scss create mode 100644 public/assets/bootstrap/scss/mixins/_clearfix.scss create mode 100644 public/assets/bootstrap/scss/mixins/_color-mode.scss create mode 100644 public/assets/bootstrap/scss/mixins/_color-scheme.scss create mode 100644 public/assets/bootstrap/scss/mixins/_container.scss create mode 100644 public/assets/bootstrap/scss/mixins/_deprecate.scss create mode 100644 public/assets/bootstrap/scss/mixins/_forms.scss create mode 100644 public/assets/bootstrap/scss/mixins/_gradients.scss create mode 100644 public/assets/bootstrap/scss/mixins/_grid.scss create mode 100644 public/assets/bootstrap/scss/mixins/_image.scss create mode 100644 public/assets/bootstrap/scss/mixins/_list-group.scss create mode 100644 public/assets/bootstrap/scss/mixins/_lists.scss create mode 100644 public/assets/bootstrap/scss/mixins/_pagination.scss create mode 100644 public/assets/bootstrap/scss/mixins/_reset-text.scss create mode 100644 public/assets/bootstrap/scss/mixins/_resize.scss create mode 100644 public/assets/bootstrap/scss/mixins/_table-variants.scss create mode 100644 public/assets/bootstrap/scss/mixins/_text-truncate.scss create mode 100644 public/assets/bootstrap/scss/mixins/_transition.scss create mode 100644 public/assets/bootstrap/scss/mixins/_utilities.scss create mode 100644 public/assets/bootstrap/scss/mixins/_visually-hidden.scss create mode 100644 public/assets/bootstrap/scss/utilities/_api.scss create mode 100644 public/assets/bootstrap/scss/vendor/_rfs.scss create mode 100644 public/assets/eventemitter3/LICENSE create mode 100644 public/assets/eventemitter3/README.md create mode 100644 public/assets/eventemitter3/dist/eventemitter3.esm.js create mode 100644 public/assets/eventemitter3/dist/eventemitter3.esm.min.js create mode 100644 public/assets/eventemitter3/dist/eventemitter3.esm.min.js.map create mode 100644 public/assets/eventemitter3/dist/eventemitter3.umd.js create mode 100644 public/assets/eventemitter3/dist/eventemitter3.umd.min.js create mode 100644 public/assets/eventemitter3/dist/eventemitter3.umd.min.js.map create mode 100644 public/assets/eventemitter3/index.d.ts create mode 100644 public/assets/eventemitter3/index.js create mode 100644 public/assets/eventemitter3/index.mjs create mode 100644 public/assets/eventemitter3/package.json create mode 100644 public/assets/htmx/README.md create mode 100644 public/assets/htmx/TODO.md create mode 100644 public/assets/htmx/cli.js create mode 100644 public/assets/htmx/htmx.js create mode 100644 public/assets/htmx/package.json create mode 100644 public/assets/htmx/preprocess.js create mode 100644 public/assets/htmx/watch.js create mode 100644 public/assets/jquery/AUTHORS.txt create mode 100644 public/assets/jquery/LICENSE.txt create mode 100644 public/assets/jquery/README.md create mode 100644 public/assets/jquery/bower.json create mode 100644 public/assets/jquery/changelog.md create mode 100644 public/assets/jquery/dist-module/jquery.factory.module.js create mode 100644 public/assets/jquery/dist-module/jquery.factory.slim.module.js create mode 100644 public/assets/jquery/dist-module/jquery.module.js create mode 100644 public/assets/jquery/dist-module/jquery.module.min.js create mode 100644 public/assets/jquery/dist-module/jquery.module.min.map create mode 100644 public/assets/jquery/dist-module/jquery.slim.module.js create mode 100644 public/assets/jquery/dist-module/jquery.slim.module.min.js create mode 100644 public/assets/jquery/dist-module/jquery.slim.module.min.map create mode 100644 public/assets/jquery/dist-module/package.json create mode 100644 public/assets/jquery/dist-module/wrappers/jquery.node-module-wrapper.js create mode 100644 public/assets/jquery/dist-module/wrappers/jquery.node-module-wrapper.slim.js create mode 100644 public/assets/jquery/dist/jquery.factory.js create mode 100644 public/assets/jquery/dist/jquery.factory.slim.js create mode 100644 public/assets/jquery/dist/jquery.js create mode 100644 public/assets/jquery/dist/jquery.min.js create mode 100644 public/assets/jquery/dist/jquery.min.map create mode 100644 public/assets/jquery/dist/jquery.slim.js create mode 100644 public/assets/jquery/dist/jquery.slim.min.js create mode 100644 public/assets/jquery/dist/jquery.slim.min.map create mode 100644 public/assets/jquery/dist/package.json create mode 100644 public/assets/jquery/dist/wrappers/jquery.bundler-require-wrapper.js create mode 100644 public/assets/jquery/dist/wrappers/jquery.bundler-require-wrapper.slim.js create mode 100644 public/assets/jquery/package.json create mode 100644 public/assets/jquery/src/ajax.js create mode 100644 public/assets/jquery/src/ajax/binary.js create mode 100644 public/assets/jquery/src/ajax/jsonp.js create mode 100644 public/assets/jquery/src/ajax/load.js create mode 100644 public/assets/jquery/src/ajax/script.js create mode 100644 public/assets/jquery/src/ajax/var/location.js create mode 100644 public/assets/jquery/src/ajax/var/nonce.js create mode 100644 public/assets/jquery/src/ajax/var/rquery.js create mode 100644 public/assets/jquery/src/ajax/xhr.js create mode 100644 public/assets/jquery/src/attributes.js create mode 100644 public/assets/jquery/src/attributes/attr.js create mode 100644 public/assets/jquery/src/attributes/classes.js create mode 100644 public/assets/jquery/src/attributes/prop.js create mode 100644 public/assets/jquery/src/attributes/val.js create mode 100644 public/assets/jquery/src/callbacks.js create mode 100644 public/assets/jquery/src/core.js create mode 100644 public/assets/jquery/src/core/DOMEval.js create mode 100644 public/assets/jquery/src/core/access.js create mode 100644 public/assets/jquery/src/core/camelCase.js create mode 100644 public/assets/jquery/src/core/init.js create mode 100644 public/assets/jquery/src/core/isArrayLike.js create mode 100644 public/assets/jquery/src/core/isAttached.js create mode 100644 public/assets/jquery/src/core/isObviousHtml.js create mode 100644 public/assets/jquery/src/core/nodeName.js create mode 100644 public/assets/jquery/src/core/parseHTML.js create mode 100644 public/assets/jquery/src/core/parseXML.js create mode 100644 public/assets/jquery/src/core/ready-no-deferred.js create mode 100644 public/assets/jquery/src/core/ready.js create mode 100644 public/assets/jquery/src/core/readyException.js create mode 100644 public/assets/jquery/src/core/stripAndCollapse.js create mode 100644 public/assets/jquery/src/core/toType.js create mode 100644 public/assets/jquery/src/core/var/rsingleTag.js create mode 100644 public/assets/jquery/src/css.js create mode 100644 public/assets/jquery/src/css/adjustCSS.js create mode 100644 public/assets/jquery/src/css/cssCamelCase.js create mode 100644 public/assets/jquery/src/css/curCSS.js create mode 100644 public/assets/jquery/src/css/finalPropName.js create mode 100644 public/assets/jquery/src/css/hiddenVisibleSelectors.js create mode 100644 public/assets/jquery/src/css/isAutoPx.js create mode 100644 public/assets/jquery/src/css/showHide.js create mode 100644 public/assets/jquery/src/css/support.js create mode 100644 public/assets/jquery/src/css/var/cssExpand.js create mode 100644 public/assets/jquery/src/css/var/getStyles.js create mode 100644 public/assets/jquery/src/css/var/isHiddenWithinTree.js create mode 100644 public/assets/jquery/src/css/var/rcustomProp.js create mode 100644 public/assets/jquery/src/css/var/rnumnonpx.js create mode 100644 public/assets/jquery/src/css/var/swap.js create mode 100644 public/assets/jquery/src/data.js create mode 100644 public/assets/jquery/src/data/Data.js create mode 100644 public/assets/jquery/src/data/var/acceptData.js create mode 100644 public/assets/jquery/src/data/var/dataPriv.js create mode 100644 public/assets/jquery/src/data/var/dataUser.js create mode 100644 public/assets/jquery/src/deferred.js create mode 100644 public/assets/jquery/src/deferred/exceptionHook.js create mode 100644 public/assets/jquery/src/deprecated.js create mode 100644 public/assets/jquery/src/deprecated/ajax-event-alias.js create mode 100644 public/assets/jquery/src/deprecated/event.js create mode 100644 public/assets/jquery/src/dimensions.js create mode 100644 public/assets/jquery/src/effects.js create mode 100644 public/assets/jquery/src/effects/Tween.js create mode 100644 public/assets/jquery/src/effects/animatedSelector.js create mode 100644 public/assets/jquery/src/event.js create mode 100644 public/assets/jquery/src/event/trigger.js create mode 100644 public/assets/jquery/src/exports/amd.js create mode 100644 public/assets/jquery/src/exports/global.js create mode 100644 public/assets/jquery/src/jquery.js create mode 100644 public/assets/jquery/src/manipulation.js create mode 100644 public/assets/jquery/src/manipulation/_evalUrl.js create mode 100644 public/assets/jquery/src/manipulation/buildFragment.js create mode 100644 public/assets/jquery/src/manipulation/domManip.js create mode 100644 public/assets/jquery/src/manipulation/getAll.js create mode 100644 public/assets/jquery/src/manipulation/setGlobalEval.js create mode 100644 public/assets/jquery/src/manipulation/var/rscriptType.js create mode 100644 public/assets/jquery/src/manipulation/var/rtagName.js create mode 100644 public/assets/jquery/src/manipulation/wrapMap.js create mode 100644 public/assets/jquery/src/offset.js create mode 100644 public/assets/jquery/src/queue.js create mode 100644 public/assets/jquery/src/queue/delay.js create mode 100644 public/assets/jquery/src/selector-native.js create mode 100644 public/assets/jquery/src/selector.js create mode 100644 public/assets/jquery/src/selector/createCache.js create mode 100644 public/assets/jquery/src/selector/escapeSelector.js create mode 100644 public/assets/jquery/src/selector/filterMatchExpr.js create mode 100644 public/assets/jquery/src/selector/preFilter.js create mode 100644 public/assets/jquery/src/selector/rbuggyQSA.js create mode 100644 public/assets/jquery/src/selector/selectorError.js create mode 100644 public/assets/jquery/src/selector/testContext.js create mode 100644 public/assets/jquery/src/selector/toSelector.js create mode 100644 public/assets/jquery/src/selector/tokenize.js create mode 100644 public/assets/jquery/src/selector/unescapeSelector.js create mode 100644 public/assets/jquery/src/selector/uniqueSort.js create mode 100644 public/assets/jquery/src/selector/var/attributes.js create mode 100644 public/assets/jquery/src/selector/var/identifier.js create mode 100644 public/assets/jquery/src/selector/var/matches.js create mode 100644 public/assets/jquery/src/selector/var/pseudos.js create mode 100644 public/assets/jquery/src/selector/var/rcomma.js create mode 100644 public/assets/jquery/src/selector/var/rdescend.js create mode 100644 public/assets/jquery/src/selector/var/rleadingCombinator.js create mode 100644 public/assets/jquery/src/selector/var/rpseudo.js create mode 100644 public/assets/jquery/src/selector/var/rsibling.js create mode 100644 public/assets/jquery/src/serialize.js create mode 100644 public/assets/jquery/src/traversing.js create mode 100644 public/assets/jquery/src/traversing/findFilter.js create mode 100644 public/assets/jquery/src/traversing/var/dir.js create mode 100644 public/assets/jquery/src/traversing/var/rneedsContext.js create mode 100644 public/assets/jquery/src/traversing/var/siblings.js create mode 100644 public/assets/jquery/src/var/ObjectFunctionString.js create mode 100644 public/assets/jquery/src/var/arr.js create mode 100644 public/assets/jquery/src/var/class2type.js create mode 100644 public/assets/jquery/src/var/document.js create mode 100644 public/assets/jquery/src/var/documentElement.js create mode 100644 public/assets/jquery/src/var/flat.js create mode 100644 public/assets/jquery/src/var/fnToString.js create mode 100644 public/assets/jquery/src/var/getProto.js create mode 100644 public/assets/jquery/src/var/hasOwn.js create mode 100644 public/assets/jquery/src/var/indexOf.js create mode 100644 public/assets/jquery/src/var/isIE.js create mode 100644 public/assets/jquery/src/var/isWindow.js create mode 100644 public/assets/jquery/src/var/pnum.js create mode 100644 public/assets/jquery/src/var/pop.js create mode 100644 public/assets/jquery/src/var/push.js create mode 100644 public/assets/jquery/src/var/rcheckableType.js create mode 100644 public/assets/jquery/src/var/rcssNum.js create mode 100644 public/assets/jquery/src/var/rnothtmlwhite.js create mode 100644 public/assets/jquery/src/var/rtrimCSS.js create mode 100644 public/assets/jquery/src/var/slice.js create mode 100644 public/assets/jquery/src/var/sort.js create mode 100644 public/assets/jquery/src/var/splice.js create mode 100644 public/assets/jquery/src/var/support.js create mode 100644 public/assets/jquery/src/var/toString.js create mode 100644 public/assets/jquery/src/var/whitespace.js create mode 100644 public/assets/jquery/src/wrap.js create mode 100644 public/assets/jquery/src/wrapper-esm.js create mode 100644 public/assets/jquery/src/wrapper-factory-esm.js create mode 100644 public/assets/jquery/src/wrapper-factory.js create mode 100644 public/assets/lodash-es/LICENSE create mode 100644 public/assets/lodash-es/README.md create mode 100644 public/assets/lodash-es/_DataView.js create mode 100644 public/assets/lodash-es/_Hash.js create mode 100644 public/assets/lodash-es/_LazyWrapper.js create mode 100644 public/assets/lodash-es/_ListCache.js create mode 100644 public/assets/lodash-es/_LodashWrapper.js create mode 100644 public/assets/lodash-es/_Map.js create mode 100644 public/assets/lodash-es/_MapCache.js create mode 100644 public/assets/lodash-es/_Promise.js create mode 100644 public/assets/lodash-es/_Set.js create mode 100644 public/assets/lodash-es/_SetCache.js create mode 100644 public/assets/lodash-es/_Stack.js create mode 100644 public/assets/lodash-es/_Symbol.js create mode 100644 public/assets/lodash-es/_Uint8Array.js create mode 100644 public/assets/lodash-es/_WeakMap.js create mode 100644 public/assets/lodash-es/_addMapEntry.js create mode 100644 public/assets/lodash-es/_addSetEntry.js create mode 100644 public/assets/lodash-es/_apply.js create mode 100644 public/assets/lodash-es/_arrayAggregator.js create mode 100644 public/assets/lodash-es/_arrayEach.js create mode 100644 public/assets/lodash-es/_arrayEachRight.js create mode 100644 public/assets/lodash-es/_arrayEvery.js create mode 100644 public/assets/lodash-es/_arrayFilter.js create mode 100644 public/assets/lodash-es/_arrayIncludes.js create mode 100644 public/assets/lodash-es/_arrayIncludesWith.js create mode 100644 public/assets/lodash-es/_arrayLikeKeys.js create mode 100644 public/assets/lodash-es/_arrayMap.js create mode 100644 public/assets/lodash-es/_arrayPush.js create mode 100644 public/assets/lodash-es/_arrayReduce.js create mode 100644 public/assets/lodash-es/_arrayReduceRight.js create mode 100644 public/assets/lodash-es/_arraySample.js create mode 100644 public/assets/lodash-es/_arraySampleSize.js create mode 100644 public/assets/lodash-es/_arrayShuffle.js create mode 100644 public/assets/lodash-es/_arraySome.js create mode 100644 public/assets/lodash-es/_asciiSize.js create mode 100644 public/assets/lodash-es/_asciiToArray.js create mode 100644 public/assets/lodash-es/_asciiWords.js create mode 100644 public/assets/lodash-es/_assignMergeValue.js create mode 100644 public/assets/lodash-es/_assignValue.js create mode 100644 public/assets/lodash-es/_assocIndexOf.js create mode 100644 public/assets/lodash-es/_baseAggregator.js create mode 100644 public/assets/lodash-es/_baseAssign.js create mode 100644 public/assets/lodash-es/_baseAssignIn.js create mode 100644 public/assets/lodash-es/_baseAssignValue.js create mode 100644 public/assets/lodash-es/_baseAt.js create mode 100644 public/assets/lodash-es/_baseClamp.js create mode 100644 public/assets/lodash-es/_baseClone.js create mode 100644 public/assets/lodash-es/_baseConforms.js create mode 100644 public/assets/lodash-es/_baseConformsTo.js create mode 100644 public/assets/lodash-es/_baseCreate.js create mode 100644 public/assets/lodash-es/_baseDelay.js create mode 100644 public/assets/lodash-es/_baseDifference.js create mode 100644 public/assets/lodash-es/_baseEach.js create mode 100644 public/assets/lodash-es/_baseEachRight.js create mode 100644 public/assets/lodash-es/_baseEvery.js create mode 100644 public/assets/lodash-es/_baseExtremum.js create mode 100644 public/assets/lodash-es/_baseFill.js create mode 100644 public/assets/lodash-es/_baseFilter.js create mode 100644 public/assets/lodash-es/_baseFindIndex.js create mode 100644 public/assets/lodash-es/_baseFindKey.js create mode 100644 public/assets/lodash-es/_baseFlatten.js create mode 100644 public/assets/lodash-es/_baseFor.js create mode 100644 public/assets/lodash-es/_baseForOwn.js create mode 100644 public/assets/lodash-es/_baseForOwnRight.js create mode 100644 public/assets/lodash-es/_baseForRight.js create mode 100644 public/assets/lodash-es/_baseFunctions.js create mode 100644 public/assets/lodash-es/_baseGet.js create mode 100644 public/assets/lodash-es/_baseGetAllKeys.js create mode 100644 public/assets/lodash-es/_baseGetTag.js create mode 100644 public/assets/lodash-es/_baseGt.js create mode 100644 public/assets/lodash-es/_baseHas.js create mode 100644 public/assets/lodash-es/_baseHasIn.js create mode 100644 public/assets/lodash-es/_baseInRange.js create mode 100644 public/assets/lodash-es/_baseIndexOf.js create mode 100644 public/assets/lodash-es/_baseIndexOfWith.js create mode 100644 public/assets/lodash-es/_baseIntersection.js create mode 100644 public/assets/lodash-es/_baseInverter.js create mode 100644 public/assets/lodash-es/_baseInvoke.js create mode 100644 public/assets/lodash-es/_baseIsArguments.js create mode 100644 public/assets/lodash-es/_baseIsArrayBuffer.js create mode 100644 public/assets/lodash-es/_baseIsDate.js create mode 100644 public/assets/lodash-es/_baseIsEqual.js create mode 100644 public/assets/lodash-es/_baseIsEqualDeep.js create mode 100644 public/assets/lodash-es/_baseIsMap.js create mode 100644 public/assets/lodash-es/_baseIsMatch.js create mode 100644 public/assets/lodash-es/_baseIsNaN.js create mode 100644 public/assets/lodash-es/_baseIsNative.js create mode 100644 public/assets/lodash-es/_baseIsRegExp.js create mode 100644 public/assets/lodash-es/_baseIsSet.js create mode 100644 public/assets/lodash-es/_baseIsTypedArray.js create mode 100644 public/assets/lodash-es/_baseIteratee.js create mode 100644 public/assets/lodash-es/_baseKeys.js create mode 100644 public/assets/lodash-es/_baseKeysIn.js create mode 100644 public/assets/lodash-es/_baseLodash.js create mode 100644 public/assets/lodash-es/_baseLt.js create mode 100644 public/assets/lodash-es/_baseMap.js create mode 100644 public/assets/lodash-es/_baseMatches.js create mode 100644 public/assets/lodash-es/_baseMatchesProperty.js create mode 100644 public/assets/lodash-es/_baseMean.js create mode 100644 public/assets/lodash-es/_baseMerge.js create mode 100644 public/assets/lodash-es/_baseMergeDeep.js create mode 100644 public/assets/lodash-es/_baseNth.js create mode 100644 public/assets/lodash-es/_baseOrderBy.js create mode 100644 public/assets/lodash-es/_basePick.js create mode 100644 public/assets/lodash-es/_basePickBy.js create mode 100644 public/assets/lodash-es/_baseProperty.js create mode 100644 public/assets/lodash-es/_basePropertyDeep.js create mode 100644 public/assets/lodash-es/_basePropertyOf.js create mode 100644 public/assets/lodash-es/_basePullAll.js create mode 100644 public/assets/lodash-es/_basePullAt.js create mode 100644 public/assets/lodash-es/_baseRandom.js create mode 100644 public/assets/lodash-es/_baseRange.js create mode 100644 public/assets/lodash-es/_baseReduce.js create mode 100644 public/assets/lodash-es/_baseRepeat.js create mode 100644 public/assets/lodash-es/_baseRest.js create mode 100644 public/assets/lodash-es/_baseSample.js create mode 100644 public/assets/lodash-es/_baseSampleSize.js create mode 100644 public/assets/lodash-es/_baseSet.js create mode 100644 public/assets/lodash-es/_baseSetData.js create mode 100644 public/assets/lodash-es/_baseSetToString.js create mode 100644 public/assets/lodash-es/_baseShuffle.js create mode 100644 public/assets/lodash-es/_baseSlice.js create mode 100644 public/assets/lodash-es/_baseSome.js create mode 100644 public/assets/lodash-es/_baseSortBy.js create mode 100644 public/assets/lodash-es/_baseSortedIndex.js create mode 100644 public/assets/lodash-es/_baseSortedIndexBy.js create mode 100644 public/assets/lodash-es/_baseSortedUniq.js create mode 100644 public/assets/lodash-es/_baseSum.js create mode 100644 public/assets/lodash-es/_baseTimes.js create mode 100644 public/assets/lodash-es/_baseToNumber.js create mode 100644 public/assets/lodash-es/_baseToPairs.js create mode 100644 public/assets/lodash-es/_baseToString.js create mode 100644 public/assets/lodash-es/_baseTrim.js create mode 100644 public/assets/lodash-es/_baseUnary.js create mode 100644 public/assets/lodash-es/_baseUniq.js create mode 100644 public/assets/lodash-es/_baseUnset.js create mode 100644 public/assets/lodash-es/_baseUpdate.js create mode 100644 public/assets/lodash-es/_baseValues.js create mode 100644 public/assets/lodash-es/_baseWhile.js create mode 100644 public/assets/lodash-es/_baseWrapperValue.js create mode 100644 public/assets/lodash-es/_baseXor.js create mode 100644 public/assets/lodash-es/_baseZipObject.js create mode 100644 public/assets/lodash-es/_cacheHas.js create mode 100644 public/assets/lodash-es/_castArrayLikeObject.js create mode 100644 public/assets/lodash-es/_castFunction.js create mode 100644 public/assets/lodash-es/_castPath.js create mode 100644 public/assets/lodash-es/_castRest.js create mode 100644 public/assets/lodash-es/_castSlice.js create mode 100644 public/assets/lodash-es/_charsEndIndex.js create mode 100644 public/assets/lodash-es/_charsStartIndex.js create mode 100644 public/assets/lodash-es/_cloneArrayBuffer.js create mode 100644 public/assets/lodash-es/_cloneBuffer.js create mode 100644 public/assets/lodash-es/_cloneDataView.js create mode 100644 public/assets/lodash-es/_cloneMap.js create mode 100644 public/assets/lodash-es/_cloneRegExp.js create mode 100644 public/assets/lodash-es/_cloneSet.js create mode 100644 public/assets/lodash-es/_cloneSymbol.js create mode 100644 public/assets/lodash-es/_cloneTypedArray.js create mode 100644 public/assets/lodash-es/_compareAscending.js create mode 100644 public/assets/lodash-es/_compareMultiple.js create mode 100644 public/assets/lodash-es/_composeArgs.js create mode 100644 public/assets/lodash-es/_composeArgsRight.js create mode 100644 public/assets/lodash-es/_copyArray.js create mode 100644 public/assets/lodash-es/_copyObject.js create mode 100644 public/assets/lodash-es/_copySymbols.js create mode 100644 public/assets/lodash-es/_copySymbolsIn.js create mode 100644 public/assets/lodash-es/_coreJsData.js create mode 100644 public/assets/lodash-es/_countHolders.js create mode 100644 public/assets/lodash-es/_createAggregator.js create mode 100644 public/assets/lodash-es/_createAssigner.js create mode 100644 public/assets/lodash-es/_createBaseEach.js create mode 100644 public/assets/lodash-es/_createBaseFor.js create mode 100644 public/assets/lodash-es/_createBind.js create mode 100644 public/assets/lodash-es/_createCaseFirst.js create mode 100644 public/assets/lodash-es/_createCompounder.js create mode 100644 public/assets/lodash-es/_createCtor.js create mode 100644 public/assets/lodash-es/_createCurry.js create mode 100644 public/assets/lodash-es/_createFind.js create mode 100644 public/assets/lodash-es/_createFlow.js create mode 100644 public/assets/lodash-es/_createHybrid.js create mode 100644 public/assets/lodash-es/_createInverter.js create mode 100644 public/assets/lodash-es/_createMathOperation.js create mode 100644 public/assets/lodash-es/_createOver.js create mode 100644 public/assets/lodash-es/_createPadding.js create mode 100644 public/assets/lodash-es/_createPartial.js create mode 100644 public/assets/lodash-es/_createRange.js create mode 100644 public/assets/lodash-es/_createRecurry.js create mode 100644 public/assets/lodash-es/_createRelationalOperation.js create mode 100644 public/assets/lodash-es/_createRound.js create mode 100644 public/assets/lodash-es/_createSet.js create mode 100644 public/assets/lodash-es/_createToPairs.js create mode 100644 public/assets/lodash-es/_createWrap.js create mode 100644 public/assets/lodash-es/_customDefaultsAssignIn.js create mode 100644 public/assets/lodash-es/_customDefaultsMerge.js create mode 100644 public/assets/lodash-es/_customOmitClone.js create mode 100644 public/assets/lodash-es/_deburrLetter.js create mode 100644 public/assets/lodash-es/_defineProperty.js create mode 100644 public/assets/lodash-es/_equalArrays.js create mode 100644 public/assets/lodash-es/_equalByTag.js create mode 100644 public/assets/lodash-es/_equalObjects.js create mode 100644 public/assets/lodash-es/_escapeHtmlChar.js create mode 100644 public/assets/lodash-es/_escapeStringChar.js create mode 100644 public/assets/lodash-es/_flatRest.js create mode 100644 public/assets/lodash-es/_freeGlobal.js create mode 100644 public/assets/lodash-es/_getAllKeys.js create mode 100644 public/assets/lodash-es/_getAllKeysIn.js create mode 100644 public/assets/lodash-es/_getData.js create mode 100644 public/assets/lodash-es/_getFuncName.js create mode 100644 public/assets/lodash-es/_getHolder.js create mode 100644 public/assets/lodash-es/_getMapData.js create mode 100644 public/assets/lodash-es/_getMatchData.js create mode 100644 public/assets/lodash-es/_getNative.js create mode 100644 public/assets/lodash-es/_getPrototype.js create mode 100644 public/assets/lodash-es/_getRawTag.js create mode 100644 public/assets/lodash-es/_getSymbols.js create mode 100644 public/assets/lodash-es/_getSymbolsIn.js create mode 100644 public/assets/lodash-es/_getTag.js create mode 100644 public/assets/lodash-es/_getValue.js create mode 100644 public/assets/lodash-es/_getView.js create mode 100644 public/assets/lodash-es/_getWrapDetails.js create mode 100644 public/assets/lodash-es/_hasPath.js create mode 100644 public/assets/lodash-es/_hasUnicode.js create mode 100644 public/assets/lodash-es/_hasUnicodeWord.js create mode 100644 public/assets/lodash-es/_hashClear.js create mode 100644 public/assets/lodash-es/_hashDelete.js create mode 100644 public/assets/lodash-es/_hashGet.js create mode 100644 public/assets/lodash-es/_hashHas.js create mode 100644 public/assets/lodash-es/_hashSet.js create mode 100644 public/assets/lodash-es/_initCloneArray.js create mode 100644 public/assets/lodash-es/_initCloneByTag.js create mode 100644 public/assets/lodash-es/_initCloneObject.js create mode 100644 public/assets/lodash-es/_insertWrapDetails.js create mode 100644 public/assets/lodash-es/_isFlattenable.js create mode 100644 public/assets/lodash-es/_isIndex.js create mode 100644 public/assets/lodash-es/_isIterateeCall.js create mode 100644 public/assets/lodash-es/_isKey.js create mode 100644 public/assets/lodash-es/_isKeyable.js create mode 100644 public/assets/lodash-es/_isLaziable.js create mode 100644 public/assets/lodash-es/_isMaskable.js create mode 100644 public/assets/lodash-es/_isMasked.js create mode 100644 public/assets/lodash-es/_isPrototype.js create mode 100644 public/assets/lodash-es/_isStrictComparable.js create mode 100644 public/assets/lodash-es/_iteratorToArray.js create mode 100644 public/assets/lodash-es/_lazyClone.js create mode 100644 public/assets/lodash-es/_lazyReverse.js create mode 100644 public/assets/lodash-es/_lazyValue.js create mode 100644 public/assets/lodash-es/_listCacheClear.js create mode 100644 public/assets/lodash-es/_listCacheDelete.js create mode 100644 public/assets/lodash-es/_listCacheGet.js create mode 100644 public/assets/lodash-es/_listCacheHas.js create mode 100644 public/assets/lodash-es/_listCacheSet.js create mode 100644 public/assets/lodash-es/_mapCacheClear.js create mode 100644 public/assets/lodash-es/_mapCacheDelete.js create mode 100644 public/assets/lodash-es/_mapCacheGet.js create mode 100644 public/assets/lodash-es/_mapCacheHas.js create mode 100644 public/assets/lodash-es/_mapCacheSet.js create mode 100644 public/assets/lodash-es/_mapToArray.js create mode 100644 public/assets/lodash-es/_matchesStrictComparable.js create mode 100644 public/assets/lodash-es/_memoizeCapped.js create mode 100644 public/assets/lodash-es/_mergeData.js create mode 100644 public/assets/lodash-es/_metaMap.js create mode 100644 public/assets/lodash-es/_nativeCreate.js create mode 100644 public/assets/lodash-es/_nativeKeys.js create mode 100644 public/assets/lodash-es/_nativeKeysIn.js create mode 100644 public/assets/lodash-es/_nodeUtil.js create mode 100644 public/assets/lodash-es/_objectToString.js create mode 100644 public/assets/lodash-es/_overArg.js create mode 100644 public/assets/lodash-es/_overRest.js create mode 100644 public/assets/lodash-es/_parent.js create mode 100644 public/assets/lodash-es/_reEscape.js create mode 100644 public/assets/lodash-es/_reEvaluate.js create mode 100644 public/assets/lodash-es/_reInterpolate.js create mode 100644 public/assets/lodash-es/_realNames.js create mode 100644 public/assets/lodash-es/_reorder.js create mode 100644 public/assets/lodash-es/_replaceHolders.js create mode 100644 public/assets/lodash-es/_root.js create mode 100644 public/assets/lodash-es/_safeGet.js create mode 100644 public/assets/lodash-es/_setCacheAdd.js create mode 100644 public/assets/lodash-es/_setCacheHas.js create mode 100644 public/assets/lodash-es/_setData.js create mode 100644 public/assets/lodash-es/_setToArray.js create mode 100644 public/assets/lodash-es/_setToPairs.js create mode 100644 public/assets/lodash-es/_setToString.js create mode 100644 public/assets/lodash-es/_setWrapToString.js create mode 100644 public/assets/lodash-es/_shortOut.js create mode 100644 public/assets/lodash-es/_shuffleSelf.js create mode 100644 public/assets/lodash-es/_stackClear.js create mode 100644 public/assets/lodash-es/_stackDelete.js create mode 100644 public/assets/lodash-es/_stackGet.js create mode 100644 public/assets/lodash-es/_stackHas.js create mode 100644 public/assets/lodash-es/_stackSet.js create mode 100644 public/assets/lodash-es/_strictIndexOf.js create mode 100644 public/assets/lodash-es/_strictLastIndexOf.js create mode 100644 public/assets/lodash-es/_stringSize.js create mode 100644 public/assets/lodash-es/_stringToArray.js create mode 100644 public/assets/lodash-es/_stringToPath.js create mode 100644 public/assets/lodash-es/_toKey.js create mode 100644 public/assets/lodash-es/_toSource.js create mode 100644 public/assets/lodash-es/_trimmedEndIndex.js create mode 100644 public/assets/lodash-es/_unescapeHtmlChar.js create mode 100644 public/assets/lodash-es/_unicodeSize.js create mode 100644 public/assets/lodash-es/_unicodeToArray.js create mode 100644 public/assets/lodash-es/_unicodeWords.js create mode 100644 public/assets/lodash-es/_updateWrapDetails.js create mode 100644 public/assets/lodash-es/_wrapperClone.js create mode 100644 public/assets/lodash-es/add.js create mode 100644 public/assets/lodash-es/after.js create mode 100644 public/assets/lodash-es/array.default.js create mode 100644 public/assets/lodash-es/array.js create mode 100644 public/assets/lodash-es/ary.js create mode 100644 public/assets/lodash-es/assign.js create mode 100644 public/assets/lodash-es/assignIn.js create mode 100644 public/assets/lodash-es/assignInWith.js create mode 100644 public/assets/lodash-es/assignWith.js create mode 100644 public/assets/lodash-es/at.js create mode 100644 public/assets/lodash-es/attempt.js create mode 100644 public/assets/lodash-es/before.js create mode 100644 public/assets/lodash-es/bind.js create mode 100644 public/assets/lodash-es/bindAll.js create mode 100644 public/assets/lodash-es/bindKey.js create mode 100644 public/assets/lodash-es/camelCase.js create mode 100644 public/assets/lodash-es/capitalize.js create mode 100644 public/assets/lodash-es/castArray.js create mode 100644 public/assets/lodash-es/ceil.js create mode 100644 public/assets/lodash-es/chain.js create mode 100644 public/assets/lodash-es/chunk.js create mode 100644 public/assets/lodash-es/clamp.js create mode 100644 public/assets/lodash-es/clone.js create mode 100644 public/assets/lodash-es/cloneDeep.js create mode 100644 public/assets/lodash-es/cloneDeepWith.js create mode 100644 public/assets/lodash-es/cloneWith.js create mode 100644 public/assets/lodash-es/collection.default.js create mode 100644 public/assets/lodash-es/collection.js create mode 100644 public/assets/lodash-es/commit.js create mode 100644 public/assets/lodash-es/compact.js create mode 100644 public/assets/lodash-es/concat.js create mode 100644 public/assets/lodash-es/cond.js create mode 100644 public/assets/lodash-es/conforms.js create mode 100644 public/assets/lodash-es/conformsTo.js create mode 100644 public/assets/lodash-es/constant.js create mode 100644 public/assets/lodash-es/countBy.js create mode 100644 public/assets/lodash-es/create.js create mode 100644 public/assets/lodash-es/curry.js create mode 100644 public/assets/lodash-es/curryRight.js create mode 100644 public/assets/lodash-es/date.default.js create mode 100644 public/assets/lodash-es/date.js create mode 100644 public/assets/lodash-es/debounce.js create mode 100644 public/assets/lodash-es/deburr.js create mode 100644 public/assets/lodash-es/defaultTo.js create mode 100644 public/assets/lodash-es/defaults.js create mode 100644 public/assets/lodash-es/defaultsDeep.js create mode 100644 public/assets/lodash-es/defer.js create mode 100644 public/assets/lodash-es/delay.js create mode 100644 public/assets/lodash-es/difference.js create mode 100644 public/assets/lodash-es/differenceBy.js create mode 100644 public/assets/lodash-es/differenceWith.js create mode 100644 public/assets/lodash-es/divide.js create mode 100644 public/assets/lodash-es/drop.js create mode 100644 public/assets/lodash-es/dropRight.js create mode 100644 public/assets/lodash-es/dropRightWhile.js create mode 100644 public/assets/lodash-es/dropWhile.js create mode 100644 public/assets/lodash-es/each.js create mode 100644 public/assets/lodash-es/eachRight.js create mode 100644 public/assets/lodash-es/endsWith.js create mode 100644 public/assets/lodash-es/entries.js create mode 100644 public/assets/lodash-es/entriesIn.js create mode 100644 public/assets/lodash-es/eq.js create mode 100644 public/assets/lodash-es/escape.js create mode 100644 public/assets/lodash-es/escapeRegExp.js create mode 100644 public/assets/lodash-es/every.js create mode 100644 public/assets/lodash-es/extend.js create mode 100644 public/assets/lodash-es/extendWith.js create mode 100644 public/assets/lodash-es/fill.js create mode 100644 public/assets/lodash-es/filter.js create mode 100644 public/assets/lodash-es/find.js create mode 100644 public/assets/lodash-es/findIndex.js create mode 100644 public/assets/lodash-es/findKey.js create mode 100644 public/assets/lodash-es/findLast.js create mode 100644 public/assets/lodash-es/findLastIndex.js create mode 100644 public/assets/lodash-es/findLastKey.js create mode 100644 public/assets/lodash-es/first.js create mode 100644 public/assets/lodash-es/flatMap.js create mode 100644 public/assets/lodash-es/flatMapDeep.js create mode 100644 public/assets/lodash-es/flatMapDepth.js create mode 100644 public/assets/lodash-es/flatten.js create mode 100644 public/assets/lodash-es/flattenDeep.js create mode 100644 public/assets/lodash-es/flattenDepth.js create mode 100644 public/assets/lodash-es/flip.js create mode 100644 public/assets/lodash-es/floor.js create mode 100644 public/assets/lodash-es/flow.js create mode 100644 public/assets/lodash-es/flowRight.js create mode 100644 public/assets/lodash-es/forEach.js create mode 100644 public/assets/lodash-es/forEachRight.js create mode 100644 public/assets/lodash-es/forIn.js create mode 100644 public/assets/lodash-es/forInRight.js create mode 100644 public/assets/lodash-es/forOwn.js create mode 100644 public/assets/lodash-es/forOwnRight.js create mode 100644 public/assets/lodash-es/fromPairs.js create mode 100644 public/assets/lodash-es/function.default.js create mode 100644 public/assets/lodash-es/function.js create mode 100644 public/assets/lodash-es/functions.js create mode 100644 public/assets/lodash-es/functionsIn.js create mode 100644 public/assets/lodash-es/get.js create mode 100644 public/assets/lodash-es/groupBy.js create mode 100644 public/assets/lodash-es/gt.js create mode 100644 public/assets/lodash-es/gte.js create mode 100644 public/assets/lodash-es/has.js create mode 100644 public/assets/lodash-es/hasIn.js create mode 100644 public/assets/lodash-es/head.js create mode 100644 public/assets/lodash-es/identity.js create mode 100644 public/assets/lodash-es/inRange.js create mode 100644 public/assets/lodash-es/includes.js create mode 100644 public/assets/lodash-es/indexOf.js create mode 100644 public/assets/lodash-es/initial.js create mode 100644 public/assets/lodash-es/intersection.js create mode 100644 public/assets/lodash-es/intersectionBy.js create mode 100644 public/assets/lodash-es/intersectionWith.js create mode 100644 public/assets/lodash-es/invert.js create mode 100644 public/assets/lodash-es/invertBy.js create mode 100644 public/assets/lodash-es/invoke.js create mode 100644 public/assets/lodash-es/invokeMap.js create mode 100644 public/assets/lodash-es/isArguments.js create mode 100644 public/assets/lodash-es/isArray.js create mode 100644 public/assets/lodash-es/isArrayBuffer.js create mode 100644 public/assets/lodash-es/isArrayLike.js create mode 100644 public/assets/lodash-es/isArrayLikeObject.js create mode 100644 public/assets/lodash-es/isBoolean.js create mode 100644 public/assets/lodash-es/isBuffer.js create mode 100644 public/assets/lodash-es/isDate.js create mode 100644 public/assets/lodash-es/isElement.js create mode 100644 public/assets/lodash-es/isEmpty.js create mode 100644 public/assets/lodash-es/isEqual.js create mode 100644 public/assets/lodash-es/isEqualWith.js create mode 100644 public/assets/lodash-es/isError.js create mode 100644 public/assets/lodash-es/isFinite.js create mode 100644 public/assets/lodash-es/isFunction.js create mode 100644 public/assets/lodash-es/isInteger.js create mode 100644 public/assets/lodash-es/isLength.js create mode 100644 public/assets/lodash-es/isMap.js create mode 100644 public/assets/lodash-es/isMatch.js create mode 100644 public/assets/lodash-es/isMatchWith.js create mode 100644 public/assets/lodash-es/isNaN.js create mode 100644 public/assets/lodash-es/isNative.js create mode 100644 public/assets/lodash-es/isNil.js create mode 100644 public/assets/lodash-es/isNull.js create mode 100644 public/assets/lodash-es/isNumber.js create mode 100644 public/assets/lodash-es/isObject.js create mode 100644 public/assets/lodash-es/isObjectLike.js create mode 100644 public/assets/lodash-es/isPlainObject.js create mode 100644 public/assets/lodash-es/isRegExp.js create mode 100644 public/assets/lodash-es/isSafeInteger.js create mode 100644 public/assets/lodash-es/isSet.js create mode 100644 public/assets/lodash-es/isString.js create mode 100644 public/assets/lodash-es/isSymbol.js create mode 100644 public/assets/lodash-es/isTypedArray.js create mode 100644 public/assets/lodash-es/isUndefined.js create mode 100644 public/assets/lodash-es/isWeakMap.js create mode 100644 public/assets/lodash-es/isWeakSet.js create mode 100644 public/assets/lodash-es/iteratee.js create mode 100644 public/assets/lodash-es/join.js create mode 100644 public/assets/lodash-es/kebabCase.js create mode 100644 public/assets/lodash-es/keyBy.js create mode 100644 public/assets/lodash-es/keys.js create mode 100644 public/assets/lodash-es/keysIn.js create mode 100644 public/assets/lodash-es/lang.default.js create mode 100644 public/assets/lodash-es/lang.js create mode 100644 public/assets/lodash-es/last.js create mode 100644 public/assets/lodash-es/lastIndexOf.js create mode 100644 public/assets/lodash-es/lodash.default.js create mode 100644 public/assets/lodash-es/lodash.js create mode 100644 public/assets/lodash-es/lowerCase.js create mode 100644 public/assets/lodash-es/lowerFirst.js create mode 100644 public/assets/lodash-es/lt.js create mode 100644 public/assets/lodash-es/lte.js create mode 100644 public/assets/lodash-es/map.js create mode 100644 public/assets/lodash-es/mapKeys.js create mode 100644 public/assets/lodash-es/mapValues.js create mode 100644 public/assets/lodash-es/matches.js create mode 100644 public/assets/lodash-es/matchesProperty.js create mode 100644 public/assets/lodash-es/math.default.js create mode 100644 public/assets/lodash-es/math.js create mode 100644 public/assets/lodash-es/max.js create mode 100644 public/assets/lodash-es/maxBy.js create mode 100644 public/assets/lodash-es/mean.js create mode 100644 public/assets/lodash-es/meanBy.js create mode 100644 public/assets/lodash-es/memoize.js create mode 100644 public/assets/lodash-es/merge.js create mode 100644 public/assets/lodash-es/mergeWith.js create mode 100644 public/assets/lodash-es/method.js create mode 100644 public/assets/lodash-es/methodOf.js create mode 100644 public/assets/lodash-es/min.js create mode 100644 public/assets/lodash-es/minBy.js create mode 100644 public/assets/lodash-es/mixin.js create mode 100644 public/assets/lodash-es/multiply.js create mode 100644 public/assets/lodash-es/negate.js create mode 100644 public/assets/lodash-es/next.js create mode 100644 public/assets/lodash-es/noop.js create mode 100644 public/assets/lodash-es/now.js create mode 100644 public/assets/lodash-es/nth.js create mode 100644 public/assets/lodash-es/nthArg.js create mode 100644 public/assets/lodash-es/number.default.js create mode 100644 public/assets/lodash-es/number.js create mode 100644 public/assets/lodash-es/object.default.js create mode 100644 public/assets/lodash-es/object.js create mode 100644 public/assets/lodash-es/omit.js create mode 100644 public/assets/lodash-es/omitBy.js create mode 100644 public/assets/lodash-es/once.js create mode 100644 public/assets/lodash-es/orderBy.js create mode 100644 public/assets/lodash-es/over.js create mode 100644 public/assets/lodash-es/overArgs.js create mode 100644 public/assets/lodash-es/overEvery.js create mode 100644 public/assets/lodash-es/overSome.js create mode 100644 public/assets/lodash-es/package.json create mode 100644 public/assets/lodash-es/pad.js create mode 100644 public/assets/lodash-es/padEnd.js create mode 100644 public/assets/lodash-es/padStart.js create mode 100644 public/assets/lodash-es/parseInt.js create mode 100644 public/assets/lodash-es/partial.js create mode 100644 public/assets/lodash-es/partialRight.js create mode 100644 public/assets/lodash-es/partition.js create mode 100644 public/assets/lodash-es/pick.js create mode 100644 public/assets/lodash-es/pickBy.js create mode 100644 public/assets/lodash-es/plant.js create mode 100644 public/assets/lodash-es/property.js create mode 100644 public/assets/lodash-es/propertyOf.js create mode 100644 public/assets/lodash-es/pull.js create mode 100644 public/assets/lodash-es/pullAll.js create mode 100644 public/assets/lodash-es/pullAllBy.js create mode 100644 public/assets/lodash-es/pullAllWith.js create mode 100644 public/assets/lodash-es/pullAt.js create mode 100644 public/assets/lodash-es/random.js create mode 100644 public/assets/lodash-es/range.js create mode 100644 public/assets/lodash-es/rangeRight.js create mode 100644 public/assets/lodash-es/rearg.js create mode 100644 public/assets/lodash-es/reduce.js create mode 100644 public/assets/lodash-es/reduceRight.js create mode 100644 public/assets/lodash-es/reject.js create mode 100644 public/assets/lodash-es/remove.js create mode 100644 public/assets/lodash-es/repeat.js create mode 100644 public/assets/lodash-es/replace.js create mode 100644 public/assets/lodash-es/rest.js create mode 100644 public/assets/lodash-es/result.js create mode 100644 public/assets/lodash-es/reverse.js create mode 100644 public/assets/lodash-es/round.js create mode 100644 public/assets/lodash-es/sample.js create mode 100644 public/assets/lodash-es/sampleSize.js create mode 100644 public/assets/lodash-es/seq.default.js create mode 100644 public/assets/lodash-es/seq.js create mode 100644 public/assets/lodash-es/set.js create mode 100644 public/assets/lodash-es/setWith.js create mode 100644 public/assets/lodash-es/shuffle.js create mode 100644 public/assets/lodash-es/size.js create mode 100644 public/assets/lodash-es/slice.js create mode 100644 public/assets/lodash-es/snakeCase.js create mode 100644 public/assets/lodash-es/some.js create mode 100644 public/assets/lodash-es/sortBy.js create mode 100644 public/assets/lodash-es/sortedIndex.js create mode 100644 public/assets/lodash-es/sortedIndexBy.js create mode 100644 public/assets/lodash-es/sortedIndexOf.js create mode 100644 public/assets/lodash-es/sortedLastIndex.js create mode 100644 public/assets/lodash-es/sortedLastIndexBy.js create mode 100644 public/assets/lodash-es/sortedLastIndexOf.js create mode 100644 public/assets/lodash-es/sortedUniq.js create mode 100644 public/assets/lodash-es/sortedUniqBy.js create mode 100644 public/assets/lodash-es/split.js create mode 100644 public/assets/lodash-es/spread.js create mode 100644 public/assets/lodash-es/startCase.js create mode 100644 public/assets/lodash-es/startsWith.js create mode 100644 public/assets/lodash-es/string.default.js create mode 100644 public/assets/lodash-es/string.js create mode 100644 public/assets/lodash-es/stubArray.js create mode 100644 public/assets/lodash-es/stubFalse.js create mode 100644 public/assets/lodash-es/stubObject.js create mode 100644 public/assets/lodash-es/stubString.js create mode 100644 public/assets/lodash-es/stubTrue.js create mode 100644 public/assets/lodash-es/subtract.js create mode 100644 public/assets/lodash-es/sum.js create mode 100644 public/assets/lodash-es/sumBy.js create mode 100644 public/assets/lodash-es/tail.js create mode 100644 public/assets/lodash-es/take.js create mode 100644 public/assets/lodash-es/takeRight.js create mode 100644 public/assets/lodash-es/takeRightWhile.js create mode 100644 public/assets/lodash-es/takeWhile.js create mode 100644 public/assets/lodash-es/tap.js create mode 100644 public/assets/lodash-es/template.js create mode 100644 public/assets/lodash-es/templateSettings.js create mode 100644 public/assets/lodash-es/throttle.js create mode 100644 public/assets/lodash-es/thru.js create mode 100644 public/assets/lodash-es/times.js create mode 100644 public/assets/lodash-es/toArray.js create mode 100644 public/assets/lodash-es/toFinite.js create mode 100644 public/assets/lodash-es/toInteger.js create mode 100644 public/assets/lodash-es/toIterator.js create mode 100644 public/assets/lodash-es/toJSON.js create mode 100644 public/assets/lodash-es/toLength.js create mode 100644 public/assets/lodash-es/toLower.js create mode 100644 public/assets/lodash-es/toNumber.js create mode 100644 public/assets/lodash-es/toPairs.js create mode 100644 public/assets/lodash-es/toPairsIn.js create mode 100644 public/assets/lodash-es/toPath.js create mode 100644 public/assets/lodash-es/toPlainObject.js create mode 100644 public/assets/lodash-es/toSafeInteger.js create mode 100644 public/assets/lodash-es/toString.js create mode 100644 public/assets/lodash-es/toUpper.js create mode 100644 public/assets/lodash-es/transform.js create mode 100644 public/assets/lodash-es/trim.js create mode 100644 public/assets/lodash-es/trimEnd.js create mode 100644 public/assets/lodash-es/trimStart.js create mode 100644 public/assets/lodash-es/truncate.js create mode 100644 public/assets/lodash-es/unary.js create mode 100644 public/assets/lodash-es/unescape.js create mode 100644 public/assets/lodash-es/union.js create mode 100644 public/assets/lodash-es/unionBy.js create mode 100644 public/assets/lodash-es/unionWith.js create mode 100644 public/assets/lodash-es/uniq.js create mode 100644 public/assets/lodash-es/uniqBy.js create mode 100644 public/assets/lodash-es/uniqWith.js create mode 100644 public/assets/lodash-es/uniqueId.js create mode 100644 public/assets/lodash-es/unset.js create mode 100644 public/assets/lodash-es/unzip.js create mode 100644 public/assets/lodash-es/unzipWith.js create mode 100644 public/assets/lodash-es/update.js create mode 100644 public/assets/lodash-es/updateWith.js create mode 100644 public/assets/lodash-es/upperCase.js create mode 100644 public/assets/lodash-es/upperFirst.js create mode 100644 public/assets/lodash-es/util.default.js create mode 100644 public/assets/lodash-es/util.js create mode 100644 public/assets/lodash-es/value.js create mode 100644 public/assets/lodash-es/valueOf.js create mode 100644 public/assets/lodash-es/values.js create mode 100644 public/assets/lodash-es/valuesIn.js create mode 100644 public/assets/lodash-es/without.js create mode 100644 public/assets/lodash-es/words.js create mode 100644 public/assets/lodash-es/wrap.js create mode 100644 public/assets/lodash-es/wrapperAt.js create mode 100644 public/assets/lodash-es/wrapperChain.js create mode 100644 public/assets/lodash-es/wrapperLodash.js create mode 100644 public/assets/lodash-es/wrapperReverse.js create mode 100644 public/assets/lodash-es/wrapperValue.js create mode 100644 public/assets/lodash-es/xor.js create mode 100644 public/assets/lodash-es/xorBy.js create mode 100644 public/assets/lodash-es/xorWith.js create mode 100644 public/assets/lodash-es/zip.js create mode 100644 public/assets/lodash-es/zipObject.js create mode 100644 public/assets/lodash-es/zipObjectDeep.js create mode 100644 public/assets/lodash-es/zipWith.js create mode 100644 public/assets/lodash.clonedeep/LICENSE create mode 100644 public/assets/lodash.clonedeep/README.md create mode 100644 public/assets/lodash.clonedeep/index.js create mode 100644 public/assets/lodash.clonedeep/package.json create mode 100644 public/assets/lodash.isequal/LICENSE create mode 100644 public/assets/lodash.isequal/README.md create mode 100644 public/assets/lodash.isequal/index.js create mode 100644 public/assets/lodash.isequal/package.json create mode 100644 public/assets/parchment/LICENSE create mode 100644 public/assets/parchment/README.md create mode 100644 public/assets/parchment/dist/parchment.d.ts create mode 100644 public/assets/parchment/dist/parchment.js create mode 100644 public/assets/parchment/dist/parchment.js.map create mode 100644 public/assets/parchment/dist/parchment.umd.cjs create mode 100644 public/assets/parchment/dist/parchment.umd.cjs.map create mode 100644 public/assets/parchment/package.json create mode 100644 public/assets/parchment/src/attributor/attributor.ts create mode 100644 public/assets/parchment/src/attributor/class.ts create mode 100644 public/assets/parchment/src/attributor/store.ts create mode 100644 public/assets/parchment/src/attributor/style.ts create mode 100644 public/assets/parchment/src/blot/abstract/blot.ts create mode 100644 public/assets/parchment/src/blot/abstract/container.ts create mode 100644 public/assets/parchment/src/blot/abstract/leaf.ts create mode 100644 public/assets/parchment/src/blot/abstract/parent.ts create mode 100644 public/assets/parchment/src/blot/abstract/shadow.ts create mode 100644 public/assets/parchment/src/blot/block.ts create mode 100644 public/assets/parchment/src/blot/embed.ts create mode 100644 public/assets/parchment/src/blot/inline.ts create mode 100644 public/assets/parchment/src/blot/scroll.ts create mode 100644 public/assets/parchment/src/blot/text.ts create mode 100644 public/assets/parchment/src/collection/linked-list.ts create mode 100644 public/assets/parchment/src/collection/linked-node.ts create mode 100644 public/assets/parchment/src/error.ts create mode 100644 public/assets/parchment/src/parchment.ts create mode 100644 public/assets/parchment/src/registry.ts create mode 100644 public/assets/parchment/src/scope.ts create mode 100644 public/assets/parchment/tsconfig.json create mode 100644 public/assets/quill-delta/LICENSE create mode 100644 public/assets/quill-delta/README.md create mode 100644 public/assets/quill-delta/dist/AttributeMap.d.ts create mode 100644 public/assets/quill-delta/dist/AttributeMap.js create mode 100644 public/assets/quill-delta/dist/AttributeMap.js.map create mode 100644 public/assets/quill-delta/dist/Delta.d.ts create mode 100644 public/assets/quill-delta/dist/Delta.js create mode 100644 public/assets/quill-delta/dist/Delta.js.map create mode 100644 public/assets/quill-delta/dist/Op.d.ts create mode 100644 public/assets/quill-delta/dist/Op.js create mode 100644 public/assets/quill-delta/dist/Op.js.map create mode 100644 public/assets/quill-delta/dist/OpIterator.d.ts create mode 100644 public/assets/quill-delta/dist/OpIterator.js create mode 100644 public/assets/quill-delta/dist/OpIterator.js.map create mode 100644 public/assets/quill-delta/package.json create mode 100644 public/assets/quill-delta/src/AttributeMap.ts create mode 100644 public/assets/quill-delta/src/Delta.ts create mode 100644 public/assets/quill-delta/src/Op.ts create mode 100644 public/assets/quill-delta/src/OpIterator.ts create mode 100644 public/assets/quill-delta/tsconfig.json create mode 100644 public/assets/quill/LICENSE create mode 100644 public/assets/quill/README.md create mode 100644 public/assets/quill/assets/base.styl create mode 100644 public/assets/quill/assets/bubble.styl create mode 100644 public/assets/quill/assets/bubble/toolbar.styl create mode 100644 public/assets/quill/assets/bubble/tooltip.styl create mode 100644 public/assets/quill/assets/core.styl create mode 100644 public/assets/quill/assets/favicon.png create mode 100644 public/assets/quill/assets/icons/align-center.svg create mode 100644 public/assets/quill/assets/icons/align-justify.svg create mode 100644 public/assets/quill/assets/icons/align-left.svg create mode 100644 public/assets/quill/assets/icons/align-right.svg create mode 100644 public/assets/quill/assets/icons/attachment.svg create mode 100644 public/assets/quill/assets/icons/audio.svg create mode 100644 public/assets/quill/assets/icons/authorship.svg create mode 100644 public/assets/quill/assets/icons/background.svg create mode 100644 public/assets/quill/assets/icons/blockquote.svg create mode 100644 public/assets/quill/assets/icons/bold.svg create mode 100644 public/assets/quill/assets/icons/clean.svg create mode 100644 public/assets/quill/assets/icons/code.svg create mode 100644 public/assets/quill/assets/icons/color.svg create mode 100644 public/assets/quill/assets/icons/comment.svg create mode 100644 public/assets/quill/assets/icons/direction-ltr.svg create mode 100644 public/assets/quill/assets/icons/direction-rtl.svg create mode 100644 public/assets/quill/assets/icons/dropdown.svg create mode 100644 public/assets/quill/assets/icons/embed.svg create mode 100644 public/assets/quill/assets/icons/emoji.svg create mode 100644 public/assets/quill/assets/icons/float-center.svg create mode 100644 public/assets/quill/assets/icons/float-full.svg create mode 100644 public/assets/quill/assets/icons/float-left.svg create mode 100644 public/assets/quill/assets/icons/float-right.svg create mode 100644 public/assets/quill/assets/icons/font.svg create mode 100644 public/assets/quill/assets/icons/formula.svg create mode 100644 public/assets/quill/assets/icons/hashtag.svg create mode 100644 public/assets/quill/assets/icons/header-2.svg create mode 100644 public/assets/quill/assets/icons/header-3.svg create mode 100644 public/assets/quill/assets/icons/header-4.svg create mode 100644 public/assets/quill/assets/icons/header-5.svg create mode 100644 public/assets/quill/assets/icons/header-6.svg create mode 100644 public/assets/quill/assets/icons/header.svg create mode 100644 public/assets/quill/assets/icons/horizontal-rule.svg create mode 100644 public/assets/quill/assets/icons/image.svg create mode 100644 public/assets/quill/assets/icons/indent.svg create mode 100644 public/assets/quill/assets/icons/italic.svg create mode 100644 public/assets/quill/assets/icons/link.svg create mode 100644 public/assets/quill/assets/icons/list-bullet.svg create mode 100644 public/assets/quill/assets/icons/list-check.svg create mode 100644 public/assets/quill/assets/icons/list-ordered.svg create mode 100644 public/assets/quill/assets/icons/map.svg create mode 100644 public/assets/quill/assets/icons/mention.svg create mode 100644 public/assets/quill/assets/icons/more.svg create mode 100644 public/assets/quill/assets/icons/outdent.svg create mode 100644 public/assets/quill/assets/icons/redo.svg create mode 100644 public/assets/quill/assets/icons/size-decrease.svg create mode 100644 public/assets/quill/assets/icons/size-increase.svg create mode 100644 public/assets/quill/assets/icons/size.svg create mode 100644 public/assets/quill/assets/icons/spacing.svg create mode 100644 public/assets/quill/assets/icons/speech.svg create mode 100644 public/assets/quill/assets/icons/strike.svg create mode 100644 public/assets/quill/assets/icons/subscript.svg create mode 100644 public/assets/quill/assets/icons/superscript.svg create mode 100644 public/assets/quill/assets/icons/table-border-all.svg create mode 100644 public/assets/quill/assets/icons/table-border-bottom.svg create mode 100644 public/assets/quill/assets/icons/table-border-left.svg create mode 100644 public/assets/quill/assets/icons/table-border-none.svg create mode 100644 public/assets/quill/assets/icons/table-border-outside.svg create mode 100644 public/assets/quill/assets/icons/table-border-right.svg create mode 100644 public/assets/quill/assets/icons/table-border-top.svg create mode 100644 public/assets/quill/assets/icons/table-delete-cells.svg create mode 100644 public/assets/quill/assets/icons/table-delete-columns.svg create mode 100644 public/assets/quill/assets/icons/table-delete-rows.svg create mode 100644 public/assets/quill/assets/icons/table-insert-cells.svg create mode 100644 public/assets/quill/assets/icons/table-insert-columns.svg create mode 100644 public/assets/quill/assets/icons/table-insert-rows.svg create mode 100644 public/assets/quill/assets/icons/table-merge-cells.svg create mode 100644 public/assets/quill/assets/icons/table-unmerge-cells.svg create mode 100644 public/assets/quill/assets/icons/table.svg create mode 100644 public/assets/quill/assets/icons/underline.svg create mode 100644 public/assets/quill/assets/icons/undo.svg create mode 100644 public/assets/quill/assets/icons/video.svg create mode 100644 public/assets/quill/assets/snow.styl create mode 100644 public/assets/quill/assets/snow/toolbar.styl create mode 100644 public/assets/quill/assets/snow/tooltip.styl create mode 100644 public/assets/quill/blots/block.d.ts create mode 100644 public/assets/quill/blots/block.js create mode 100644 public/assets/quill/blots/block.js.map create mode 100644 public/assets/quill/blots/break.d.ts create mode 100644 public/assets/quill/blots/break.js create mode 100644 public/assets/quill/blots/break.js.map create mode 100644 public/assets/quill/blots/container.d.ts create mode 100644 public/assets/quill/blots/container.js create mode 100644 public/assets/quill/blots/container.js.map create mode 100644 public/assets/quill/blots/cursor.d.ts create mode 100644 public/assets/quill/blots/cursor.js create mode 100644 public/assets/quill/blots/cursor.js.map create mode 100644 public/assets/quill/blots/embed.d.ts create mode 100644 public/assets/quill/blots/embed.js create mode 100644 public/assets/quill/blots/embed.js.map create mode 100644 public/assets/quill/blots/inline.d.ts create mode 100644 public/assets/quill/blots/inline.js create mode 100644 public/assets/quill/blots/inline.js.map create mode 100644 public/assets/quill/blots/scroll.d.ts create mode 100644 public/assets/quill/blots/scroll.js create mode 100644 public/assets/quill/blots/scroll.js.map create mode 100644 public/assets/quill/blots/text.d.ts create mode 100644 public/assets/quill/blots/text.js create mode 100644 public/assets/quill/blots/text.js.map create mode 100644 public/assets/quill/core.d.ts create mode 100644 public/assets/quill/core.js create mode 100644 public/assets/quill/core.js.map create mode 100644 public/assets/quill/core/composition.d.ts create mode 100644 public/assets/quill/core/composition.js create mode 100644 public/assets/quill/core/composition.js.map create mode 100644 public/assets/quill/core/editor.d.ts create mode 100644 public/assets/quill/core/editor.js create mode 100644 public/assets/quill/core/editor.js.map create mode 100644 public/assets/quill/core/emitter.d.ts create mode 100644 public/assets/quill/core/emitter.js create mode 100644 public/assets/quill/core/emitter.js.map create mode 100644 public/assets/quill/core/instances.d.ts create mode 100644 public/assets/quill/core/instances.js create mode 100644 public/assets/quill/core/instances.js.map create mode 100644 public/assets/quill/core/logger.d.ts create mode 100644 public/assets/quill/core/logger.js create mode 100644 public/assets/quill/core/logger.js.map create mode 100644 public/assets/quill/core/module.d.ts create mode 100644 public/assets/quill/core/module.js create mode 100644 public/assets/quill/core/module.js.map create mode 100644 public/assets/quill/core/quill.d.ts create mode 100644 public/assets/quill/core/quill.js create mode 100644 public/assets/quill/core/quill.js.map create mode 100644 public/assets/quill/core/selection.d.ts create mode 100644 public/assets/quill/core/selection.js create mode 100644 public/assets/quill/core/selection.js.map create mode 100644 public/assets/quill/core/theme.d.ts create mode 100644 public/assets/quill/core/theme.js create mode 100644 public/assets/quill/core/theme.js.map create mode 100644 public/assets/quill/core/utils/createRegistryWithFormats.d.ts create mode 100644 public/assets/quill/core/utils/createRegistryWithFormats.js create mode 100644 public/assets/quill/core/utils/createRegistryWithFormats.js.map create mode 100644 public/assets/quill/core/utils/scrollRectIntoView.d.ts create mode 100644 public/assets/quill/core/utils/scrollRectIntoView.js create mode 100644 public/assets/quill/core/utils/scrollRectIntoView.js.map create mode 100644 public/assets/quill/dist/quill.bubble.css create mode 100644 public/assets/quill/dist/quill.bubble.css.map create mode 100644 public/assets/quill/dist/quill.core.css create mode 100644 public/assets/quill/dist/quill.core.css.map create mode 100644 public/assets/quill/dist/quill.core.js create mode 100644 public/assets/quill/dist/quill.core.js.LICENSE.txt create mode 100644 public/assets/quill/dist/quill.core.js.map create mode 100644 public/assets/quill/dist/quill.js create mode 100644 public/assets/quill/dist/quill.js.LICENSE.txt create mode 100644 public/assets/quill/dist/quill.js.map create mode 100644 public/assets/quill/dist/quill.snow.css create mode 100644 public/assets/quill/dist/quill.snow.css.map create mode 100644 public/assets/quill/formats/align.d.ts create mode 100644 public/assets/quill/formats/align.js create mode 100644 public/assets/quill/formats/align.js.map create mode 100644 public/assets/quill/formats/background.d.ts create mode 100644 public/assets/quill/formats/background.js create mode 100644 public/assets/quill/formats/background.js.map create mode 100644 public/assets/quill/formats/blockquote.d.ts create mode 100644 public/assets/quill/formats/blockquote.js create mode 100644 public/assets/quill/formats/blockquote.js.map create mode 100644 public/assets/quill/formats/bold.d.ts create mode 100644 public/assets/quill/formats/bold.js create mode 100644 public/assets/quill/formats/bold.js.map create mode 100644 public/assets/quill/formats/code.d.ts create mode 100644 public/assets/quill/formats/code.js create mode 100644 public/assets/quill/formats/code.js.map create mode 100644 public/assets/quill/formats/color.d.ts create mode 100644 public/assets/quill/formats/color.js create mode 100644 public/assets/quill/formats/color.js.map create mode 100644 public/assets/quill/formats/direction.d.ts create mode 100644 public/assets/quill/formats/direction.js create mode 100644 public/assets/quill/formats/direction.js.map create mode 100644 public/assets/quill/formats/font.d.ts create mode 100644 public/assets/quill/formats/font.js create mode 100644 public/assets/quill/formats/font.js.map create mode 100644 public/assets/quill/formats/formula.d.ts create mode 100644 public/assets/quill/formats/formula.js create mode 100644 public/assets/quill/formats/formula.js.map create mode 100644 public/assets/quill/formats/header.d.ts create mode 100644 public/assets/quill/formats/header.js create mode 100644 public/assets/quill/formats/header.js.map create mode 100644 public/assets/quill/formats/image.d.ts create mode 100644 public/assets/quill/formats/image.js create mode 100644 public/assets/quill/formats/image.js.map create mode 100644 public/assets/quill/formats/indent.d.ts create mode 100644 public/assets/quill/formats/indent.js create mode 100644 public/assets/quill/formats/indent.js.map create mode 100644 public/assets/quill/formats/italic.d.ts create mode 100644 public/assets/quill/formats/italic.js create mode 100644 public/assets/quill/formats/italic.js.map create mode 100644 public/assets/quill/formats/link.d.ts create mode 100644 public/assets/quill/formats/link.js create mode 100644 public/assets/quill/formats/link.js.map create mode 100644 public/assets/quill/formats/list.d.ts create mode 100644 public/assets/quill/formats/list.js create mode 100644 public/assets/quill/formats/list.js.map create mode 100644 public/assets/quill/formats/script.d.ts create mode 100644 public/assets/quill/formats/script.js create mode 100644 public/assets/quill/formats/script.js.map create mode 100644 public/assets/quill/formats/size.d.ts create mode 100644 public/assets/quill/formats/size.js create mode 100644 public/assets/quill/formats/size.js.map create mode 100644 public/assets/quill/formats/strike.d.ts create mode 100644 public/assets/quill/formats/strike.js create mode 100644 public/assets/quill/formats/strike.js.map create mode 100644 public/assets/quill/formats/table.d.ts create mode 100644 public/assets/quill/formats/table.js create mode 100644 public/assets/quill/formats/table.js.map create mode 100644 public/assets/quill/formats/underline.d.ts create mode 100644 public/assets/quill/formats/underline.js create mode 100644 public/assets/quill/formats/underline.js.map create mode 100644 public/assets/quill/formats/video.d.ts create mode 100644 public/assets/quill/formats/video.js create mode 100644 public/assets/quill/formats/video.js.map create mode 100644 public/assets/quill/modules/clipboard.d.ts create mode 100644 public/assets/quill/modules/clipboard.js create mode 100644 public/assets/quill/modules/clipboard.js.map create mode 100644 public/assets/quill/modules/history.d.ts create mode 100644 public/assets/quill/modules/history.js create mode 100644 public/assets/quill/modules/history.js.map create mode 100644 public/assets/quill/modules/input.d.ts create mode 100644 public/assets/quill/modules/input.js create mode 100644 public/assets/quill/modules/input.js.map create mode 100644 public/assets/quill/modules/keyboard.d.ts create mode 100644 public/assets/quill/modules/keyboard.js create mode 100644 public/assets/quill/modules/keyboard.js.map create mode 100644 public/assets/quill/modules/normalizeExternalHTML/index.d.ts create mode 100644 public/assets/quill/modules/normalizeExternalHTML/index.js create mode 100644 public/assets/quill/modules/normalizeExternalHTML/index.js.map create mode 100644 public/assets/quill/modules/normalizeExternalHTML/normalizers/googleDocs.d.ts create mode 100644 public/assets/quill/modules/normalizeExternalHTML/normalizers/googleDocs.js create mode 100644 public/assets/quill/modules/normalizeExternalHTML/normalizers/googleDocs.js.map create mode 100644 public/assets/quill/modules/normalizeExternalHTML/normalizers/msWord.d.ts create mode 100644 public/assets/quill/modules/normalizeExternalHTML/normalizers/msWord.js create mode 100644 public/assets/quill/modules/normalizeExternalHTML/normalizers/msWord.js.map create mode 100644 public/assets/quill/modules/syntax.d.ts create mode 100644 public/assets/quill/modules/syntax.js create mode 100644 public/assets/quill/modules/syntax.js.map create mode 100644 public/assets/quill/modules/table.d.ts create mode 100644 public/assets/quill/modules/table.js create mode 100644 public/assets/quill/modules/table.js.map create mode 100644 public/assets/quill/modules/tableEmbed.d.ts create mode 100644 public/assets/quill/modules/tableEmbed.js create mode 100644 public/assets/quill/modules/tableEmbed.js.map create mode 100644 public/assets/quill/modules/toolbar.d.ts create mode 100644 public/assets/quill/modules/toolbar.js create mode 100644 public/assets/quill/modules/toolbar.js.map create mode 100644 public/assets/quill/modules/uiNode.d.ts create mode 100644 public/assets/quill/modules/uiNode.js create mode 100644 public/assets/quill/modules/uiNode.js.map create mode 100644 public/assets/quill/modules/uploader.d.ts create mode 100644 public/assets/quill/modules/uploader.js create mode 100644 public/assets/quill/modules/uploader.js.map create mode 100644 public/assets/quill/package.json create mode 100644 public/assets/quill/quill.d.ts create mode 100644 public/assets/quill/quill.js create mode 100644 public/assets/quill/quill.js.map create mode 100644 public/assets/quill/themes/base.d.ts create mode 100644 public/assets/quill/themes/base.js create mode 100644 public/assets/quill/themes/base.js.map create mode 100644 public/assets/quill/themes/bubble.d.ts create mode 100644 public/assets/quill/themes/bubble.js create mode 100644 public/assets/quill/themes/bubble.js.map create mode 100644 public/assets/quill/themes/snow.d.ts create mode 100644 public/assets/quill/themes/snow.js create mode 100644 public/assets/quill/themes/snow.js.map create mode 100644 public/assets/quill/types.d.js create mode 100644 public/assets/quill/types.d.js.map create mode 100644 public/assets/quill/ui/color-picker.d.ts create mode 100644 public/assets/quill/ui/color-picker.js create mode 100644 public/assets/quill/ui/color-picker.js.map create mode 100644 public/assets/quill/ui/icon-picker.d.ts create mode 100644 public/assets/quill/ui/icon-picker.js create mode 100644 public/assets/quill/ui/icon-picker.js.map create mode 100644 public/assets/quill/ui/icons.d.ts create mode 100644 public/assets/quill/ui/icons.js create mode 100644 public/assets/quill/ui/icons.js.map create mode 100644 public/assets/quill/ui/picker.d.ts create mode 100644 public/assets/quill/ui/picker.js create mode 100644 public/assets/quill/ui/picker.js.map create mode 100644 public/assets/quill/ui/tooltip.d.ts create mode 100644 public/assets/quill/ui/tooltip.js create mode 100644 public/assets/quill/ui/tooltip.js.map create mode 100644 public/assets/sweetalert2/LICENSE create mode 100644 public/assets/sweetalert2/README.md create mode 100644 public/assets/sweetalert2/dist/sweetalert2.all.js create mode 100644 public/assets/sweetalert2/dist/sweetalert2.all.min.js create mode 100644 public/assets/sweetalert2/dist/sweetalert2.css create mode 100644 public/assets/sweetalert2/dist/sweetalert2.esm.all.js create mode 100644 public/assets/sweetalert2/dist/sweetalert2.esm.all.min.js create mode 100644 public/assets/sweetalert2/dist/sweetalert2.esm.js create mode 100644 public/assets/sweetalert2/dist/sweetalert2.esm.min.js create mode 100644 public/assets/sweetalert2/dist/sweetalert2.js create mode 100644 public/assets/sweetalert2/dist/sweetalert2.min.css create mode 100644 public/assets/sweetalert2/dist/sweetalert2.min.js create mode 100644 public/assets/sweetalert2/package.json create mode 100644 public/assets/sweetalert2/src/SweetAlert.js create mode 100644 public/assets/sweetalert2/src/buttons-handlers.js create mode 100644 public/assets/sweetalert2/src/constants.js create mode 100644 public/assets/sweetalert2/src/globalState.js create mode 100644 public/assets/sweetalert2/src/instanceMethods.js create mode 100644 public/assets/sweetalert2/src/instanceMethods/_destroy.js create mode 100644 public/assets/sweetalert2/src/instanceMethods/close.js create mode 100644 public/assets/sweetalert2/src/instanceMethods/enable-disable-elements.js create mode 100644 public/assets/sweetalert2/src/instanceMethods/getInput.js create mode 100644 public/assets/sweetalert2/src/instanceMethods/hideLoading.js create mode 100644 public/assets/sweetalert2/src/instanceMethods/update.js create mode 100644 public/assets/sweetalert2/src/instanceMethods/validation-message.js create mode 100644 public/assets/sweetalert2/src/keydown-handler.js create mode 100644 public/assets/sweetalert2/src/popup-click-handler.js create mode 100644 public/assets/sweetalert2/src/privateMethods.js create mode 100644 public/assets/sweetalert2/src/privateProps.js create mode 100644 public/assets/sweetalert2/src/staticMethods.js create mode 100644 public/assets/sweetalert2/src/staticMethods/argsToParams.js create mode 100644 public/assets/sweetalert2/src/staticMethods/bindClickHandler.js create mode 100644 public/assets/sweetalert2/src/staticMethods/dom.js create mode 100644 public/assets/sweetalert2/src/staticMethods/eventHandlers.js create mode 100644 public/assets/sweetalert2/src/staticMethods/fire.js create mode 100644 public/assets/sweetalert2/src/staticMethods/mixin.js create mode 100644 public/assets/sweetalert2/src/staticMethods/showLoading.js create mode 100644 public/assets/sweetalert2/src/staticMethods/timer.js create mode 100644 public/assets/sweetalert2/src/sweetalert2.js create mode 100644 public/assets/sweetalert2/src/sweetalert2.scss create mode 100644 public/assets/sweetalert2/src/types.js create mode 100644 public/assets/sweetalert2/src/utils/DismissReason.js create mode 100644 public/assets/sweetalert2/src/utils/EventEmitter.js create mode 100644 public/assets/sweetalert2/src/utils/Timer.js create mode 100644 public/assets/sweetalert2/src/utils/aria.js create mode 100644 public/assets/sweetalert2/src/utils/classes.js create mode 100644 public/assets/sweetalert2/src/utils/defaultInputValidators.js create mode 100644 public/assets/sweetalert2/src/utils/dom/domUtils.js create mode 100644 public/assets/sweetalert2/src/utils/dom/getters.js create mode 100644 public/assets/sweetalert2/src/utils/dom/index.js create mode 100644 public/assets/sweetalert2/src/utils/dom/init.js create mode 100644 public/assets/sweetalert2/src/utils/dom/inputUtils.js create mode 100644 public/assets/sweetalert2/src/utils/dom/parseHtmlToContainer.js create mode 100644 public/assets/sweetalert2/src/utils/dom/renderers/render.js create mode 100644 public/assets/sweetalert2/src/utils/dom/renderers/renderActions.js create mode 100644 public/assets/sweetalert2/src/utils/dom/renderers/renderCloseButton.js create mode 100644 public/assets/sweetalert2/src/utils/dom/renderers/renderContainer.js create mode 100644 public/assets/sweetalert2/src/utils/dom/renderers/renderContent.js create mode 100644 public/assets/sweetalert2/src/utils/dom/renderers/renderFooter.js create mode 100644 public/assets/sweetalert2/src/utils/dom/renderers/renderIcon.js create mode 100644 public/assets/sweetalert2/src/utils/dom/renderers/renderImage.js create mode 100644 public/assets/sweetalert2/src/utils/dom/renderers/renderInput.js create mode 100644 public/assets/sweetalert2/src/utils/dom/renderers/renderPopup.js create mode 100644 public/assets/sweetalert2/src/utils/dom/renderers/renderProgressSteps.js create mode 100644 public/assets/sweetalert2/src/utils/dom/renderers/renderTitle.js create mode 100644 public/assets/sweetalert2/src/utils/draggable.js create mode 100644 public/assets/sweetalert2/src/utils/getTemplateParams.js create mode 100644 public/assets/sweetalert2/src/utils/iosFix.js create mode 100644 public/assets/sweetalert2/src/utils/isNodeEnv.js create mode 100644 public/assets/sweetalert2/src/utils/openPopup.js create mode 100644 public/assets/sweetalert2/src/utils/params.js create mode 100644 public/assets/sweetalert2/src/utils/scrollbar.js create mode 100644 public/assets/sweetalert2/src/utils/setParameters.js create mode 100644 public/assets/sweetalert2/src/utils/utils.js create mode 100644 public/assets/sweetalert2/sweetalert2.d.ts create mode 100644 public/assets/sweetalert2/themes/bootstrap-4.css create mode 100644 public/assets/sweetalert2/themes/bootstrap-5.css create mode 100644 public/assets/sweetalert2/themes/borderless.css create mode 100644 public/assets/sweetalert2/themes/bulma.css create mode 100644 public/assets/sweetalert2/themes/embed-iframe.css create mode 100644 public/assets/sweetalert2/themes/material-ui.css create mode 100644 public/assets/sweetalert2/themes/minimal.css create mode 100644 routes/admin_routes.go create mode 100644 routes/router.go create mode 100644 scripts/run_seed.go create mode 100644 scripts/seed.go create mode 100644 services/email_service.go create mode 100644 services/image_service.go create mode 100644 services/jwt_service.go create mode 100644 uploads/avatars/1771463327203925000.avif create mode 100644 uploads/heroes/1771462786293897000.avif create mode 100644 uploads/heroes/1771862104815889000.avif create mode 100644 uploads/heroes/1771865266626275000.avif create mode 100644 uploads/heroes/1771865441019283000.avif create mode 100644 uploads/heroes/1771866031442506000.avif create mode 100644 uploads/posts/1771859718082392000.avif create mode 100644 uploads/posts/1771859721468633000.avif create mode 100644 uploads/posts/1771859721610410000.avif create mode 100644 uploads/posts/post_10_6d0da2.jpg create mode 100644 uploads/posts/post_11_81d5ea.jpg create mode 100644 uploads/posts/post_12_a0f35d.jpg create mode 100644 uploads/posts/post_13_984031.jpg create mode 100644 uploads/posts/post_14_43802d.jpg create mode 100644 uploads/posts/post_15_0e7af1.jpg create mode 100644 uploads/posts/post_16_cec1c8.jpg create mode 100644 uploads/posts/post_17_be7a83.jpg create mode 100644 uploads/posts/post_18_318387.jpg create mode 100644 uploads/posts/post_19_0c9543.jpg create mode 100644 uploads/posts/post_1_f40ccf.jpg create mode 100644 uploads/posts/post_20_254902.jpg create mode 100644 uploads/posts/post_21_04e3ed.jpg create mode 100644 uploads/posts/post_22_7d2def.jpg create mode 100644 uploads/posts/post_23_9ac486.jpg create mode 100644 uploads/posts/post_24_3bcfff.jpg create mode 100644 uploads/posts/post_25_396008.jpg create mode 100644 uploads/posts/post_26_4a43f6.jpg create mode 100644 uploads/posts/post_27_341378.jpg create mode 100644 uploads/posts/post_28_f7cabe.jpg create mode 100644 uploads/posts/post_29_8bdb87.jpg create mode 100644 uploads/posts/post_2_a8f92e.jpg create mode 100644 uploads/posts/post_30_36ddf7.jpg create mode 100644 uploads/posts/post_31_7723a9.jpg create mode 100644 uploads/posts/post_32_242d41.jpg create mode 100644 uploads/posts/post_33_a677ef.jpg create mode 100644 uploads/posts/post_34_602386.jpg create mode 100644 uploads/posts/post_35_98d2e4.jpg create mode 100644 uploads/posts/post_36_480892.jpg create mode 100644 uploads/posts/post_37_88102c.jpg create mode 100644 uploads/posts/post_38_d71be4.jpg create mode 100644 uploads/posts/post_39_cfa50c.jpg create mode 100644 uploads/posts/post_3_4dd9d8.jpg create mode 100644 uploads/posts/post_4_f4d82a.jpg create mode 100644 uploads/posts/post_5_3586d4.jpg create mode 100644 uploads/posts/post_6_6b99f4.jpg create mode 100644 uploads/posts/post_7_7c5ec2.jpg create mode 100644 uploads/posts/post_8_b68a8f.jpg create mode 100644 uploads/posts/post_9_4afa25.jpg create mode 100644 uploads/products/1771671930149210000.avif create mode 100644 uploads/products/1771672200043681000.avif create mode 100644 uploads/products/1771672263636058000.avif create mode 100644 uploads/products/1771672413521924000.avif create mode 100644 uploads/products/1771672442685189000.avif create mode 100644 uploads/products/1771672519906779000.avif create mode 100644 uploads/products/1771672563773818000.avif create mode 100644 uploads/products/1771672644175870000.avif create mode 100644 uploads/settings/1771462772417753000.avif create mode 100644 uploads/settings/1771462773364545000.avif create mode 100644 views/admin/layout.html create mode 100644 views/admin/login.html create mode 100644 views/admin/pages/category_form.html create mode 100644 views/admin/pages/hero_form.html create mode 100644 views/admin/pages/post_form.html create mode 100644 views/admin/pages/product_category_form.html create mode 100644 views/admin/pages/product_form.html create mode 100644 views/admin/pages/product_tag_form.html create mode 100644 views/admin/pages/tag_form.html create mode 100644 views/admin/pages/user_form.html create mode 100644 views/admin/partials/carts.html create mode 100644 views/admin/partials/categories.html create mode 100644 views/admin/partials/category_views.html create mode 100644 views/admin/partials/comments.html create mode 100644 views/admin/partials/dashboard.html create mode 100644 views/admin/partials/posts.html create mode 100644 views/admin/partials/product_categories.html create mode 100644 views/admin/partials/product_category_views.html create mode 100644 views/admin/partials/product_comments.html create mode 100644 views/admin/partials/product_tags.html create mode 100644 views/admin/partials/products.html create mode 100644 views/admin/partials/settings.html create mode 100644 views/admin/partials/tags.html create mode 100644 views/admin/partials/users.html create mode 100644 views/coming_soon.html diff --git a/.air.toml b/.air.toml new file mode 100644 index 0000000..ed479c5 --- /dev/null +++ b/.air.toml @@ -0,0 +1,58 @@ +#:schema https://json.schemastore.org/any.json + +env_files = [] +root = "." +testdata_dir = "testdata" +tmp_dir = "tmp" + +[build] + args_bin = [] + bin = "./tmp/main" + cmd = "go build -o ./tmp/main ." + delay = 1000 + entrypoint = ["./tmp/main"] + exclude_dir = ["assets", "tmp", "vendor", "testdata"] + exclude_file = [] + exclude_regex = ["_test.go"] + exclude_unchanged = false + follow_symlink = false + full_bin = "" + ignore_dangerous_root_dir = false + include_dir = [] + include_ext = ["go", "tpl", "tmpl", "html"] + include_file = [] + kill_delay = "0s" + log = "build-errors.log" + poll = false + poll_interval = 0 + post_cmd = [] + pre_cmd = [] + rerun = false + rerun_delay = 500 + send_interrupt = false + stop_on_error = false + +[color] + app = "" + build = "yellow" + main = "magenta" + runner = "green" + watcher = "cyan" + +[log] + main_only = false + silent = false + time = false + +[misc] + clean_on_exit = false + +[proxy] + app_port = 0 + app_start_timeout = 0 + enabled = false + proxy_port = 0 + +[screen] + clear_on_rebuild = false + keep_scroll = true diff --git a/.env b/.env new file mode 100644 index 0000000..1354117 --- /dev/null +++ b/.env @@ -0,0 +1,32 @@ +### Db Configuration +DB_URL="goares:gg7678290@tcp(10.80.80.70:3306)/goares?charset=utf8mb4&parseTime=True&loc=Local&timeout=10s&readTimeout=30s&writeTimeout=30s&multiStatements=true" +DB_URL_PG=host=10.80.80.70 user=cloud password=gg7678290 dbname=goares port=5432 sslmode=disable TimeZone=Europe/Istanbul +########################## +# Redis Configuration +REDIS_HOST=10.80.80.70 +REDIS_PORT=6379 +REDIS_USER=default +REDIS_PASSWORD=gg7678290 +REDIS_URL=redis://default:gg7678290@10.80.80.70:6379/4 +############################# +# JWT Secret +JWT_SECRET=ares-fiber-CT286MautyK9TWfz8SPSIWJTXV83mwLRwriLvSbpcMZuDLxywaHWP9Ju7xRoTS2 +############################# +# Email Settings (Mailpit) +EMAIL_HOST=10.80.80.70 +EMAIL_PORT=1025 +EMAIL_HOST_USER="" +EMAIL_HOST_PASSWORD="" +EMAIL_USE_TLS=false +EMAIL_USE_SSL=false +EMAIL_FROM=noreply@gauth.local +############################# +# App Genel Ayarları +PORT=8080 +################################ +CORS_DEBUG=true +VITE_API_BASE_URL=http://localhost:8080 +FRONTEND_URL=http://localhost:3000 +SESSION_SECRET=go-fiber-mTFY2jAOMWWxadVIWjRoPG9aOM3z9srCVoU35Gs1VZaRKgXet26cztUE8LLpwok9 +CLOUD_FLARE_SITE_KEY='0x4AAAAAACHzHKvlEwMamxCM' +CLOUD_FLARE_SECRET='0x4AAAAAACHzHHisTSFzGw15HvwXF3yXRIg' \ No newline at end of file diff --git a/.env.copy b/.env.copy new file mode 100644 index 0000000..9287cf1 --- /dev/null +++ b/.env.copy @@ -0,0 +1,31 @@ +### Db Configuration +DB_URL="goares:gg7678290@tcp(10.80.80.70:3306)/goares?charset=utf8mb4&parseTime=True&loc=Local&timeout=10s&readTimeout=30s&writeTimeout=30s&multiStatements=true" +########################## +# Redis Configuration +REDIS_HOST=10.80.80.70 +REDIS_PORT=6379 +REDIS_USER=default +REDIS_PASSWORD=gg7678290 +REDIS_URL=redis://default:gg7678290@10.80.80.70:6379/4 +############################# +# JWT Secret +JWT_SECRET=ares-fiber-CT286MautyK9TWfz8SPSIWJTXV83mwLRwriLvSbpcMZuDLxywaHWP9Ju7xRoTS2 +############################# +# Email Settings (Mailpit) +EMAIL_HOST=10.80.80.70 +EMAIL_PORT=1025 +EMAIL_HOST_USER="" +EMAIL_HOST_PASSWORD="" +EMAIL_USE_TLS=false +EMAIL_USE_SSL=false +EMAIL_FROM=noreply@gauth.local +############################# +# App Genel Ayarları +PORT=8080 +################################ +CORS_DEBUG=true +VITE_API_BASE_URL=http://localhost:8080 +FRONTEND_URL=http://localhost:3000 +SESSION_SECRET=go-fiber-mTFY2jAOMWWxadVIWjRoPG9aOM3z9srCVoU35Gs1VZaRKgXet26cztUE8LLpwok9 +CLOUD_FLARE_SITE_KEY='0x4AAAAAACHzHKvlEwMamxCM' +CLOUD_FLARE_SECRET='0x4AAAAAACHzHHisTSFzGw15HvwXF3yXRIg' \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9e95689 --- /dev/null +++ b/.gitignore @@ -0,0 +1,29 @@ +### Go template +# If you prefer the allow list template instead of the deny list, see community template: +# https://github.com/github/gitignore/blob/main/community/Golang/Go.AllowList.gitignore +# +# Binaries for programs and plugins +*.exe +*.exe~ +*.dll +*.so +*.dylib + +# Test binary, built with `go test -c` +*.test + +# Output of the go coverage tool, specifically when used with LiteIDE +*.out + +# Dependency directories (remove the comment below to include it) +# vendor/ + +# Go workspace file +go.work +go.work.sum + +tmp +ares +main +.DS_Store +.idea diff --git a/Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXV b/Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXV new file mode 100644 index 0000000..59db2db --- /dev/null +++ b/Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXV @@ -0,0 +1,9 @@ +Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjo2LCJlbWFpbCI6ImJleWhhbkBiZXloYW4uZGV2IiwiaXNfYWRtaW4iOnRydWUsImZpcnN0X25hbWUiOiJCZXloYW4iLCJsYXN0X25hbWUiOiJPxJ91ciIsInRva2VuX3R5cGUiOiJhY2Nlc3MiLCJzdWIiOiI2IiwiZXhwIjoxNzcxNzAyMTU2LCJpYXQiOjE3NzE2OTQ5NTZ9.QHid2xqKsdwe1E-vkrZLA7nB_qL3DEcEWztbkFoOaZU + + + + +a1a4e309bb7b1ea86c5c046a22a5d5e4f7ec727a + + +81f4318fe76b595c582aa9f2baf26818894303d0 \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..86ae74f --- /dev/null +++ b/Dockerfile @@ -0,0 +1,71 @@ +# Builder: use Debian-based Go image so we can install libvips with AVIF support +FROM golang:1.25.7-bookworm AS builder + +# Install build dependencies including libvips dev packages and AVIF/heif libs +RUN apt-get update && apt-get install -y --no-install-recommends \ + build-essential \ + pkg-config \ + gcc \ + libc6-dev \ + libvips-dev \ + libvips-tools \ + libheif-dev \ + libavif-dev \ + libjpeg-dev \ + libpng-dev \ + libwebp-dev \ + ca-certificates \ + make \ + git \ + && rm -rf /var/lib/apt/lists/* + +# Set working directory +WORKDIR /app + +# Copy go mod and sum files +COPY go.mod go.sum ./ + +# Download dependencies +RUN go mod download + +# Copy the source code +COPY . . + +# Build the application (CGO_ENABLED=1 required for bimg) +RUN CGO_ENABLED=1 GOOS=linux go build -o main . + +# --- Final Stage --- +FROM debian:bookworm-slim + +# Install runtime dependencies: libvips and supporting libs (with AVIF support) +RUN apt-get update && apt-get install -y --no-install-recommends \ + libvips \ + libheif-dev \ + libavif-dev \ + ca-certificates \ + tzdata \ + && rm -rf /var/lib/apt/lists/* + +WORKDIR /app + +# Copy the binary and assets from the builder stage +COPY --from=builder /app/main . +COPY --from=builder /app/views ./views +COPY --from=builder /app/public ./public + +# Create uploads directory +RUN mkdir -p uploads && chown -R 1000:1000 /app/uploads + +# Add entrypoint and make executable +COPY docker-entrypoint.sh /usr/local/bin/docker-entrypoint.sh +RUN chmod +x /usr/local/bin/docker-entrypoint.sh + +# Create a non-root user for running the app +RUN groupadd -g 1000 appuser && useradd -u 1000 -g appuser -s /bin/sh -m appuser + +# Expose port +EXPOSE 8080 + +ENTRYPOINT ["/usr/local/bin/docker-entrypoint.sh"] +USER appuser +CMD ["./main"] diff --git a/belgeler/admin_panel.md b/belgeler/admin_panel.md new file mode 100644 index 0000000..2dbed42 --- /dev/null +++ b/belgeler/admin_panel.md @@ -0,0 +1,96 @@ +You are an AI developer assistant. Your task is to generate a complete admin panel scaffold (HTML templates, static assets and server-side route stubs) for a Go Fiber project. Use only the following frontend libraries already available in the project dependencies: Alpine.js, Bootstrap 5, HTMX, jQuery. Do not add other frameworks. Produce code artifacts described in the "Outputs" section below. + +Constraints & requirements (önemli) +- Kullanılan frontend kütüphaneleri: Alpine.js (v3), HTMX, Bootstrap 5, jQuery — bunları proje /public üzerinden kullan. +- Tema: Koyu ve aydın (dark/light) destekli olacak. Kullanıcı temayı değiştirdiğinde tercih localStorage'da saklansın ve sayfa yenilendiğinde korunmalı. +- Layout: Sol sabit (desktop) sidebar; mobilde off-canvas veya slide-in davranışı. Üstte sticky header (navbar) — hep görünür. Ana içerik HTMX ile parçalar halinde yüklensin (partials/fragments). +- Login sayfası: Cloudflare Turnstile ile korumalı. Turnstile için sitekey ve secret key placeholder kullanılacak (örneğin: YOUR_TURNSTILE_SITEKEY, YOUR_TURNSTILE_SECRET). Login formu HTMX ile POST gönderecek, sunucu Turnstile doğrulaması yapacak. +- Accessibility: ARIA nitelikleri eklensin, klavye navigasyonu çalışsın, renk kontrastı erişilebilir seviyede olsun. +- Responsive: Desktop / tablet / mobile uyumlu olmalı. +- Minimal JS: Alpine.js ile UI state yönetimi (tema toggle, mobil sidebar), HTMX ile partial yükleme, küçük helper JS dosyası için jQuery veya vanilla kullanılabilir. Büyük bundler veya build pipeline gerektirmeyecek. +- Security: CSRF, XSS ve session güvenliği için sunucu tarafı notları verilecek (CSRF token uygulaması önerisi, Turnstile server-side doğrulama, secure cookie flags, rate limiting). +- Dosya/dizin yapısı: templates/ (HTML şablonları), public/css, public/js, public/assets. Server tarafı Go Fiber rotaları ve basit handler açıklamaları verilecek (kod değil; hangi endpoint ne döner). + +Görsel / UX istekleri +- Tema değişimi için hem simge hem metin olacak (ör. güneş/ay). Geçiş animasyonu küçük (0.2s - 0.35s). +- Sidebar: ikon + etiket, aktif öğe vurgulu, mümkünse collapse/expand (yalnızca genişlik daraltıldığında). +- Header: sol marka, ortada opsiyonel breadcrumb (isteğe bağlı), sağda tema toggle ve kullanıcı dropdown. +- İçerik alanı: kart bazlı, boşluklar (padding/margin) dengeli. +- Animasyonlar: HTMX swap sırasında fade veya slide geçişi (kısa). +- Renk paleti: net iki palet tanımı (aydın için açık nötr arka plan + mavi aksan; koyu için koyu mavi/şeftali aksan). Renkler CSS custom properties (CSS değişkenleri) ile tanımlansın. + +Girdi (input) +- ./public Alpine.js, Bootstrap, HTMX, jQuery (mevcut). +- Kullanıcı sağlayacak: Cloudflare Turnstile sitekey/secret (placeholder bırakılacak). +- Sunucu: Go Fiber (kullanıcı Fiber projesine kolayca entegre edebilsin). + +Outputs — AI'nin üretmesi gerekenler (tam liste) +1. Temel layout şablonu (templates/layout.html veya .tmpl): + - ./public/assets (Bootstrap CSS/JS, HTMX, Alpine, jQuery, Turnstile script). + - Body: sticky header, sol sidebar, main content container (#main-content) — HTMX hedefi. + - Tema yönetimi için Alpine veri nesnesi referansları (tema toggle, mobile sidebar kontrol). + - Ana layout'ta HTMX ile fragment yüklemeye uygun linkler (hx-get, hx-target="#main-content", hx-swap). + +2. Login şablonu (templates/login.html): + - Cloudflare Turnstile widget (data-sitekey placeholder). + - Form HTMX ile POST atacak (hx-post="/login", hx-target="#login-feedback" vb.). + - Başarı/hata fragment'leri için sunucu tarafı cevap formatı belirtilecek. + +3. Örnek HTMX fragment'leri (templates/fragments/*): + - dashboard fragment + - users list fragment + - settings fragment + (her fragment minimal içerik, HTMX swap ile çalışacak biçimde) + +4. public/js/main.js (küçük açıklama, içerik oluşturulacak): + - Alpine tema manager yapısı (isDark reactive, save/load localStorage, toggle fonksiyonları). + - Mobile sidebar toggle fonksiyonları. + - HTMX üzerinden fragment yüklenirken küçük loading indicator veya class ekleme. + - Turnstile ile integration notu (widget render ve token gönderimi; token'ın login formu ile nasıl dahil olacağı). + +5. public/css/theme.css: + - CSS custom properties hem light hem dark için. + - Sidebar, header, card stilleri, responsive medya sorguları. + - Küçük animasyonlar (fade, transition). + +6. Sunucu tarafı: Go Fiber rotaları listesi ve davranış açıklamaları (kod değil, endpoint + beklenen request/response): + - GET /login -> login şablonunu döndür + - POST /login -> Turnstile token doğrulaması + credentials doğrulama; başarılıysa session cookie oluştur ve /admin yönlendir (HTMX için fragment veya redirect) + - GET /admin -> layout render (veya layout + default fragment) + - GET /admin/content/dashboard -> dashboard fragment (HTMX hedefi) + - GET /admin/content/users -> users fragment + - GET /admin/content/settings -> settings fragment + - GET /logout -> oturumu sonlandır + - admin middleware ye agit tum rotalar + - (Opsiyonel) POST /api/users/* gibi API uç noktaları (JSON) — HTMX yerine AJAX gerekeceğinde kullanılacak + +7. Güvenlik & operasyonel notlar (dokümantasyon/metin): + - Turnstile: server-side doğrulama nasıl yapılır (istek: secret ve token ile Cloudflare API endpoint çağrısı; doğrulama şartı). + - CSRF: HTMX formlarında CSRF token nasıl geçilir (hidden input veya header); Fiber için örnek header adı ve cookie ilişkisi (kod değil açıklama). + - Session yönetimi: secure, httpOnly, SameSite=strict/ Lax önerisi. + - Rate limiting önerisi (ör. login için). + - Input validation and output escaping reminder. + +8. Acceptance criteria / test senaryoları: + - Tema toggle yapıldığında localStorage güncellenmeli ve sayfa yenilendiğinde tercih korunmalı. + - Sidebar linkine tıklandığında HTMX ile fragment yüklensin, header sabit kalsın. + - Mobilde sidebar toggle düzgün çalışsın ve overlay kapanışı sağlansın. + - Login formu Turnstile widget üretiyor; form gönderildiğinde Sunucu Turnstile token'ı doğruluyor — geçerse oturum açma gerçekleşiyor, geçmezse hata mesajı. + - Erişilemeyen bir fragment istenirse HTMX hedefinde uygun hata gösterimi (alert/flash) gelsin. + - Temel a11y kontrolü: tüm interaktif öğeler klavye ile erişilebilir olsun, img/ikonlar için alt metin/aria-label. + +Ek istekler / tercih edilen çıktı biçimi +- Üretilen dosyaları dosya isimleriyle ve kısa açıklamalarıyla listelerken KOD VERMEYİN — sadece hangi dosyayı ve ne içermesi gerektiğini net maddelemeyle verin (ama AI kod da üretirse ayrı bir adımda bunu isteyebilirim). +- Turnstile sitekey/secret için placeholder kullanın ve kullanıcıya nerede değiştireceğini açıkça belirtin. +- HTMX fragment response biçimi: tam HTML fragment (sadece main-content içeriği) veya JSON+HTML toggles; tercihen saf HTML fragment kullanılsın. +- Her dosya için kısa "örnek içerik açıklaması" verin (ör. dashboard fragment: 3 adet statistic card ve bir tablo). + +Çıktı teslim formatı +- Lütfen üretim çıktısını şu şekilde organize et: + - "Files to create" listesi (path + kısa açıklama) + - "Server endpoints" listesi (method + path + beklenen davranış) + - "Güvenlik & deployment notları" + - "Acceptance tests" +- Tekrar ediyorum: BU PROMPT sadece kılavuzdur — şu an yalnızca prompt dosyasını istiyorum, KOD YOK. Eğer kod oluşturmaya hazırsan, ayrı bir istekte bulunacağım. + +Not: Kullanıcı adı ve mevcut package.json bağımlılıklarını unutma: Alpine.js, Bootstrap 5, htmx, jquery. Cloudflare Turnstile sitekey/secret işaretlerini placeholder bırak. diff --git a/config/config.go b/config/config.go new file mode 100644 index 0000000..e34bf66 --- /dev/null +++ b/config/config.go @@ -0,0 +1,119 @@ +package configs + +import ( + "os" + "strconv" + "strings" + + "github.com/joho/godotenv" + "go.uber.org/zap" +) + +type Config struct { + Env string // örn. development, production + Port string + DBUrl string + DBPGUrl string + JWTSecret string + AppURL string // örn. https://api.example.com - e-posta doğrulama linkleri için kullanılır + GoogleClientID string + GoogleClientSecret string + GithubClientID string + GithubClientSecret string + GoogleRedirectURL string + GithubRedirectURL string + ClientCallbackURL string + OAuthRedirectURL string + RedisUrl string + AccessTokenExpireMinutes int + RefreshTokenExpireDays int + // E-posta Ayarları + EmailHost string + EmailPort string + EmailHostUser string + EmailHostPassword string + EmailFrom string + CorsDebug bool +} + +var AppConfig *Config + +func LoadConfig() { + err := godotenv.Load() + if err != nil { + // Eğer proje kök dizininden çalıştırılmıyorsa (örn: cmd/app içinden), üst dizinleri kontrol et + err = godotenv.Load(".env") + //err = godotenv.Load("../../.env") + } + if err != nil { + // Logger henüz hazır olmayabilir; varsa kullan + if Logger != nil { + Logger.Warn("Uyarı: .env dosyası yüklenirken hata oluştu, sistem ortam değişkenleriyle devam ediliyor", zapFieldsForEnvError(err)...) + } + } + + AppConfig = &Config{ + Env: getEnv("APP_ENV", "development"), + Port: getEnv("PORT", "8080"), + DBUrl: getEnv("DB_URL", ""), + DBPGUrl: getEnv("DB_URL_PG", ""), + JWTSecret: getEnv("JWT_SECRET", "default_secret"), + AppURL: getEnv("APP_URL", "http://localhost:8080"), + GoogleClientID: getEnv("GOOGLE_CLIENT_ID", ""), + GoogleClientSecret: getEnv("GOOGLE_CLIENT_SECRET", ""), + GithubClientID: getEnv("GITHUB_CLIENT_ID", ""), + GithubClientSecret: getEnv("GITHUB_CLIENT_SECRET", ""), + GoogleRedirectURL: getEnv("GOOGLE_REDIRECT_URL", "http://localhost:8080/api/v1/auth/google/callback"), + GithubRedirectURL: getEnv("GITHUB_REDIRECT_URL", "http://localhost:8080/api/v1/auth/github/callback"), + ClientCallbackURL: getEnv("CLIENT_CALLBACK_URL", ""), + OAuthRedirectURL: getEnv("OAUTH_REDIRECT_URL", ""), + RedisUrl: getEnv("REDIS_URL", ""), + AccessTokenExpireMinutes: getEnvAsInt("ACCESS_TOKEN_EXPIRE_MINUTES", 120), // Varsayılan 120 dakika + RefreshTokenExpireDays: getEnvAsInt("REFRESH_TOKEN_EXPIRE_DAYS", 30), // Varsayılan 30 gün + + // E-posta Varsayılanları + EmailHost: getEnv("EMAIL_HOST", "localhost"), + EmailPort: getEnv("EMAIL_PORT", "1025"), + EmailHostUser: getEnv("EMAIL_HOST_USER", ""), + EmailHostPassword: getEnv("EMAIL_HOST_PASSWORD", ""), + EmailFrom: getEnv("EMAIL_FROM", "noreply@gauth.local"), + CorsDebug: getEnvAsBool("CORS_DEBUG", false), + } +} + +func getEnv(key, fallback string) string { + if value, exists := os.LookupEnv(key); exists { + return value + } + return fallback +} + +func getEnvAsInt(key string, fallback int) int { + valueStr := getEnv(key, "") + if valueStr == "" { + return fallback + } + value, err := strconv.Atoi(valueStr) + if err != nil { + return fallback + } + return value +} + +func getEnvAsBool(key string, fallback bool) bool { + valueStr := strings.TrimSpace(getEnv(key, "")) + if valueStr == "" { + return fallback + } + value, err := strconv.ParseBool(valueStr) + if err != nil { + return fallback + } + return value +} + +func zapFieldsForEnvError(err error) []zap.Field { + return []zap.Field{ + zap.String("error", err.Error()), + } +} diff --git a/config/loger.go b/config/loger.go new file mode 100644 index 0000000..b7cd546 --- /dev/null +++ b/config/loger.go @@ -0,0 +1,39 @@ +package configs + +import ( + "os" + + "go.uber.org/zap" + "go.uber.org/zap/zapcore" +) + +var Logger *zap.Logger + +func init() { + // initialize default logger early so other packages can use it in their init functions + LogerAres() +} + +func LogerAres() { + logFile, err := os.Create("./info.log") + if err != nil { + // Fallback: sadece konsola yaz + core := zapcore.NewCore( + zapcore.NewConsoleEncoder(zap.NewDevelopmentEncoderConfig()), + zapcore.AddSync(os.Stdout), + zapcore.DebugLevel, + ) + Logger = zap.New(core, zap.AddCaller()) + Logger.Warn("info.log açılamadı, sadece konsola yazılıyor", zap.Error(err)) + return + } + // Hem dosyaya hem konsola yaz (logları görebilirsin) + encoderConfig := zap.NewProductionEncoderConfig() + encoderConfig.EncodeTime = zapcore.ISO8601TimeEncoder + encoderConfig.EncodeLevel = zapcore.CapitalLevelEncoder + encoder := zapcore.NewConsoleEncoder(encoderConfig) + multiOut := zapcore.NewMultiWriteSyncer(zapcore.AddSync(os.Stdout), zapcore.AddSync(logFile)) + core := zapcore.NewCore(encoder, multiOut, zapcore.DebugLevel) + Logger = zap.New(core, zap.AddCaller()) + Logger.Info("Logger başlatıldı (konsol + info.log)") +} diff --git a/controllers/admin_cart_controller.go b/controllers/admin_cart_controller.go new file mode 100644 index 0000000..f1eafda --- /dev/null +++ b/controllers/admin_cart_controller.go @@ -0,0 +1,52 @@ +package controllers + +import ( + dbConfig "ares/database/config" + "ares/database/models" + "strconv" + + "github.com/gofiber/fiber/v3" +) + +// AdminContentCarts handles rendering the Carts list in the admin panel +func AdminContentCarts(c fiber.Ctx) error { + var carts []models.Cart + + // Preload the User to display who owns the cart + // Preload Items to show the item count + query := dbConfig.DB.Model(&models.Cart{}).Preload("Items") + + // Filter by User ID if a search is provided (basic example, finding user by ID) + search := c.Query("search") + if search != "" { + if userID, err := strconv.Atoi(search); err == nil { + query = query.Where("user_id = ?", userID) + } + } + + query.Order("updated_at desc").Find(&carts) + + data := fiber.Map{ + "Carts": carts, + "Search": search, + } + + // Render partial if requested via HTMX + if c.Get("HX-Request") == "true" { + return c.Render("admin/partials/carts", data) + } + + // Otherwise render full layout + return c.Render("admin/partials/carts", data, "admin/layout") +} + +// AdminCartDelete handles deleting a cart (useful for clearing abandoned carts) +func AdminCartDelete(c fiber.Ctx) error { + id := c.Params("id") + + if err := dbConfig.DB.Unscoped().Where("id = ?", id).Delete(&models.Cart{}).Error; err != nil { + return c.Redirect().To("/admin/content/carts?error=Silme+başarısız") + } + + return c.Redirect().To("/admin/content/carts?deleted=true&success=Sepet+silindi") +} diff --git a/controllers/admin_controller.go b/controllers/admin_controller.go new file mode 100644 index 0000000..263c8ec --- /dev/null +++ b/controllers/admin_controller.go @@ -0,0 +1,1641 @@ +package controllers + +// NOTE: minor edit test to verify file is writable + +import ( + configs "ares/config" + dbConfig "ares/database/config" + "ares/database/models" + "ares/middlewares" + utils "ares/pkg/utis" + "ares/services" + "encoding/json" + "errors" + "fmt" + "io" + "math" + "net/http" + "strconv" + "strings" + "time" + + "gorm.io/gorm" + + "github.com/gofiber/fiber/v3" + "golang.org/x/crypto/bcrypt" +) + +// parseImagesField accepts the stored Images field which may be either a JSON +// array string like '["/uploads/..."]' or a plain string "/uploads/..." and +// returns a slice of image paths. +func parseImagesField(s string) []string { + var imgs []string + s = strings.TrimSpace(s) + if s == "" { + return imgs + } + // If it looks like a JSON array attempt to unmarshal + if strings.HasPrefix(s, "[") { + if err := json.Unmarshal([]byte(s), &imgs); err == nil { + return imgs + } + } + // Otherwise treat as a single path string (strip surrounding quotes if present) + s = strings.Trim(s, "\"") + if s != "" { + imgs = append(imgs, s) + } + return imgs +} + +// AdminLogin renders the login page +func AdminLogin(c fiber.Ctx) error { + return c.Render("admin/login", fiber.Map{}) +} + +// AdminLoginPost handles the login form submission +func AdminLoginPost(c fiber.Ctx) error { + email := c.FormValue("email") + password := c.FormValue("password") + turnstileToken := c.FormValue("cf-turnstile-response") + + // 1. Verify Turnstile Token + if turnstileToken == "" { + // return c.Status(fiber.StatusBadRequest).SendString("
Turnstile doğrulaması başarısız.
") + } + + // 2. Verify Credentials against Database (include profile) + var user models.User + if err := dbConfig.DB.Preload("Profile").Where("email = ?", email).First(&user).Error; err != nil { + return c.Status(fiber.StatusOK).SendString("
Hatalı e-posta veya şifre.
") + } + + // Check password + if err := bcrypt.CompareHashAndPassword([]byte(user.Password), []byte(password)); err != nil { + return c.Status(fiber.StatusOK).SendString("
Hatalı e-posta veya şifre.
") + } + + // Check if admin + if user.IsAdmin == nil || !*user.IsAdmin { + return c.Status(fiber.StatusOK).SendString("
Bu alana erişim yetkiniz yok.
") + } + + // Login success - generate signed JWT cookie + jwtService := services.NewJWTService() + first := "" + last := "" + if len(user.Profile) > 0 { + first = user.Profile[0].FirstName + last = user.Profile[0].LastName + } + accessToken, _, err := jwtService.GenerateTokenPair(uint(user.ID), user.Email, user.IsAdmin != nil && *user.IsAdmin, first, last) + if err != nil { + return c.Status(fiber.StatusInternalServerError).SendString("
Oturum oluşturulamadı.
") + } + + cookie := new(fiber.Cookie) + cookie.Name = "admin_session" + cookie.Value = accessToken + cookie.Expires = time.Now().Add(time.Duration(configs.AppConfig.AccessTokenExpireMinutes) * time.Minute) + cookie.Path = "/" + cookie.HTTPOnly = true + cookie.Secure = true + cookie.SameSite = "Strict" + c.Cookie(cookie) + + // Check if request is from HTMX + if c.Get("HX-Request") == "true" { + c.Set("HX-Redirect", "/admin") + return c.SendStatus(fiber.StatusOK) + } + + // Standard redirect for non-HTMX requests (fallback) + return c.Redirect().To("/admin") +} + +// AdminLogout clears the session +func AdminLogout(c fiber.Ctx) error { + c.ClearCookie("admin_session") + return c.Redirect().To("/login") +} + +// AdminDashboard renders the full layout with dashboard content +func AdminDashboard(c fiber.Ctx) error { + return c.Render("admin/partials/dashboard", fiber.Map{ + "Title": "Dashboard", + }, "admin/layout") +} + +// AdminContentDashboard renders the dashboard partial (for HTMX) or full page +func AdminContentDashboard(c fiber.Ctx) error { + if c.Get("HX-Request") == "true" { + return c.Render("admin/partials/dashboard", fiber.Map{}) + } + return c.Render("admin/partials/dashboard", fiber.Map{ + "Title": "Dashboard", + }, "admin/layout") +} + +// AdminMe returns basic info about the currently authenticated admin (name, email, avatar) +func AdminMe(c fiber.Ctx) error { + claims, ok := middlewares.GetAuthClaims(c) + if !ok { + return c.Status(fiber.StatusUnauthorized).JSON(fiber.Map{"error": "unauthorized"}) + } + + name := strings.TrimSpace(claims.FirstName + " " + claims.LastName) + if name == "" { + name = claims.Email + } + + avatar := "" + var user models.User + if err := dbConfig.DB.Preload("Profile").First(&user, claims.UserID).Error; err == nil { + if len(user.Profile) > 0 { + avatar = user.Profile[0].AvatarURL + } + } + + return c.JSON(fiber.Map{"name": name, "email": claims.Email, "avatar": avatar}) +} + +// AdminContentUsers renders the users partial with pagination and search +func AdminContentUsers(c fiber.Ctx) error { + page, _ := strconv.Atoi(c.Query("page", "1")) + limit := 10 + offset := (page - 1) * limit + search := c.Query("search", "") + showDeleted := c.Query("deleted") == "true" + + var users []models.User + var total int64 + + query := dbConfig.DB.Model(&models.User{}) + + if showDeleted { + query = query.Unscoped().Where("deleted_at IS NOT NULL") + } + + if search != "" { + query = query.Where("user_name LIKE ? OR email LIKE ?", "%"+search+"%", "%"+search+"%") + } + + query.Count(&total) + query.Limit(limit).Offset(offset).Order("created_at desc").Find(&users) + + totalPages := int(math.Ceil(float64(total) / float64(limit))) + + // Check if request is from HTMX + if c.Get("HX-Request") == "true" { + return c.Render("admin/partials/users", fiber.Map{ + "Users": users, + "Page": page, + "TotalPages": totalPages, + "NextPage": page + 1, + "PrevPage": page - 1, + "Search": search, + "ShowDeleted": showDeleted, + }) + } + + // If not HTMX (e.g. page refresh), render with layout + return c.Render("admin/partials/users", fiber.Map{ + "Users": users, + "Page": page, + "TotalPages": totalPages, + "NextPage": page + 1, + "PrevPage": page - 1, + "Search": search, + "ShowDeleted": showDeleted, + }, "admin/layout") +} + +// AdminUserNew renders the create user full page form +func AdminUserNew(c fiber.Ctx) error { + return c.Render("admin/pages/user_form", fiber.Map{ + "IsEdit": false, + }, "admin/layout") +} + +// AdminUserCreate handles user creation +func AdminUserCreate(c fiber.Ctx) error { + username := c.FormValue("username") + email := c.FormValue("email") + password := c.FormValue("password") + isAdmin := c.FormValue("is_admin") == "on" + emailVerified := c.FormValue("email_verified") == "on" + + // Basic validation + if username == "" || email == "" || password == "" { + return c.Status(fiber.StatusBadRequest).SendString("
Lütfen tüm alanları doldurun.
") + } + + // Hash password + hashedPassword, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost) + if err != nil { + return c.Status(fiber.StatusInternalServerError).SendString("
Şifre oluşturulurken hata.
") + } + + user := models.User{ + UserName: username, + Email: email, + Password: string(hashedPassword), + IsAdmin: &isAdmin, + EmailVerified: &emailVerified, + } + + if err := dbConfig.DB.Create(&user).Error; err != nil { + return c.Status(fiber.StatusInternalServerError).SendString("
Kullanıcı oluşturulurken hata: " + err.Error() + "
") + } + + // If profile fields or avatar provided, process and create profile + firstName := c.FormValue("first_name") + lastName := c.FormValue("last_name") + avatarPath := "" + if p, err := services.ProcessAndSaveImage(c, "avatar", services.ImageOptions{ + Width: 150, + Height: 150, + Quality: 85, + Format: "avif", + Folder: "avatars", + }); err == nil { + avatarPath = p + } + + if firstName != "" || lastName != "" || avatarPath != "" { + profile := models.Profile{UserID: uint64(user.ID)} + if firstName != "" { + profile.FirstName = firstName + } + if lastName != "" { + profile.LastName = lastName + } + if avatarPath != "" { + profile.AvatarURL = avatarPath + } + dbConfig.DB.Create(&profile) + } + + return c.Redirect().To("/admin/content/users?success=Kullanıcı+başarıyla+oluşturuldu") +} + +// AdminUserEdit renders the edit user full page form +func AdminUserEdit(c fiber.Ctx) error { + id := c.Params("id") + var user models.User + if err := dbConfig.DB.Preload("Profile").First(&user, id).Error; err != nil { + return c.Status(fiber.StatusNotFound).SendString("Kullanıcı bulunamadı") + } + + return c.Render("admin/pages/user_form", fiber.Map{ + "IsEdit": true, + "User": user, + }, "admin/layout") +} + +// AdminUserUpdate handles user update +func AdminUserUpdate(c fiber.Ctx) error { + id := c.Params("id") + var user models.User + if err := dbConfig.DB.Preload("Profile").First(&user, id).Error; err != nil { + return c.Status(fiber.StatusNotFound).SendString("Kullanıcı bulunamadı") + } + + user.UserName = c.FormValue("username") + user.Email = c.FormValue("email") + + isAdmin := c.FormValue("is_admin") == "on" + user.IsAdmin = &isAdmin + + emailVerified := c.FormValue("email_verified") == "on" + user.EmailVerified = &emailVerified + + // Update password only if provided + newPassword := c.FormValue("password") + if newPassword != "" { + hashedPassword, err := bcrypt.GenerateFromPassword([]byte(newPassword), bcrypt.DefaultCost) + if err != nil { + return c.Status(fiber.StatusInternalServerError).SendString("
Şifre güncellenirken hata.
") + } + user.Password = string(hashedPassword) + } + + if err := dbConfig.DB.Save(&user).Error; err != nil { + return c.Status(fiber.StatusInternalServerError).SendString("
Güncelleme hatası: " + err.Error() + "
") + } + + // Handle profile fields and avatar upload + firstName := c.FormValue("first_name") + lastName := c.FormValue("last_name") + + // Avatar file handling via image service (150x150, AVIF) + avatarPath := "" + if p, err := services.ProcessAndSaveImage(c, "avatar", services.ImageOptions{ + Width: 150, + Height: 150, + Quality: 85, + Format: "avif", + Folder: "avatars", + }); err == nil { + avatarPath = p + } + + // Update or create profile + if len(user.Profile) > 0 { + profile := user.Profile[0] + if firstName != "" { + profile.FirstName = firstName + } + if lastName != "" { + profile.LastName = lastName + } + if avatarPath != "" { + profile.AvatarURL = avatarPath + } + if err := dbConfig.DB.Model(&profile).Updates(profile).Error; err != nil { + // continue but log error + } + } else { + // create + newProfile := models.Profile{UserID: uint64(user.ID)} + if firstName != "" { + newProfile.FirstName = firstName + } + if lastName != "" { + newProfile.LastName = lastName + } + if avatarPath != "" { + newProfile.AvatarURL = avatarPath + } + if err := dbConfig.DB.Create(&newProfile).Error; err != nil { + // continue + } + } + + return c.Redirect().To("/admin/content/users?success=Kullanıcı+başarıyla+güncellendi") +} + +// AdminUserDelete handles user soft delete +func AdminUserDelete(c fiber.Ctx) error { + id := c.Params("id") + if err := dbConfig.DB.Delete(&models.User{}, id).Error; err != nil { + return c.Status(fiber.StatusInternalServerError).SendString("Silme hatası") + } + + // Return updated list or trigger + return c.Redirect().To("/admin/content/users?success=Kullanıcı+silindi") +} + +// AdminUserRestore restores a soft-deleted user +func AdminUserRestore(c fiber.Ctx) error { + id := c.Params("id") + if err := dbConfig.DB.Unscoped().Model(&models.User{}).Where("id = ?", id).Update("deleted_at", nil).Error; err != nil { + return c.Status(fiber.StatusInternalServerError).SendString("Geri yükleme hatası") + } + + return c.Redirect().To("/admin/content/users?deleted=true&success=Kullanıcı+geri+yüklendi") +} + +// AdminContentSettings renders the settings partial with General Settings and Hero list +func AdminContentSettings(c fiber.Ctx) error { + // 1. Fetch General Settings + var setting models.Setting + if err := dbConfig.DB.First(&setting).Error; err != nil { + // If not found, create default? Or just empty. + // For now, empty is fine, UI should handle it. + } + + // 2. Fetch Heroes + var heroes []models.Hero + showDeleted := c.Query("deleted") == "true" + query := dbConfig.DB.Model(&models.Hero{}) + + if showDeleted { + query = query.Unscoped().Where("deleted_at IS NOT NULL") + } + + query.Order("created_at desc").Find(&heroes) + + // 3. Fetch CORS lists and rate limits + var corsWhitelist []models.CorsWhitelist + var corsBlacklist []models.CorsBlacklist + var rateLimits []models.RateLimitSetting + + // Respect showDeleted flag for soft-deleted items + if showDeleted { + dbConfig.DB.Unscoped().Where("deleted_at IS NOT NULL").Order("created_at desc").Find(&corsWhitelist) + dbConfig.DB.Unscoped().Where("deleted_at IS NOT NULL").Order("created_at desc").Find(&corsBlacklist) + dbConfig.DB.Unscoped().Where("deleted_at IS NOT NULL").Order("created_at desc").Find(&rateLimits) + } else { + dbConfig.DB.Order("created_at desc").Find(&corsWhitelist) + dbConfig.DB.Order("created_at desc").Find(&corsBlacklist) + dbConfig.DB.Order("created_at desc").Find(&rateLimits) + } + + // Check if we're editing an existing entry (via query params) + editWhitelistID := c.Query("edit_whitelist", "") + var editWhitelist models.CorsWhitelist + if editWhitelistID != "" { + if err := dbConfig.DB.First(&editWhitelist, editWhitelistID).Error; err == nil { + // found, will pass to template + } + } + + editBlacklistID := c.Query("edit_blacklist", "") + var editBlacklist models.CorsBlacklist + if editBlacklistID != "" { + if err := dbConfig.DB.First(&editBlacklist, editBlacklistID).Error; err == nil { + } + } + + editRateLimitID := c.Query("edit_ratelimit", "") + var editRateLimit models.RateLimitSetting + if editRateLimitID != "" { + if err := dbConfig.DB.First(&editRateLimit, editRateLimitID).Error; err == nil { + } + } + + data := fiber.Map{ + "Setting": setting, + "Heroes": heroes, + "ShowDeleted": showDeleted, + "CorsWhitelist": corsWhitelist, + "CorsBlacklist": corsBlacklist, + "RateLimits": rateLimits, + "EditWhitelist": editWhitelist, + "EditBlacklist": editBlacklist, + "EditRateLimit": editRateLimit, + } + + if c.Get("HX-Request") == "true" { + return c.Render("admin/partials/settings", data) + } + return c.Render("admin/partials/settings", data, "admin/layout") +} + +// AdminSettingsPost handles the settings form submission +func AdminSettingsPost(c fiber.Ctx) error { + var setting models.Setting + // Fetch existing or create new + if err := dbConfig.DB.First(&setting).Error; err != nil { + // Create new if doesn't exist + setting = models.Setting{} + } + + // Parse form + if err := c.Bind().Body(&setting); err != nil { + return c.Status(fiber.StatusBadRequest).SendString("
Form verileri okunamadı.
") + } + + // Handle checkboxes (boolean) manually if needed + isActive := c.FormValue("is_active") == "on" + setting.IsActive = isActive + + // Handle Image Uploads for Settings + // 1. White Logo (w_logo) + wWidth, _ := strconv.Atoi(c.FormValue("w_width")) + wHeight, _ := strconv.Atoi(c.FormValue("w_height")) + wQuality, _ := strconv.Atoi(c.FormValue("w_quality")) + wFormat := c.FormValue("w_format") + + wLogoPath, err := services.ProcessAndSaveImage(c, "w_logo", services.ImageOptions{ + Width: wWidth, + Height: wHeight, + Quality: wQuality, + Format: wFormat, + Folder: "settings", + }) + if err == nil && wLogoPath != "" { + setting.WLogo = wLogoPath + } + + // 2. Black Logo (b_logo) + bWidth, _ := strconv.Atoi(c.FormValue("b_width")) + bHeight, _ := strconv.Atoi(c.FormValue("b_height")) + bQuality, _ := strconv.Atoi(c.FormValue("b_quality")) + bFormat := c.FormValue("b_format") + + bLogoPath, err := services.ProcessAndSaveImage(c, "b_logo", services.ImageOptions{ + Width: bWidth, + Height: bHeight, + Quality: bQuality, + Format: bFormat, + Folder: "settings", + }) + if err == nil && bLogoPath != "" { + setting.BLogo = bLogoPath + } + + if err := dbConfig.DB.Save(&setting).Error; err != nil { + return c.Status(fiber.StatusInternalServerError).SendString("
Ayarlar kaydedilirken hata oluştu.
") + } + + return c.Redirect().To("/admin/content/settings?success=Ayarlar+kaydedildi") +} + +// AdminCorsWhitelistCreate handles creating a new CORS whitelist entry +func AdminCorsWhitelistCreate(c fiber.Ctx) error { + origin := c.FormValue("origin") + description := c.FormValue("description") + isActive := c.FormValue("is_active") == "on" + + if origin == "" { + return c.Redirect().To("/admin/content/settings?error=Origin+gerekiyor") + } + + entry := models.CorsWhitelist{ + Origin: origin, + Description: description, + IsActive: isActive, + } + if err := dbConfig.DB.Create(&entry).Error; err != nil { + return c.Redirect().To("/admin/content/settings?error=Oluşturma+başarısız") + } + return c.Redirect().To("/admin/content/settings?success=Whitelist+eklendi") +} + +// AdminCorsWhitelistDelete soft-deletes a whitelist entry +func AdminCorsWhitelistDelete(c fiber.Ctx) error { + id := c.Params("id") + if err := dbConfig.DB.Delete(&models.CorsWhitelist{}, id).Error; err != nil { + return c.Redirect().To("/admin/content/settings?error=Silme+başarısız") + } + return c.Redirect().To("/admin/content/settings?success=Whitelist+silindi") +} + +// AdminCorsBlacklistCreate handles creating a new CORS blacklist entry +func AdminCorsBlacklistCreate(c fiber.Ctx) error { + origin := c.FormValue("origin") + reason := c.FormValue("reason") + isActive := c.FormValue("is_active") == "on" + + if origin == "" { + return c.Redirect().To("/admin/content/settings?error=Origin+gerekiyor") + } + + entry := models.CorsBlacklist{ + Origin: origin, + Reason: reason, + IsActive: isActive, + } + if err := dbConfig.DB.Create(&entry).Error; err != nil { + return c.Redirect().To("/admin/content/settings?error=Oluşturma+başarısız") + } + return c.Redirect().To("/admin/content/settings?success=Blacklist+eklendi") +} + +// AdminCorsBlacklistDelete soft-deletes a blacklist entry +func AdminCorsBlacklistDelete(c fiber.Ctx) error { + id := c.Params("id") + if err := dbConfig.DB.Delete(&models.CorsBlacklist{}, id).Error; err != nil { + return c.Redirect().To("/admin/content/settings?error=Silme+başarısız") + } + return c.Redirect().To("/admin/content/settings?success=Blacklist+silindi") +} + +// AdminRateLimitCreate creates a rate limit setting +func AdminRateLimitCreate(c fiber.Ctx) error { + name := c.FormValue("name") + description := c.FormValue("description") + maxReq := c.FormValue("max_requests") + window := c.FormValue("window_seconds") + isActive := c.FormValue("is_active") == "on" + + if name == "" || maxReq == "" || window == "" { + return c.Redirect().To("/admin/content/settings?error=Eksik+alan") + } + maxI, _ := strconv.ParseInt(maxReq, 10, 64) + winI, _ := strconv.Atoi(window) + + rl := models.RateLimitSetting{ + Name: name, + Description: description, + MaxRequests: maxI, + WindowSeconds: winI, + IsActive: isActive, + } + if err := dbConfig.DB.Create(&rl).Error; err != nil { + return c.Redirect().To("/admin/content/settings?error=Oluşturma+başarısız") + } + return c.Redirect().To("/admin/content/settings?success=Rate+limit+eklendi") +} + +// AdminRateLimitDelete deletes a rate limit setting +func AdminRateLimitDelete(c fiber.Ctx) error { + id := c.Params("id") + if err := dbConfig.DB.Delete(&models.RateLimitSetting{}, id).Error; err != nil { + return c.Redirect().To("/admin/content/settings?error=Silme+başarısız") + } + return c.Redirect().To("/admin/content/settings?success=Rate+limit+silindi") +} + +// AdminCorsWhitelistRestore restores a soft-deleted whitelist entry +func AdminCorsWhitelistRestore(c fiber.Ctx) error { + id := c.Params("id") + if err := dbConfig.DB.Unscoped().Model(&models.CorsWhitelist{}).Where("id = ?", id).Update("deleted_at", nil).Error; err != nil { + return c.Redirect().To("/admin/content/settings?error=Geri+yükleme+başarısız") + } + return c.Redirect().To("/admin/content/settings?success=Whitelist+geri+yüklendi") +} + +// AdminCorsBlacklistRestore restores a soft-deleted blacklist entry +func AdminCorsBlacklistRestore(c fiber.Ctx) error { + id := c.Params("id") + if err := dbConfig.DB.Unscoped().Model(&models.CorsBlacklist{}).Where("id = ?", id).Update("deleted_at", nil).Error; err != nil { + return c.Redirect().To("/admin/content/settings?error=Geri+yükleme+başarısız") + } + return c.Redirect().To("/admin/content/settings?success=Blacklist+geri+yüklendi") +} + +// AdminRateLimitRestore restores a soft-deleted rate limit entry +func AdminRateLimitRestore(c fiber.Ctx) error { + id := c.Params("id") + if err := dbConfig.DB.Unscoped().Model(&models.RateLimitSetting{}).Where("id = ?", id).Update("deleted_at", nil).Error; err != nil { + return c.Redirect().To("/admin/content/settings?error=Geri+yükleme+başarısız") + } + return c.Redirect().To("/admin/content/settings?success=Rate+limit+geri+yüklendi") +} + +// AdminCorsWhitelistUpdate updates an existing whitelist entry +func AdminCorsWhitelistUpdate(c fiber.Ctx) error { + id := c.Params("id") + var entry models.CorsWhitelist + if err := dbConfig.DB.First(&entry, id).Error; err != nil { + return c.Redirect().To("/admin/content/settings?error=Whitelist+bulunamadı") + } + + entry.Origin = c.FormValue("origin") + entry.Description = c.FormValue("description") + entry.IsActive = c.FormValue("is_active") == "on" + + if err := dbConfig.DB.Save(&entry).Error; err != nil { + return c.Redirect().To("/admin/content/settings?error=Güncelleme+başarısız") + } + return c.Redirect().To("/admin/content/settings?success=Whitelist+güncellendi") +} + +// AdminCorsBlacklistUpdate updates an existing blacklist entry +func AdminCorsBlacklistUpdate(c fiber.Ctx) error { + id := c.Params("id") + var entry models.CorsBlacklist + if err := dbConfig.DB.First(&entry, id).Error; err != nil { + return c.Redirect().To("/admin/content/settings?error=Blacklist+bulunamadı") + } + + entry.Origin = c.FormValue("origin") + entry.Reason = c.FormValue("reason") + entry.IsActive = c.FormValue("is_active") == "on" + + if err := dbConfig.DB.Save(&entry).Error; err != nil { + return c.Redirect().To("/admin/content/settings?error=Güncelleme+başarısız") + } + return c.Redirect().To("/admin/content/settings?success=Blacklist+güncellendi") +} + +// AdminRateLimitUpdate updates an existing rate limit entry +func AdminRateLimitUpdate(c fiber.Ctx) error { + id := c.Params("id") + var rl models.RateLimitSetting + if err := dbConfig.DB.First(&rl, id).Error; err != nil { + return c.Redirect().To("/admin/content/settings?error=Rate+limit+bulunamadı") + } + + rl.Name = c.FormValue("name") + rl.Description = c.FormValue("description") + maxReq, _ := strconv.ParseInt(c.FormValue("max_requests"), 10, 64) + win, _ := strconv.Atoi(c.FormValue("window_seconds")) + rl.MaxRequests = maxReq + rl.WindowSeconds = win + rl.IsActive = c.FormValue("is_active") == "on" + + if err := dbConfig.DB.Save(&rl).Error; err != nil { + return c.Redirect().To("/admin/content/settings?error=Güncelleme+başarısız") + } + return c.Redirect().To("/admin/content/settings?success=Rate+limit+güncellendi") +} + +// --- Hero Management --- + +// AdminHeroNew renders the create hero form +func AdminHeroNew(c fiber.Ctx) error { + return c.Render("admin/pages/hero_form", fiber.Map{ + "IsEdit": false, + }, "admin/layout") +} + +// AdminHeroCreate handles hero creation +func AdminHeroCreate(c fiber.Ctx) error { + hero := new(models.Hero) + if err := c.Bind().Body(hero); err != nil { + return c.Status(fiber.StatusBadRequest).SendString("Geçersiz veri") + } + + // Checkbox handling + isActive := c.FormValue("is_active") == "on" + hero.IsActive = isActive + + // Image Upload + width, _ := strconv.Atoi(c.FormValue("width")) + height, _ := strconv.Atoi(c.FormValue("height")) + quality, _ := strconv.Atoi(c.FormValue("quality")) + format := c.FormValue("format") + + imagePath, err := services.ProcessAndSaveImage(c, "image", services.ImageOptions{ + Width: width, + Height: height, + Quality: quality, + Format: format, + Folder: "heroes", + }) + if err != nil { + return c.Status(fiber.StatusInternalServerError).SendString("Resim yükleme hatası: " + err.Error()) + } + // If image uploaded, set it. For create, it's usually required or optimal. + if imagePath != "" { + hero.Image = imagePath + } + + if err := dbConfig.DB.Create(hero).Error; err != nil { + return c.Status(fiber.StatusInternalServerError).SendString("Oluşturma hatası: " + err.Error()) + } + + return c.Redirect().To("/admin/content/settings?success=Banner+oluşturuldu") +} + +// AdminHeroEdit renders the edit hero form +func AdminHeroEdit(c fiber.Ctx) error { + id := c.Params("id") + var hero models.Hero + if err := dbConfig.DB.First(&hero, id).Error; err != nil { + return c.Status(fiber.StatusNotFound).SendString("Banner bulunamadı") + } + + return c.Render("admin/pages/hero_form", fiber.Map{ + "IsEdit": true, + "Hero": hero, + }, "admin/layout") +} + +// AdminHeroUpdate handles hero update +func AdminHeroUpdate(c fiber.Ctx) error { + id := c.Params("id") + var hero models.Hero + if err := dbConfig.DB.First(&hero, id).Error; err != nil { + return c.Status(fiber.StatusNotFound).SendString("Banner bulunamadı") + } + + if err := c.Bind().Body(&hero); err != nil { + return c.Status(fiber.StatusBadRequest).SendString("Geçersiz veri") + } + + // Checkbox handling + isActive := c.FormValue("is_active") == "on" + hero.IsActive = isActive + + // Image Upload (Update if new file provided) + width, _ := strconv.Atoi(c.FormValue("width")) + height, _ := strconv.Atoi(c.FormValue("height")) + quality, _ := strconv.Atoi(c.FormValue("quality")) + format := c.FormValue("format") + + imagePath, err := services.ProcessAndSaveImage(c, "image", services.ImageOptions{ + Width: width, + Height: height, + Quality: quality, + Format: format, + Folder: "heroes", + }) + if err == nil && imagePath != "" { + hero.Image = imagePath + } + + if err := dbConfig.DB.Save(&hero).Error; err != nil { + return c.Status(fiber.StatusInternalServerError).SendString("Güncelleme hatası") + } + + return c.Redirect().To("/admin/content/settings?success=Banner+güncellendi") +} + +// AdminHeroDelete handles hero soft delete +func AdminHeroDelete(c fiber.Ctx) error { + id := c.Params("id") + if err := dbConfig.DB.Delete(&models.Hero{}, id).Error; err != nil { + return c.Status(fiber.StatusInternalServerError).SendString("Silme hatası") + } + return c.Redirect().To("/admin/content/settings?success=Banner+silindi") +} + +// AdminHeroRestore restores a soft-deleted hero +func AdminHeroRestore(c fiber.Ctx) error { + id := c.Params("id") + if err := dbConfig.DB.Unscoped().Model(&models.Hero{}).Where("id = ?", id).Update("deleted_at", nil).Error; err != nil { + return c.Status(fiber.StatusInternalServerError).SendString("Geri yükleme hatası") + } + return c.Redirect().To("/admin/content/settings?deleted=true&success=Banner+geri+yüklendi") +} + +// --- Category (Blog) Management for Admin --- + +// AdminContentCategories renders category list (HTMX-aware) +func AdminContentCategories(c fiber.Ctx) error { + page, _ := strconv.Atoi(c.Query("page", "1")) + limit := 20 + offset := (page - 1) * limit + search := c.Query("search", "") + showDeleted := c.Query("deleted") == "true" + + var categories []models.Category + var total int64 + + query := dbConfig.DB.Model(&models.Category{}) + if showDeleted { + query = query.Unscoped().Where("deleted_at IS NOT NULL") + } + if search != "" { + query = query.Where("title LIKE ? OR slug LIKE ?", "%"+search+"%", "%"+search+"%") + } + query.Count(&total) + // preload Parent so templates can display parent title + query.Preload("Parent").Order("created_at desc").Limit(limit).Offset(offset).Find(&categories) + + totalPages := int(math.Ceil(float64(total) / float64(limit))) + + data := fiber.Map{ + "Categories": categories, + "Page": page, + "TotalPages": totalPages, + "NextPage": page + 1, + "PrevPage": page - 1, + "Search": search, + "ShowDeleted": showDeleted, + } + + if c.Get("HX-Request") == "true" { + return c.Render("admin/partials/categories", data) + } + return c.Render("admin/partials/categories", data, "admin/layout") +} + +// AdminCategoryNew renders create form +func AdminCategoryNew(c fiber.Ctx) error { + // load possible parents + var parents []models.Category + dbConfig.DB.Order("title asc").Find(&parents) + return c.Render("admin/pages/category_form", fiber.Map{ + "IsEdit": false, + "Parents": parents, + }, "admin/layout") +} + +// AdminCategoryCreate handles creation +func AdminCategoryCreate(c fiber.Ctx) error { + cat := models.Category{} + cat.Title = c.FormValue("title") + + // Generate or sanitize slug + rawSlug := c.FormValue("slug") + if rawSlug == "" { + rawSlug = utils.Slugify(cat.Title) + } else { + rawSlug = utils.Slugify(rawSlug) + } + // ensure uniqueness + attempt := rawSlug + i := 1 + + for { + var existing models.Category + if err := dbConfig.DB.Unscoped().Where("slug = ?", attempt).First(&existing).Error; err != nil { + break + } + attempt = fmt.Sprintf("%s-%d", rawSlug, i) + i++ + } + cat.Slug = attempt + + if cat.Title == "" || cat.Slug == "" { + return c.Redirect().To("/admin/content/categories?error=Başlık+ve+slug+gerekli") + } + if err := dbConfig.DB.Create(&cat).Error; err != nil { + return c.Redirect().To("/admin/content/categories?error=Oluşturma+başarısız") + } + return c.Redirect().To("/admin/content/categories?success=Kategori+eklendi") +} + +// AdminCategoryEdit renders edit form +func AdminCategoryEdit(c fiber.Ctx) error { + id := c.Params("id") + var cat models.Category + if err := dbConfig.DB.First(&cat, id).Error; err != nil { + return c.Status(fiber.StatusNotFound).SendString("Kategori bulunamadı") + } + var parents []models.Category + dbConfig.DB.Where("id != ?", cat.ID).Order("title asc").Find(&parents) + // pass parent id value for easier template comparison + var parentID uint = 0 + if cat.ParentID != nil { + parentID = *cat.ParentID + } + return c.Render("admin/pages/category_form", fiber.Map{ + "IsEdit": true, + "Category": cat, + "Parents": parents, + "ParentID": parentID, + }, "admin/layout") +} + +// AdminCategoryUpdate handles update +func AdminCategoryUpdate(c fiber.Ctx) error { + id := c.Params("id") + var cat models.Category + if err := dbConfig.DB.First(&cat, id).Error; err != nil { + return c.Redirect().To("/admin/content/categories?error=Kategori+bulunamadı") + } + cat.Title = c.FormValue("title") + // sanitize/generate slug; allow keeping unique (exclude current record) + rawSlug := c.FormValue("slug") + if rawSlug == "" { + rawSlug = utils.Slugify(cat.Title) + } else { + rawSlug = utils.Slugify(rawSlug) + } + attempt := rawSlug + i := 1 + for { + var existing models.Category + if err := dbConfig.DB.Unscoped().Where("slug = ? AND id != ?", attempt, cat.ID).First(&existing).Error; err != nil { + break + } + attempt = fmt.Sprintf("%s-%d", rawSlug, i) + i++ + } + cat.Slug = attempt + cat.Description = c.FormValue("description") + if pid := c.FormValue("parent_id"); pid != "" { + if v, err := strconv.ParseUint(pid, 10, 64); err == nil { + p := uint(v) + cat.ParentID = &p + } + } else { + cat.ParentID = nil + } + + if err := dbConfig.DB.Save(&cat).Error; err != nil { + return c.Redirect().To("/admin/content/categories?error=Güncelleme+başarısız") + } + return c.Redirect().To("/admin/content/categories?success=Kategori+güncellendi") +} + +// AdminCategoryDelete soft-delete +func AdminCategoryDelete(c fiber.Ctx) error { + id := c.Params("id") + if err := dbConfig.DB.Delete(&models.Category{}, id).Error; err != nil { + return c.Redirect().To("/admin/content/categories?error=Silme+başarısız") + } + return c.Redirect().To("/admin/content/categories?success=Kategori+silindi") +} + +// AdminCategoryRestore restores soft-deleted +func AdminCategoryRestore(c fiber.Ctx) error { + id := c.Params("id") + if err := dbConfig.DB.Unscoped().Model(&models.Category{}).Where("id = ?", id).Update("deleted_at", nil).Error; err != nil { + return c.Redirect().To("/admin/content/categories?error=Geri+yükleme+başarısız") + } + return c.Redirect().To("/admin/content/categories?deleted=true&success=Kategori+geri+yüklendi") +} + +// AdminContentCategoryViews lists category view records +func AdminContentCategoryViews(c fiber.Ctx) error { + page, _ := strconv.Atoi(c.Query("page", "1")) + limit := 20 + offset := (page - 1) * limit + search := c.Query("search", "") + showDeleted := c.Query("deleted") == "true" + + var views []models.CategoryView + var total int64 + + query := dbConfig.DB.Model(&models.CategoryView{}) + if showDeleted { + query = query.Unscoped().Where("deleted_at IS NOT NULL") + } + if search != "" { + query = query.Where("ip_address LIKE ?", "%"+search+"%") + } + query.Count(&total) + query.Order("created_at desc").Limit(limit).Offset(offset).Find(&views) + + // build map of category titles + catIDs := make([]uint, 0) + for _, v := range views { + if v.CategoryID != 0 { + catIDs = append(catIDs, v.CategoryID) + } + } + var cats []models.Category + if len(catIDs) > 0 { + dbConfig.DB.Where("id IN ?", catIDs).Find(&cats) + } + catMap := make(map[uint]string) + for _, c := range cats { + catMap[c.ID] = c.Title + } + + totalPages := int(math.Ceil(float64(total) / float64(limit))) + + data := fiber.Map{ + "Views": views, + "CatMap": catMap, + "Page": page, + "TotalPages": totalPages, + "NextPage": page + 1, + "PrevPage": page - 1, + "Search": search, + "ShowDeleted": showDeleted, + } + + if c.Get("HX-Request") == "true" { + return c.Render("admin/partials/category_views", data) + } + return c.Render("admin/partials/category_views", data, "admin/layout") +} + +// AdminCategoryViewDelete soft-delete a view record +func AdminCategoryViewDelete(c fiber.Ctx) error { + id := c.Params("id") + if err := dbConfig.DB.Delete(&models.CategoryView{}, id).Error; err != nil { + return c.Redirect().To("/admin/content/category-views?error=Silme+başarısız") + } + return c.Redirect().To("/admin/content/category-views?success=Kayıt+silindi") +} + +// AdminCategoryViewRestore restores soft-deleted view record +func AdminCategoryViewRestore(c fiber.Ctx) error { + id := c.Params("id") + if err := dbConfig.DB.Unscoped().Model(&models.CategoryView{}).Where("id = ?", id).Update("deleted_at", nil).Error; err != nil { + return c.Redirect().To("/admin/content/category-views?error=Geri+yükleme+başarısız") + } + return c.Redirect().To("/admin/content/category-views?deleted=true&success=Kayıt+geri+yüklendi") +} + +// AdminContentComments lists comments +func AdminContentComments(c fiber.Ctx) error { + page, _ := strconv.Atoi(c.Query("page", "1")) + limit := 20 + offset := (page - 1) * limit + search := c.Query("search", "") + showDeleted := c.Query("deleted") == "true" + + var comments []models.Comment + var total int64 + + query := dbConfig.DB.Model(&models.Comment{}) + if showDeleted { + query = query.Unscoped().Where("deleted_at IS NOT NULL") + } + if search != "" { + query = query.Where("body LIKE ?", "%"+search+"%") + } + query.Count(&total) + query.Order("created_at desc").Limit(limit).Offset(offset).Find(&comments) + + totalPages := int(math.Ceil(float64(total) / float64(limit))) + + data := fiber.Map{ + "Comments": comments, + "Page": page, + "TotalPages": totalPages, + "NextPage": page + 1, + "PrevPage": page - 1, + "Search": search, + "ShowDeleted": showDeleted, + } + + if c.Get("HX-Request") == "true" { + return c.Render("admin/partials/comments", data) + } + return c.Render("admin/partials/comments", data, "admin/layout") +} + +// AdminCommentEdit renders edit form for a comment +func AdminCommentEdit(c fiber.Ctx) error { + id := c.Params("id") + var comment models.Comment + if err := dbConfig.DB.First(&comment, id).Error; err != nil { + return c.Status(fiber.StatusNotFound).SendString("Yorum bulunamadı") + } + return c.Render("admin/pages/comment_form", fiber.Map{"IsEdit": true, "Comment": comment}, "admin/layout") +} + +// AdminCommentUpdate updates a comment +func AdminCommentUpdate(c fiber.Ctx) error { + id := c.Params("id") + var comment models.Comment + if err := dbConfig.DB.First(&comment, id).Error; err != nil { + return c.Redirect().To("/admin/content/comments?error=Yorum+bulunamadı") + } + comment.Body = c.FormValue("body") + if err := dbConfig.DB.Save(&comment).Error; err != nil { + return c.Redirect().To("/admin/content/comments?error=Güncelleme+başarısız") + } + return c.Redirect().To("/admin/content/comments?success=Yorum+güncellendi") +} + +// AdminCommentDelete soft-delete +func AdminCommentDelete(c fiber.Ctx) error { + id := c.Params("id") + if err := dbConfig.DB.Delete(&models.Comment{}, id).Error; err != nil { + return c.Redirect().To("/admin/content/comments?error=Silme+başarısız") + } + return c.Redirect().To("/admin/content/comments?success=Yorum+silindi") +} + +// AdminCommentRestore restores a soft-deleted comment +func AdminCommentRestore(c fiber.Ctx) error { + id := c.Params("id") + if err := dbConfig.DB.Unscoped().Model(&models.Comment{}).Where("id = ?", id).Update("deleted_at", nil).Error; err != nil { + return c.Redirect().To("/admin/content/comments?error=Geri+yükleme+başarısız") + } + return c.Redirect().To("/admin/content/comments?deleted=true&success=Yorum+geri+yüklendi") +} + +// --- Tag Management (Admin) --- + +// AdminContentTags renders tag list (HTMX-aware) +func AdminContentTags(c fiber.Ctx) error { + page, _ := strconv.Atoi(c.Query("page", "1")) + limit := 20 + offset := (page - 1) * limit + search := c.Query("search", "") + showDeleted := c.Query("deleted") == "true" + + var tags []models.Tag + var total int64 + + query := dbConfig.DB.Model(&models.Tag{}) + if showDeleted { + query = query.Unscoped().Where("deleted_at IS NOT NULL") + } + if search != "" { + query = query.Where("name LIKE ?", "%"+search+"%") + } + query.Count(&total) + query.Order("created_at desc").Limit(limit).Offset(offset).Find(&tags) + + totalPages := int(math.Ceil(float64(total) / float64(limit))) + + data := fiber.Map{ + "Tags": tags, + "Page": page, + "TotalPages": totalPages, + "NextPage": page + 1, + "PrevPage": page - 1, + "Search": search, + "ShowDeleted": showDeleted, + } + + if c.Get("HX-Request") == "true" { + return c.Render("admin/partials/tags", data) + } + return c.Render("admin/partials/tags", data, "admin/layout") +} + +// AdminTagNew renders create form +func AdminTagNew(c fiber.Ctx) error { + return c.Render("admin/pages/tag_form", fiber.Map{"IsEdit": false}, "admin/layout") +} + +// AdminTagCreate handles tag creation +func AdminTagCreate(c fiber.Ctx) error { + name := c.FormValue("name") + if name == "" { + return c.Redirect().To("/admin/content/tags?error=İsim+gerekli") + } + tag := models.Tag{Name: name} + if err := dbConfig.DB.Create(&tag).Error; err != nil { + return c.Redirect().To("/admin/content/tags?error=Oluşturma+başarısız") + } + return c.Redirect().To("/admin/content/tags?success=Tag+eklendi") +} + +// AdminTagEdit renders edit form +func AdminTagEdit(c fiber.Ctx) error { + id := c.Params("id") + var tag models.Tag + if err := dbConfig.DB.First(&tag, id).Error; err != nil { + return c.Status(fiber.StatusNotFound).SendString("Tag bulunamadı") + } + return c.Render("admin/pages/tag_form", fiber.Map{"IsEdit": true, "Tag": tag}, "admin/layout") +} + +// AdminTagUpdate handles update +func AdminTagUpdate(c fiber.Ctx) error { + id := c.Params("id") + var tag models.Tag + if err := dbConfig.DB.First(&tag, id).Error; err != nil { + return c.Redirect().To("/admin/content/tags?error=Tag+bulunamadı") + } + tag.Name = c.FormValue("name") + if tag.Name == "" { + return c.Redirect().To("/admin/content/tags?error=İsim+gerekli") + } + if err := dbConfig.DB.Save(&tag).Error; err != nil { + return c.Redirect().To("/admin/content/tags?error=Güncelleme+başarısız") + } + return c.Redirect().To("/admin/content/tags?success=Tag+güncellendi") +} + +// AdminTagDelete soft-delete +func AdminTagDelete(c fiber.Ctx) error { + id := c.Params("id") + if err := dbConfig.DB.Delete(&models.Tag{}, id).Error; err != nil { + return c.Redirect().To("/admin/content/tags?error=Silme+başarısız") + } + return c.Redirect().To("/admin/content/tags?success=Tag+silindi") +} + +// AdminTagRestore restores soft-deleted tag +func AdminTagRestore(c fiber.Ctx) error { + id := c.Params("id") + if err := dbConfig.DB.Unscoped().Model(&models.Tag{}).Where("id = ?", id).Update("deleted_at", nil).Error; err != nil { + return c.Redirect().To("/admin/content/tags?error=Geri+yükleme+başarısız") + } + return c.Redirect().To("/admin/content/tags?deleted=true&success=Tag+geri+yüklendi") +} + +// --- Post Management (Admin) --- + +// AdminContentPosts renders posts list (HTMX-aware) +func AdminContentPosts(c fiber.Ctx) error { + page, _ := strconv.Atoi(c.Query("page", "1")) + limit := 20 + offset := (page - 1) * limit + search := c.Query("search", "") + showDeleted := c.Query("deleted") == "true" + + var posts []models.Post + var total int64 + + query := dbConfig.DB.Model(&models.Post{}) + if showDeleted { + query = query.Unscoped().Where("deleted_at IS NOT NULL") + } + if search != "" { + query = query.Where("title LIKE ? OR slug LIKE ?", "%"+search+"%", "%"+search+"%") + } + query.Count(&total) + query.Preload("Categories").Preload("Tags").Order("created_at desc").Limit(limit).Offset(offset).Find(&posts) + + // build first-image map for templates (posts.Images is stored as JSON array string) + imageMap := make(map[uint]string) + for _, p := range posts { + if p.Images != "" { + imgs := parseImagesField(p.Images) + if len(imgs) > 0 { + imageMap[p.ID] = imgs[0] + } + } + } + + totalPages := int(math.Ceil(float64(total) / float64(limit))) + + data := fiber.Map{ + "Posts": posts, + "ImageMap": imageMap, + "Page": page, + "TotalPages": totalPages, + "NextPage": page + 1, + "PrevPage": page - 1, + "Search": search, + "ShowDeleted": showDeleted, + } + + if c.Get("HX-Request") == "true" { + return c.Render("admin/partials/posts", data) + } + return c.Render("admin/partials/posts", data, "admin/layout") +} + +// AdminPostNew renders create form +func AdminPostNew(c fiber.Ctx) error { + var cats []models.Category + var tags []models.Tag + dbConfig.DB.Order("title asc").Find(&cats) + dbConfig.DB.Order("name asc").Find(&tags) + return c.Render("admin/pages/post_form", fiber.Map{"IsEdit": false, "Categories": cats, "Tags": tags, "FirstImage": ""}, "admin/layout") +} + +// AdminFetchImage downloads a remote image URL, processes it and returns saved path. +func AdminFetchImage(c fiber.Ctx) error { + var payload struct { + Url string `json:"url"` + Width int `json:"width"` + Height int `json:"height"` + Quality int `json:"quality"` + Format string `json:"format"` + } + // Parse JSON body (use json.Unmarshal on raw body for compatibility) + if err := json.Unmarshal(c.Body(), &payload); err != nil { + return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "invalid payload"}) + } + if payload.Url == "" { + return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "url required"}) + } + + // Fetch remote image with timeout and size limit + client := &http.Client{Timeout: 10 * time.Second} + resp, err := client.Get(payload.Url) + if err != nil { + return c.Status(fiber.StatusBadGateway).JSON(fiber.Map{"error": "failed to fetch url"}) + } + defer resp.Body.Close() + if resp.StatusCode < 200 || resp.StatusCode >= 300 { + return c.Status(fiber.StatusBadGateway).JSON(fiber.Map{"error": "failed to fetch url"}) + } + ct := resp.Header.Get("Content-Type") + if ct == "" || !strings.HasPrefix(ct, "image/") { + return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "url is not an image"}) + } + // limit read to 6MB + reader := io.LimitReader(resp.Body, 6*1024*1024) + data, err := io.ReadAll(reader) + if err != nil { + return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": "could not read image"}) + } + + saved, err := services.ProcessAndSaveImageFromBytes(data, services.ImageOptions{ + Width: payload.Width, + Height: payload.Height, + Quality: payload.Quality, + Format: payload.Format, + Folder: "posts", + }) + if err != nil { + return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": "could not process image"}) + } + return c.JSON(fiber.Map{"url": saved}) +} + +// AdminPostCreate handles creation +func AdminPostCreate(c fiber.Ctx) error { + title := c.FormValue("title") + if title == "" { + return c.Redirect().To("/admin/content/posts?error=Başlık+gerekli") + } + post := models.Post{Title: title} + post.Content = c.FormValue("content") + + // Slug handling + rawSlug := c.FormValue("slug") + if rawSlug == "" { + rawSlug = utils.Slugify(post.Title) + } else { + rawSlug = utils.Slugify(rawSlug) + } + attempt := rawSlug + i := 1 + for { + var existing models.Post + err := dbConfig.DB.Unscoped().Where("slug = ?", attempt).First(&existing).Error + if err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + break + } + return c.Redirect().To("/admin/content/posts?error=DB+error") + } + attempt = fmt.Sprintf("%s-%d", rawSlug, i) + i++ + } + post.Slug = attempt + + // Categories + catIDs := c.FormValue("category_ids") + if catIDs != "" { + ids := parseIDsCSV(catIDs) + if len(ids) > 0 { + var cats []models.Category + dbConfig.DB.Find(&cats, ids) + post.Categories = cats + } + } + // Tags + tagIDs := c.FormValue("tag_ids") + if tagIDs != "" { + ids := parseIDsCSV(tagIDs) + if len(ids) > 0 { + var tags []models.Tag + dbConfig.DB.Find(&tags, ids) + post.Tags = tags + } + } + + // Image processing using service + width, _ := strconv.Atoi(c.FormValue("width")) + height, _ := strconv.Atoi(c.FormValue("height")) + quality, _ := strconv.Atoi(c.FormValue("quality")) + format := c.FormValue("format") + + imagePath, err := services.ProcessAndSaveImage(c, "image", services.ImageOptions{ + Width: width, + Height: height, + Quality: quality, + Format: format, + Folder: "posts", + }) + if err == nil && imagePath != "" { + // Ana görüntü + post.Images = imagePath + post.Width = width + post.Height = height + post.Quality = quality + if format != "" { + post.Format = format + } + + // Orta boy (400x300) + midPath, errMid := services.ProcessAndSaveImage(c, "image", services.ImageOptions{ + Width: 400, + Height: 300, + Quality: quality, + Format: format, + Folder: "posts", + }) + if errMid != nil { + return c.Redirect().To("/admin/content/posts?error=Orta+boy+resim+oluşturulamadı") + } + post.ImagesMid = midPath + + // Küçük boy (48x48) + minPath, errMin := services.ProcessAndSaveImage(c, "image", services.ImageOptions{ + Width: 48, + Height: 48, + Quality: quality, + Format: format, + Folder: "posts", + }) + if errMin != nil { + return c.Redirect().To("/admin/content/posts?error=Küçük+boy+resim+oluşturulamadı") + } + post.ImagesMin = minPath + } + + if err := dbConfig.DB.Create(&post).Error; err != nil { + return c.Redirect().To("/admin/content/posts?error=Oluşturma+başarısız") + } + return c.Redirect().To("/admin/content/posts?success=Yazı+eklendi") +} + +// AdminPostEdit renders edit form +func AdminPostEdit(c fiber.Ctx) error { + id := c.Params("id") + var post models.Post + if err := dbConfig.DB.Preload("Categories").Preload("Tags").First(&post, id).Error; err != nil { + return c.Status(fiber.StatusNotFound).SendString("Yazı bulunamadı") + } + var cats []models.Category + var tags []models.Tag + dbConfig.DB.Order("title asc").Find(&cats) + dbConfig.DB.Order("name asc").Find(&tags) + // extract first image if present (support plain string or JSON array) + firstImage := "" + if post.Images != "" { + imgs := parseImagesField(post.Images) + if len(imgs) > 0 { + firstImage = imgs[0] + } + } + return c.Render("admin/pages/post_form", fiber.Map{"IsEdit": true, "Post": post, "Categories": cats, "Tags": tags, "FirstImage": firstImage}, "admin/layout") +} + +// AdminPostUpdate handles update +func AdminPostUpdate(c fiber.Ctx) error { + id := c.Params("id") + var post models.Post + if err := dbConfig.DB.Preload("Categories").Preload("Tags").First(&post, id).Error; err != nil { + return c.Redirect().To("/admin/content/posts?error=Yazı+bulunamadı") + } + title := c.FormValue("title") + if title != "" { + post.Title = title + rawSlug := c.FormValue("slug") + if rawSlug == "" { + rawSlug = utils.Slugify(post.Title) + } else { + rawSlug = utils.Slugify(rawSlug) + } + attempt := rawSlug + i := 1 + for { + var existing models.Post + err := dbConfig.DB.Unscoped().Where("slug = ? AND id != ?", attempt, post.ID).First(&existing).Error + if err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + break + } + return c.Redirect().To("/admin/content/posts?error=DB+error") + } + attempt = fmt.Sprintf("%s-%d", rawSlug, i) + i++ + } + post.Slug = attempt + } + if content := c.FormValue("content"); content != "" { + post.Content = content + } + + // Categories + if catIDs := c.FormValue("category_ids"); catIDs != "" { + ids := parseIDsCSV(catIDs) + if len(ids) > 0 { + var cats []models.Category + dbConfig.DB.Find(&cats, ids) + if err := dbConfig.DB.Model(&post).Association("Categories").Replace(&cats); err != nil { + return c.Redirect().To("/admin/content/posts?error=Kategori+güncelleme+başarısız") + } + } + } + // Tags + if tagIDs := c.FormValue("tag_ids"); tagIDs != "" { + ids := parseIDsCSV(tagIDs) + if len(ids) > 0 { + var tags []models.Tag + dbConfig.DB.Find(&tags, ids) + if err := dbConfig.DB.Model(&post).Association("Tags").Replace(&tags); err != nil { + return c.Redirect().To("/admin/content/posts?error=Tag+güncelleme+başarısız") + } + } + } + + // Image processing + width, _ := strconv.Atoi(c.FormValue("width")) + height, _ := strconv.Atoi(c.FormValue("height")) + quality, _ := strconv.Atoi(c.FormValue("quality")) + format := c.FormValue("format") + + imagePath, err := services.ProcessAndSaveImage(c, "image", services.ImageOptions{ + Width: width, + Height: height, + Quality: quality, + Format: format, + Folder: "posts", + }) + if err == nil && imagePath != "" { + // Ana görüntü + post.Images = imagePath + post.Width = width + post.Height = height + post.Quality = quality + if format != "" { + post.Format = format + } + + // Orta boy (400x300) + midPath, errMid := services.ProcessAndSaveImage(c, "image", services.ImageOptions{ + Width: 400, + Height: 300, + Quality: quality, + Format: format, + Folder: "posts", + }) + if errMid != nil { + return c.Redirect().To("/admin/content/posts?error=Orta+boy+resim+oluşturulamadı") + } + post.ImagesMid = midPath + + // Küçük boy (48x48) + minPath, errMin := services.ProcessAndSaveImage(c, "image", services.ImageOptions{ + Width: 48, + Height: 48, + Quality: quality, + Format: format, + Folder: "posts", + }) + if errMin != nil { + return c.Redirect().To("/admin/content/posts?error=Küçük+boy+resim+oluşturulamadı") + } + post.ImagesMin = minPath + } + + if err := dbConfig.DB.Save(&post).Error; err != nil { + return c.Redirect().To("/admin/content/posts?error=Güncelleme+başarısız") + } + return c.Redirect().To("/admin/content/posts?success=Yazı+güncellendi") +} + +// AdminPostDelete soft-delete +func AdminPostDelete(c fiber.Ctx) error { + id := c.Params("id") + if err := dbConfig.DB.Delete(&models.Post{}, id).Error; err != nil { + return c.Redirect().To("/admin/content/posts?error=Silme+başarısız") + } + return c.Redirect().To("/admin/content/posts?success=Yazı+silindi") +} + +// AdminPostRestore restores soft-deleted post +func AdminPostRestore(c fiber.Ctx) error { + id := c.Params("id") + if err := dbConfig.DB.Unscoped().Model(&models.Post{}).Where("id = ?", id).Update("deleted_at", nil).Error; err != nil { + return c.Redirect().To("/admin/content/posts?error=Geri+yükleme+başarısız") + } + return c.Redirect().To("/admin/content/posts?deleted=true&success=Yazı+geri+yüklendi") +} diff --git a/controllers/admin_product_controller.go b/controllers/admin_product_controller.go new file mode 100644 index 0000000..f7f4670 --- /dev/null +++ b/controllers/admin_product_controller.go @@ -0,0 +1,619 @@ +package controllers + +import ( + dbConfig "ares/database/config" + "ares/database/models" + utils "ares/pkg/utis" + "ares/services" + "math" + "strconv" + + "github.com/gofiber/fiber/v3" +) + +// AdminContentProducts renders the products partial +func AdminContentProducts(c fiber.Ctx) error { + page, _ := strconv.Atoi(c.Query("page", "1")) + limit := 20 + offset := (page - 1) * limit + search := c.Query("search", "") + showDeleted := c.Query("deleted") == "true" + + var products []models.Product + var total int64 + + query := dbConfig.DB.Model(&models.Product{}) + if showDeleted { + query = query.Unscoped().Where("deleted_at IS NOT NULL") + } + if search != "" { + query = query.Where("title LIKE ? OR slug LIKE ?", "%"+search+"%", "%"+search+"%") + } + query.Count(&total) + query.Preload("Categories").Preload("Tags").Order("created_at desc").Limit(limit).Offset(offset).Find(&products) + + imageMap := make(map[uint]string) + for _, p := range products { + if p.Images != "" { + imgs := parseImagesField(p.Images) + if len(imgs) > 0 { + imageMap[p.ID] = imgs[0] + } + } + } + + totalPages := int(math.Ceil(float64(total) / float64(limit))) + + data := fiber.Map{ + "Products": products, + "ImageMap": imageMap, + "Page": page, + "TotalPages": totalPages, + "NextPage": page + 1, + "PrevPage": page - 1, + "Search": search, + "ShowDeleted": showDeleted, + } + + if c.Get("HX-Request") == "true" { + return c.Render("admin/partials/products", data) + } + return c.Render("admin/partials/products", data, "admin/layout") +} + +// AdminProductNew renders create form +func AdminProductNew(c fiber.Ctx) error { + var cats []models.ProductCategory + var tags []models.ProductTag + dbConfig.DB.Order("title asc").Find(&cats) + dbConfig.DB.Order("name asc").Find(&tags) + return c.Render("admin/pages/product_form", fiber.Map{"IsEdit": false, "Categories": cats, "Tags": tags, "FirstImage": ""}, "admin/layout") +} + +// AdminProductCreate handles creation +func AdminProductCreate(c fiber.Ctx) error { + title := c.FormValue("title") + if title == "" { + return c.Redirect().To("/admin/content/products?error=Başlık+gerekli") + } + product := models.Product{Title: title} + product.Content = c.FormValue("content") + + // Slug handling + rawSlug := c.FormValue("slug") + if rawSlug == "" { + rawSlug = utils.Slugify(product.Title) + } else { + rawSlug = utils.Slugify(rawSlug) + } + attempt := rawSlug + i := 1 + for { + var existing models.Product + err := dbConfig.DB.Unscoped().Where("slug = ?", attempt).First(&existing).Error + if err != nil { + break + } + attempt = rawSlug + "-" + strconv.Itoa(i) + i++ + } + product.Slug = attempt + + // Image Upload + priceStr := c.FormValue("price") + price, _ := strconv.ParseFloat(priceStr, 64) + width, _ := strconv.Atoi(c.FormValue("width")) + height, _ := strconv.Atoi(c.FormValue("height")) + quality, _ := strconv.Atoi(c.FormValue("quality")) + format := c.FormValue("format") + if format == "" { + format = "avif" + } + // DB fields + product.Price = price + product.Format = format + product.Width = width + product.Height = height + product.Quality = quality + + // Use processAndSaveImage for main product image (for simplicity we store 1 image mapped as JSON array or just single string per parseImagesField) + imagePath, err := services.ProcessAndSaveImage(c, "image", services.ImageOptions{ + Width: width, + Height: height, + Quality: quality, + Format: format, + Folder: "products", + }) + if err == nil && imagePath != "" { + // Tek resim olarak string kaydet + product.Images = imagePath + } + + if err := dbConfig.DB.Create(&product).Error; err != nil { + return c.Redirect().To("/admin/content/products?error=Oluşturma+başarısız") + } + + // Handline Relations (Categories & Tags) + form, err := c.MultipartForm() + + if err == nil && form != nil { + catIDs := form.Value["categories"] + for _, catIDStr := range catIDs { + catID, _ := strconv.Atoi(catIDStr) + if catID > 0 { + var cat models.ProductCategory + if err := dbConfig.DB.First(&cat, catID).Error; err == nil { + dbConfig.DB.Model(&product).Association("Categories").Append(&cat) + } + } + } + + tagIDs := form.Value["tags"] + for _, tagIDStr := range tagIDs { + tagID, _ := strconv.Atoi(tagIDStr) + if tagID > 0 { + var tag models.ProductTag + if err := dbConfig.DB.First(&tag, tagID).Error; err == nil { + dbConfig.DB.Model(&product).Association("Tags").Append(&tag) + } + } + } + } else { + // if form data is not multipart, try basic FormValue array + // Though Fiber usually parses multiple values when we get them explicitly or we can just parse the body + } + + return c.Redirect().To("/admin/content/products?success=Ürün+oluşturuldu") +} + +// AdminProductEdit renders the edit hero form +func AdminProductEdit(c fiber.Ctx) error { + id := c.Params("id") + var product models.Product + if err := dbConfig.DB.Preload("Categories").Preload("Tags").First(&product, id).Error; err != nil { + return c.Status(fiber.StatusNotFound).SendString("Ürün bulunamadı") + } + + var cats []models.ProductCategory + var tags []models.ProductTag + dbConfig.DB.Order("title asc").Find(&cats) + dbConfig.DB.Order("name asc").Find(&tags) + + firstImage := "" + if product.Images != "" { + imgs := parseImagesField(product.Images) + if len(imgs) > 0 { + firstImage = imgs[0] + } + } + + return c.Render("admin/pages/product_form", fiber.Map{ + "IsEdit": true, + "Product": product, + "Categories": cats, + "Tags": tags, + "FirstImage": firstImage, + }, "admin/layout") +} + +// AdminProductUpdate handles product update +func AdminProductUpdate(c fiber.Ctx) error { + id := c.Params("id") + var product models.Product + if err := dbConfig.DB.First(&product, id).Error; err != nil { + return c.Redirect().To("/admin/content/products?error=Ürün+bulunamadı") + } + + product.Title = c.FormValue("title") + product.Content = c.FormValue("content") + + // Slug update + rawSlug := c.FormValue("slug") + if rawSlug != "" && rawSlug != product.Slug { + rawSlug = utils.Slugify(rawSlug) + attempt := rawSlug + i := 1 + for { + var existing models.Product + err := dbConfig.DB.Unscoped().Where("slug = ? AND id != ?", attempt, product.ID).First(&existing).Error + if err != nil { + break + } + attempt = rawSlug + "-" + strconv.Itoa(i) + i++ + } + product.Slug = attempt + } + + // Image Upload + priceStr := c.FormValue("price") + price, _ := strconv.ParseFloat(priceStr, 64) + width, _ := strconv.Atoi(c.FormValue("width")) + height, _ := strconv.Atoi(c.FormValue("height")) + quality, _ := strconv.Atoi(c.FormValue("quality")) + format := c.FormValue("format") + if format == "" { + format = "avif" + } + // DB fields + product.Price = price + product.Format = format + product.Width = width + product.Height = height + product.Quality = quality + + imagePath, err := services.ProcessAndSaveImage(c, "image", services.ImageOptions{ + Width: width, + Height: height, + Quality: quality, + Format: format, + Folder: "products", + }) + if err == nil && imagePath != "" { + product.Images = imagePath + } + + if err := dbConfig.DB.Save(&product).Error; err != nil { + return c.Redirect().To("/admin/content/products?error=Güncelleme+başarısız") + } + + // Handline Relations (Categories & Tags) + dbConfig.DB.Model(&product).Association("Categories").Clear() + dbConfig.DB.Model(&product).Association("Tags").Clear() + + form, err := c.MultipartForm() + + if err == nil && form != nil { + catIDs := form.Value["categories"] + for _, catIDStr := range catIDs { + catID, _ := strconv.Atoi(catIDStr) + if catID > 0 { + var cat models.ProductCategory + if err := dbConfig.DB.First(&cat, catID).Error; err == nil { + dbConfig.DB.Model(&product).Association("Categories").Append(&cat) + } + } + } + + tagIDs := form.Value["tags"] + for _, tagIDStr := range tagIDs { + tagID, _ := strconv.Atoi(tagIDStr) + if tagID > 0 { + var tag models.ProductTag + if err := dbConfig.DB.First(&tag, tagID).Error; err == nil { + dbConfig.DB.Model(&product).Association("Tags").Append(&tag) + } + } + } + } + + return c.Redirect().To("/admin/content/products?success=Ürün+güncellendi") +} + +// AdminProductDelete handles soft delete +func AdminProductDelete(c fiber.Ctx) error { + id := c.Params("id") + if err := dbConfig.DB.Delete(&models.Product{}, id).Error; err != nil { + return c.Redirect().To("/admin/content/products?error=Silme+hatası") + } + return c.Redirect().To("/admin/content/products?success=Ürün+silindi") +} + +// AdminProductRestore handles restore +func AdminProductRestore(c fiber.Ctx) error { + id := c.Params("id") + if err := dbConfig.DB.Unscoped().Model(&models.Product{}).Where("id = ?", id).Update("deleted_at", nil).Error; err != nil { + return c.Redirect().To("/admin/content/products?error=Geri+yükleme+hatası") + } + return c.Redirect().To("/admin/content/products?deleted=true&success=Ürün+geri+yüklendi") +} + +// --- ProductCategory Management --- + +func AdminContentProductCategories(c fiber.Ctx) error { + var categories []models.ProductCategory + showDeleted := c.Query("deleted") == "true" + query := dbConfig.DB.Model(&models.ProductCategory{}) + if showDeleted { + query = query.Unscoped().Where("deleted_at IS NOT NULL") + } + query.Preload("Parent").Order("title asc").Find(&categories) + + data := fiber.Map{ + "Categories": categories, + "ShowDeleted": showDeleted, + } + + if c.Get("HX-Request") == "true" { + return c.Render("admin/partials/product_categories", data) + } + return c.Render("admin/partials/product_categories", data, "admin/layout") +} + +func AdminProductCategoryNew(c fiber.Ctx) error { + var parents []models.ProductCategory + dbConfig.DB.Order("title asc").Find(&parents) + return c.Render("admin/pages/product_category_form", fiber.Map{ + "IsEdit": false, + "Parents": parents, + }, "admin/layout") +} + +func AdminProductCategoryCreate(c fiber.Ctx) error { + cat := new(models.ProductCategory) + if err := c.Bind().Body(cat); err != nil { + return c.Redirect().To("/admin/content/product-categories?error=Geçersiz+istek") + } + + if cat.Title == "" { + return c.Redirect().To("/admin/content/product-categories?error=Başlık+zorunlu") + } + + rawSlug := c.FormValue("slug") + if rawSlug == "" { + rawSlug = utils.Slugify(cat.Title) + } else { + rawSlug = utils.Slugify(rawSlug) + } + + attempt := rawSlug + i := 1 + for { + var existing models.ProductCategory + err := dbConfig.DB.Unscoped().Where("slug = ?", attempt).First(&existing).Error + if err != nil { + break + } + attempt = rawSlug + "-" + strconv.Itoa(i) + i++ + } + cat.Slug = attempt + + // Handle ParentID + parentIDStr := c.FormValue("parent_id") + if parentIDStr != "" { + if pid, err := strconv.ParseUint(parentIDStr, 10, 32); err == nil && pid > 0 { + pidUint := uint(pid) + cat.ParentID = &pidUint + } + } else { + cat.ParentID = nil + } + + if err := dbConfig.DB.Create(cat).Error; err != nil { + return c.Redirect().To("/admin/content/product-categories?error=Oluşturma+başarısız") + } + return c.Redirect().To("/admin/content/product-categories?success=Kategori+oluşturuldu") +} + +func AdminProductCategoryEdit(c fiber.Ctx) error { + id := c.Params("id") + var cat models.ProductCategory + if err := dbConfig.DB.First(&cat, id).Error; err != nil { + return c.Redirect().To("/admin/content/product-categories?error=Kategori+bulunamadı") + } + + var parents []models.ProductCategory + dbConfig.DB.Where("id != ?", id).Order("title asc").Find(&parents) + + return c.Render("admin/pages/product_category_form", fiber.Map{ + "IsEdit": true, + "Category": cat, + "Parents": parents, + }, "admin/layout") +} + +func AdminProductCategoryUpdate(c fiber.Ctx) error { + id := c.Params("id") + var cat models.ProductCategory + if err := dbConfig.DB.First(&cat, id).Error; err != nil { + return c.Redirect().To("/admin/content/product-categories?error=Kategori+bulunamadı") + } + + cat.Title = c.FormValue("title") + cat.Description = c.FormValue("description") + cat.Keywords = c.FormValue("keywords") + + rawSlug := c.FormValue("slug") + if rawSlug != "" && rawSlug != cat.Slug { + rawSlug = utils.Slugify(rawSlug) + attempt := rawSlug + i := 1 + for { + var existing models.ProductCategory + err := dbConfig.DB.Unscoped().Where("slug = ? AND id != ?", attempt, cat.ID).First(&existing).Error + if err != nil { + break + } + attempt = rawSlug + "-" + strconv.Itoa(i) + i++ + } + cat.Slug = attempt + } + + parentIDStr := c.FormValue("parent_id") + if parentIDStr != "" { + if pid, err := strconv.ParseUint(parentIDStr, 10, 32); err == nil && pid > 0 { + pidUint := uint(pid) + if pidUint != cat.ID { + cat.ParentID = &pidUint + } + } + } else { + cat.ParentID = nil + } + + if err := dbConfig.DB.Save(&cat).Error; err != nil { + return c.Redirect().To("/admin/content/product-categories?error=Güncelleme+başarısız") + } + return c.Redirect().To("/admin/content/product-categories?success=Kategori+güncellendi") +} + +func AdminProductCategoryDelete(c fiber.Ctx) error { + id := c.Params("id") + if err := dbConfig.DB.Delete(&models.ProductCategory{}, id).Error; err != nil { + return c.Redirect().To("/admin/content/product-categories?error=Silme+başarısız") + } + return c.Redirect().To("/admin/content/product-categories?success=Kategori+silindi") +} + +func AdminProductCategoryRestore(c fiber.Ctx) error { + id := c.Params("id") + if err := dbConfig.DB.Unscoped().Model(&models.ProductCategory{}).Where("id = ?", id).Update("deleted_at", nil).Error; err != nil { + return c.Redirect().To("/admin/content/product-categories?error=Geri+yükleme+başarısız") + } + return c.Redirect().To("/admin/content/product-categories?deleted=true&success=Kategori+geri+yüklendi") +} + +// --- ProductTag Management --- + +func AdminContentProductTags(c fiber.Ctx) error { + var tags []models.ProductTag + showDeleted := c.Query("deleted") == "true" + query := dbConfig.DB.Model(&models.ProductTag{}) + if showDeleted { + query = query.Unscoped().Where("deleted_at IS NOT NULL") + } + query.Order("name asc").Find(&tags) + + data := fiber.Map{ + "Tags": tags, + "ShowDeleted": showDeleted, + } + + if c.Get("HX-Request") == "true" { + return c.Render("admin/partials/product_tags", data) + } + return c.Render("admin/partials/product_tags", data, "admin/layout") +} + +func AdminProductTagNew(c fiber.Ctx) error { + return c.Render("admin/pages/product_tag_form", fiber.Map{ + "IsEdit": false, + }, "admin/layout") +} + +func AdminProductTagCreate(c fiber.Ctx) error { + tag := new(models.ProductTag) + if err := c.Bind().Body(tag); err != nil { + return c.Redirect().To("/admin/content/product-tags?error=Geçersiz+istek") + } + if tag.Name == "" { + return c.Redirect().To("/admin/content/product-tags?error=İsim+zorunlu") + } + if err := dbConfig.DB.Create(tag).Error; err != nil { + return c.Redirect().To("/admin/content/product-tags?error=Oluşturma+başarısız") + } + return c.Redirect().To("/admin/content/product-tags?success=Etiket+oluşturuldu") +} + +func AdminProductTagEdit(c fiber.Ctx) error { + id := c.Params("id") + var tag models.ProductTag + if err := dbConfig.DB.First(&tag, id).Error; err != nil { + return c.Redirect().To("/admin/content/product-tags?error=Etiket+bulunamadı") + } + return c.Render("admin/pages/product_tag_form", fiber.Map{ + "IsEdit": true, + "Tag": tag, + }, "admin/layout") +} + +func AdminProductTagUpdate(c fiber.Ctx) error { + id := c.Params("id") + var tag models.ProductTag + if err := dbConfig.DB.First(&tag, id).Error; err != nil { + return c.Redirect().To("/admin/content/product-tags?error=Etiket+bulunamadı") + } + + tag.Name = c.FormValue("name") + + if err := dbConfig.DB.Save(&tag).Error; err != nil { + return c.Redirect().To("/admin/content/product-tags?error=Güncelleme+başarısız") + } + return c.Redirect().To("/admin/content/product-tags?success=Etiket+güncellendi") +} + +func AdminProductTagDelete(c fiber.Ctx) error { + id := c.Params("id") + if err := dbConfig.DB.Delete(&models.ProductTag{}, id).Error; err != nil { + return c.Redirect().To("/admin/content/product-tags?error=Silme+başarısız") + } + return c.Redirect().To("/admin/content/product-tags?success=Etiket+silindi") +} + +func AdminProductTagRestore(c fiber.Ctx) error { + id := c.Params("id") + if err := dbConfig.DB.Unscoped().Model(&models.ProductTag{}).Where("id = ?", id).Update("deleted_at", nil).Error; err != nil { + return c.Redirect().To("/admin/content/product-tags?error=Geri+yükleme+başarısız") + } + return c.Redirect().To("/admin/content/product-tags?deleted=true&success=Etiket+geri+yüklendi") +} + +// AdminContentProductComments handles rendering the Product Comments list in the admin panel +func AdminContentProductComments(c fiber.Ctx) error { + var comments []models.ProductComment + + // Preload the User and Product for display (Wait, user and product relationships are missing in model temporarily) + // We'll just list them out manually + query := dbConfig.DB.Model(&models.ProductComment{}) + + // Optional filtering by specific product via query string + productID := c.Query("product_id") + if productID != "" { + if pid, err := strconv.Atoi(productID); err == nil { + query = query.Where("product_id = ?", pid) + } + } + + query.Order("created_at desc").Find(&comments) + + data := fiber.Map{ + "ProductComments": comments, + "ProductID": productID, + } + + if c.Get("HX-Request") == "true" { + return c.Render("admin/partials/product_comments", data) + } + + return c.Render("admin/partials/product_comments", data, "admin/layout") +} + +// AdminProductCommentDelete handles hard deleting a product comment +func AdminProductCommentDelete(c fiber.Ctx) error { + id := c.Params("id") + if err := dbConfig.DB.Unscoped().Where("id = ?", id).Delete(&models.ProductComment{}).Error; err != nil { + return c.Redirect().To("/admin/content/product-comments?error=Yorum+silinemedi") + } + + return c.Redirect().To("/admin/content/product-comments?deleted=true&success=Yorum+silindi") +} + +// AdminContentProductCategoryViews handles rendering the Product Category Views list +func AdminContentProductCategoryViews(c fiber.Ctx) error { + var views []models.ProductCategoryView + + query := dbConfig.DB.Model(&models.ProductCategoryView{}) + + // Filter by Category ID + categoryID := c.Query("category_id") + if categoryID != "" { + if cid, err := strconv.Atoi(categoryID); err == nil { + query = query.Where("category_id = ?", cid) + } + } + + query.Order("created_at desc").Find(&views) + + data := fiber.Map{ + "Views": views, + "CategoryID": categoryID, + } + + if c.Get("HX-Request") == "true" { + return c.Render("admin/partials/product_category_views", data) + } + + return c.Render("admin/partials/product_category_views", data, "admin/layout") +} diff --git a/controllers/api_cart_controller.go b/controllers/api_cart_controller.go new file mode 100644 index 0000000..b57daca --- /dev/null +++ b/controllers/api_cart_controller.go @@ -0,0 +1,237 @@ +package controllers + +import ( + database "ares/database/config" + "ares/database/models" + "errors" + "net/http" + "strconv" + + "github.com/gofiber/fiber/v3" + "gorm.io/gorm" +) + +// getOrCreateCart is a helper to fetch the cart of the current user. +func getOrCreateCart(userID uint) (models.Cart, error) { + var cart models.Cart + if err := database.DB.Preload("Items").Preload("Items.Product").Where("user_id = ?", userID).First(&cart).Error; err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + cart = models.Cart{UserID: userID} + if createErr := database.DB.Create(&cart).Error; createErr != nil { + return cart, createErr + } + return cart, nil + } + return cart, err + } + return cart, nil +} + +// GetMyCart godoc +// @Summary Get the current user's cart +// @Tags Cart +// @Produce json +// @Security BearerAuth +// @Success 200 {object} models.CartDoc +// @Failure 401 {object} map[string]string +// @Router /api/v1/cart [get] +func GetMyCart(c fiber.Ctx) error { + userID, ok := c.Locals("user_id").(uint) + if !ok || userID == 0 { + return c.Status(http.StatusUnauthorized).JSON(fiber.Map{"error": "unauthorized"}) + } + + cart, err := getOrCreateCart(userID) + if err != nil { + return c.Status(http.StatusInternalServerError).JSON(fiber.Map{"error": "could not load cart"}) + } + + return c.JSON(cart) +} + +// AddToCartRequest represents the body for adding to a cart +type AddToCartRequest struct { + ProductID uint `json:"product_id" validate:"required"` + Quantity int `json:"quantity" validate:"required,min=1"` +} + +// AddToCart godoc +// @Summary Add item to cart +// @Tags Cart +// @Accept json +// @Produce json +// @Security BearerAuth +// @Param data body AddToCartRequest true "Cart Item Details" +// @Success 200 {object} models.CartDoc +// @Failure 400 {object} map[string]string +// @Failure 401 {object} map[string]string +// @Failure 404 {object} map[string]string +// @Router /api/v1/cart/items [post] +func AddToCart(c fiber.Ctx) error { + userID, ok := c.Locals("user_id").(uint) + if !ok || userID == 0 { + return c.Status(http.StatusUnauthorized).JSON(fiber.Map{"error": "unauthorized"}) + } + + var input AddToCartRequest + if err := c.Bind().Body(&input); err != nil { + return c.Status(http.StatusBadRequest).JSON(fiber.Map{"error": "invalid payload"}) + } + + if err := validate.Struct(input); err != nil { + return c.Status(http.StatusBadRequest).JSON(fiber.Map{"error": err.Error()}) + } + + // Check product exists + var product models.Product + if err := database.DB.First(&product, input.ProductID).Error; err != nil { + return c.Status(http.StatusNotFound).JSON(fiber.Map{"error": "product not found"}) + } + + cart, err := getOrCreateCart(userID) + if err != nil { + return c.Status(http.StatusInternalServerError).JSON(fiber.Map{"error": "could not load cart"}) + } + + // Check if item already exists in cart + var existingItem models.CartItem + if err := database.DB.Where("cart_id = ? AND product_id = ?", cart.ID, input.ProductID).First(&existingItem).Error; err == nil { + // Update quantity + existingItem.Quantity += input.Quantity + database.DB.Save(&existingItem) + } else { + // Create new item + newItem := models.CartItem{ + CartID: cart.ID, + ProductID: input.ProductID, + Quantity: input.Quantity, + } + database.DB.Create(&newItem) + } + + // Return updated cart + cart, _ = getOrCreateCart(userID) + return c.JSON(cart) +} + +// UpdateCartItemRequest represents the body for updating a cart item quantity +type UpdateCartItemRequest struct { + Quantity int `json:"quantity" validate:"required,min=1"` +} + +// UpdateCartItem godoc +// @Summary Update cart item quantity +// @Tags Cart +// @Accept json +// @Produce json +// @Security BearerAuth +// @Param item_id path int true "Cart Item ID" +// @Param data body UpdateCartItemRequest true "Update Quantity" +// @Success 200 {object} models.CartDoc +// @Failure 400 {object} map[string]string +// @Failure 401 {object} map[string]string +// @Failure 404 {object} map[string]string +// @Router /api/v1/cart/items/{item_id} [put] +func UpdateCartItem(c fiber.Ctx) error { + userID, ok := c.Locals("user_id").(uint) + if !ok || userID == 0 { + return c.Status(http.StatusUnauthorized).JSON(fiber.Map{"error": "unauthorized"}) + } + + itemID, err := strconv.ParseUint(c.Params("item_id"), 10, 32) + if err != nil { + return c.Status(http.StatusBadRequest).JSON(fiber.Map{"error": "invalid item id"}) + } + + var input UpdateCartItemRequest + if err := c.Bind().Body(&input); err != nil { + return c.Status(http.StatusBadRequest).JSON(fiber.Map{"error": "invalid payload"}) + } + + if err := validate.Struct(input); err != nil { + return c.Status(http.StatusBadRequest).JSON(fiber.Map{"error": err.Error()}) + } + + cart, err := getOrCreateCart(userID) + if err != nil { + return c.Status(http.StatusInternalServerError).JSON(fiber.Map{"error": "could not load cart"}) + } + + var cartItem models.CartItem + if err := database.DB.Where("id = ? AND cart_id = ?", itemID, cart.ID).First(&cartItem).Error; err != nil { + return c.Status(http.StatusNotFound).JSON(fiber.Map{"error": "item not found in your cart"}) + } + + cartItem.Quantity = input.Quantity + database.DB.Save(&cartItem) + + // Return updated cart + cart, _ = getOrCreateCart(userID) + return c.JSON(cart) +} + +// RemoveFromCart godoc +// @Summary Remove item from cart +// @Tags Cart +// @Produce json +// @Security BearerAuth +// @Param item_id path int true "Cart Item ID" +// @Success 200 {object} models.CartDoc +// @Failure 400 {object} map[string]string +// @Failure 401 {object} map[string]string +// @Failure 404 {object} map[string]string +// @Router /api/v1/cart/items/{item_id} [delete] +func RemoveFromCart(c fiber.Ctx) error { + userID, ok := c.Locals("user_id").(uint) + if !ok || userID == 0 { + return c.Status(http.StatusUnauthorized).JSON(fiber.Map{"error": "unauthorized"}) + } + + itemID, err := strconv.ParseUint(c.Params("item_id"), 10, 32) + if err != nil { + return c.Status(http.StatusBadRequest).JSON(fiber.Map{"error": "invalid item id"}) + } + + cart, err := getOrCreateCart(userID) + if err != nil { + return c.Status(http.StatusInternalServerError).JSON(fiber.Map{"error": "could not load cart"}) + } + + var cartItem models.CartItem + if err := database.DB.Where("id = ? AND cart_id = ?", itemID, cart.ID).First(&cartItem).Error; err != nil { + return c.Status(http.StatusNotFound).JSON(fiber.Map{"error": "item not found in your cart"}) + } + + database.DB.Delete(&cartItem) + + // Return updated cart + cart, _ = getOrCreateCart(userID) + return c.JSON(cart) +} + +// ClearCart godoc +// @Summary Clear the entire cart +// @Tags Cart +// @Produce json +// @Security BearerAuth +// @Success 200 {object} models.CartDoc +// @Failure 401 {object} map[string]string +// @Router /api/v1/cart [delete] +func ClearCart(c fiber.Ctx) error { + userID, ok := c.Locals("user_id").(uint) + if !ok || userID == 0 { + return c.Status(http.StatusUnauthorized).JSON(fiber.Map{"error": "unauthorized"}) + } + + cart, err := getOrCreateCart(userID) + if err != nil { + return c.Status(http.StatusInternalServerError).JSON(fiber.Map{"error": "could not load cart"}) + } + + // Delete all items for this cart + database.DB.Where("cart_id = ?", cart.ID).Delete(&models.CartItem{}) + + // Return updated empty cart + cart, _ = getOrCreateCart(userID) + return c.JSON(cart) +} diff --git a/controllers/blog_controller.go b/controllers/blog_controller.go new file mode 100644 index 0000000..33c4199 --- /dev/null +++ b/controllers/blog_controller.go @@ -0,0 +1,1123 @@ +package controllers + +import ( + database "ares/database/config" + "ares/database/models" + "encoding/json" + "errors" + "fmt" + "mime/multipart" + "net/http" + "path/filepath" + "regexp" + "strconv" + "strings" + "time" + + "github.com/gofiber/fiber/v3" + "gorm.io/gorm" +) + +// reuse package-level `validate` defined in other controller files +// (one global validator instance is sufficient) + +func parseIDsCSV(s string) []uint { + if s == "" { + return nil + } + parts := strings.Split(s, ",") + out := make([]uint, 0, len(parts)) + for _, p := range parts { + p = strings.TrimSpace(p) + if p == "" { + continue + } + v, err := strconv.ParseUint(p, 10, 64) + if err == nil { + out = append(out, uint(v)) + } + } + return out +} + +// slugify converts a title to a URL-friendly slug +func slugify(s string) string { + // replace common Turkish characters with ASCII equivalents + replacer := strings.NewReplacer( + "Ç", "C", "ç", "c", + "Ğ", "G", "ğ", "g", + "İ", "I", "ı", "i", + "Ö", "O", "ö", "o", + "Ş", "S", "ş", "s", + "Ü", "U", "ü", "u", + ) + s = replacer.Replace(s) + s = strings.ToLower(s) + re := regexp.MustCompile("[^a-z0-9]+") + s = re.ReplaceAllString(s, "-") + s = strings.Trim(s, "-") + return s +} + +// UpdateCategoryRequest represents payload for updating a category +// swagger:model UpdateCategoryRequest +type UpdateCategoryRequest struct { + Title *string `json:"title" validate:"omitempty,min=2"` + Description *string `json:"description"` + ParentID *uint `json:"parent_id"` +} + +// makeUniqueSlug ensures the slug is unique in posts table, appending suffix if needed +func makeUniqueSlug(base string) string { + slug := base + var count int64 + i := 1 + for { + database.DB.Model(&models.Post{}).Where("slug = ?", slug).Count(&count) + if count == 0 { + return slug + } + slug = base + "-" + strconv.Itoa(i) + i++ + } +} + +// makeUniqueSlugExclude ensures uniqueness excluding a specific post id (used on updates) +func makeUniqueSlugExclude(base string, excludeID uint64) string { + slug := base + var count int64 + i := 1 + for { + database.DB.Model(&models.Post{}).Where("slug = ? AND id != ?", slug, excludeID).Count(&count) + if count == 0 { + return slug + } + slug = base + "-" + strconv.Itoa(i) + i++ + } +} + +// makeUniqueSlugCategory ensures the slug is unique in categories table +func makeUniqueSlugCategory(base string) string { + slug := base + var count int64 + i := 1 + for { + database.DB.Model(&models.Category{}).Where("slug = ?", slug).Count(&count) + if count == 0 { + return slug + } + slug = base + "-" + strconv.Itoa(i) + i++ + } +} + +// makeUniqueSlugCategoryExclude ensures the slug is unique in categories table excluding an id +func makeUniqueSlugCategoryExclude(base string, excludeID uint64) string { + slug := base + var count int64 + i := 1 + for { + database.DB.Model(&models.Category{}).Where("slug = ? AND id != ?", slug, excludeID).Count(&count) + if count == 0 { + return slug + } + slug = base + "-" + strconv.Itoa(i) + i++ + } +} + +func saveUploadedFiles(c fiber.Ctx, files []*multipart.FileHeader) ([]string, error) { + if len(files) == 0 { + return nil, nil + } + saved := make([]string, 0, len(files)) + for _, fh := range files { + filename := fmt.Sprintf("%d_%s", time.Now().UnixNano(), fh.Filename) + path := filepath.Join("./uploads/posts", filename) + if err := c.SaveFile(fh, path); err != nil { + return nil, err + } + saved = append(saved, "/uploads/posts/"+filename) + } + return saved, nil +} + +// -------- POSTS -------- + +// GetPosts godoc +// @Summary List posts (public) with pagination +// @Tags Posts +// @Produce json +// @Param page query int false "Page number" +// @Param per_page query int false "Items per page" +// @Success 200 {object} map[string]interface{} +// @Router /api/v1/posts [get] +func GetPosts(c fiber.Ctx) error { + pageStr := c.Query("page", "1") + perPageStr := c.Query("per_page", "10") + page, _ := strconv.Atoi(pageStr) + perPage, _ := strconv.Atoi(perPageStr) + if page < 1 { + page = 1 + } + if perPage < 1 { + perPage = 10 + } + if perPage > 100 { + perPage = 100 + } + offset := (page - 1) * perPage + + var total int64 + database.DB.Model(&models.Post{}).Count(&total) + + var posts []models.Post + database.DB.Preload("Categories").Preload("Tags").Limit(perPage).Offset(offset).Find(&posts) + + return c.JSON(fiber.Map{ + "data": posts, + "meta": fiber.Map{"page": page, "per_page": perPage, "total": total}, + }) +} + +// GetPost godoc +// @Summary Get single post (public) +// @Tags Posts +// @Produce json +// @Param slug path string true "Post slug" +// @Success 200 {object} models.PostDoc +// @Failure 404 {object} map[string]string +// @Router /api/v1/posts/{slug} [get] +func GetPost(c fiber.Ctx) error { + slug := c.Params("slug") + if slug == "" { + return c.Status(http.StatusBadRequest).JSON(fiber.Map{"error": "invalid slug"}) + } + var post models.Post + if err := database.DB.Preload("Categories").Preload("Tags").Where("slug = ? AND deleted_at IS NULL", slug).First(&post).Error; err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + return c.Status(http.StatusNotFound).JSON(fiber.Map{"error": "post not found"}) + } + return c.Status(http.StatusInternalServerError).JSON(fiber.Map{"error": "db error"}) + } + return c.JSON(post) +} + +func CreatePost(c fiber.Ctx) error { + // Support both multipart/form-data and JSON + if strings.HasPrefix(c.Get("Content-Type"), "multipart/form-data") { + form, err := c.MultipartForm() + if err != nil { + return c.Status(http.StatusBadRequest).JSON(fiber.Map{"error": "invalid multipart form"}) + } + title := firstValue(form.Value, "title") + if title == "" { + return c.Status(http.StatusBadRequest).JSON(fiber.Map{"error": "title required"}) + } + content := firstValue(form.Value, "content") + catIDs := parseIDsCSV(firstValue(form.Value, "category_ids")) + tagIDs := parseIDsCSV(firstValue(form.Value, "tag_ids")) + files := form.File["images"] + saved, err := saveUploadedFiles(c, files) + if err != nil { + return c.Status(http.StatusInternalServerError).JSON(fiber.Map{"error": "failed to save images"}) + } + imgsJSON, _ := json.Marshal(saved) + baseSlug := slugify(title) + post := models.Post{Title: title, Content: content, Images: string(imgsJSON)} + post.Slug = makeUniqueSlug(baseSlug) + if len(catIDs) > 0 { + var cats []models.Category + database.DB.Find(&cats, catIDs) + post.Categories = cats + } + if len(tagIDs) > 0 { + var tags []models.Tag + database.DB.Find(&tags, tagIDs) + post.Tags = tags + } + if err := database.DB.Create(&post).Error; err != nil { + return c.Status(http.StatusInternalServerError).JSON(fiber.Map{"error": "could not create post"}) + } + return c.Status(http.StatusCreated).JSON(post) + } + + // JSON fallback + var input struct { + Title string `json:"title" validate:"required,min=3"` + Content string `json:"content"` + CategoryIDs []uint `json:"category_ids"` + TagIDs []uint `json:"tag_ids"` + Images []string `json:"images"` + } + if err := c.Bind().Body(&input); err != nil { + return c.Status(http.StatusBadRequest).JSON(fiber.Map{"error": "invalid body"}) + } + if err := validate.Struct(input); err != nil { + return c.Status(http.StatusBadRequest).JSON(fiber.Map{"error": err.Error()}) + } + imgsJSON, _ := json.Marshal(input.Images) + baseSlug := slugify(input.Title) + post := models.Post{Title: input.Title, Content: input.Content, Images: string(imgsJSON)} + post.Slug = makeUniqueSlug(baseSlug) + if len(input.CategoryIDs) > 0 { + var cats []models.Category + database.DB.Find(&cats, input.CategoryIDs) + post.Categories = cats + } + if len(input.TagIDs) > 0 { + var tags []models.Tag + database.DB.Find(&tags, input.TagIDs) + post.Tags = tags + } + if err := database.DB.Create(&post).Error; err != nil { + return c.Status(http.StatusInternalServerError).JSON(fiber.Map{"error": "could not create post"}) + } + return c.Status(http.StatusCreated).JSON(post) +} + +func firstValue(m map[string][]string, key string) string { + if m == nil { + return "" + } + if v, ok := m[key]; ok && len(v) > 0 { + return v[0] + } + return "" +} + + +func UpdatePost(c fiber.Ctx) error { + // multipart or JSON handling similar to CreatePost + id, err := strconv.ParseUint(c.Params("id"), 10, 64) + if err != nil { + return c.Status(http.StatusBadRequest).JSON(fiber.Map{"error": "invalid id"}) + } + var post models.Post + if err := database.DB.Preload("Categories").Preload("Tags").First(&post, id).Error; err != nil { + return c.Status(http.StatusNotFound).JSON(fiber.Map{"error": "post not found"}) + } + + if strings.HasPrefix(c.Get("Content-Type"), "multipart/form-data") { + form, err := c.MultipartForm() + if err != nil { + return c.Status(http.StatusBadRequest).JSON(fiber.Map{"error": "invalid multipart form"}) + } + title := firstValue(form.Value, "title") + if title != "" { + post.Title = title + // regenerate slug on title change + post.Slug = makeUniqueSlugExclude(slugify(title), uint64(post.ID)) + } + content := firstValue(form.Value, "content") + if content != "" { + post.Content = content + } + catIDs := parseIDsCSV(firstValue(form.Value, "category_ids")) + if len(catIDs) > 0 { + var cats []models.Category + database.DB.Find(&cats, catIDs) + if err := database.DB.Model(&post).Association("Categories").Replace(&cats); err != nil { + return c.Status(http.StatusInternalServerError).JSON(fiber.Map{"error": "could not update categories"}) + } + } + tagIDs := parseIDsCSV(firstValue(form.Value, "tag_ids")) + if len(tagIDs) > 0 { + var tags []models.Tag + database.DB.Find(&tags, tagIDs) + if err := database.DB.Model(&post).Association("Tags").Replace(&tags); err != nil { + return c.Status(http.StatusInternalServerError).JSON(fiber.Map{"error": "could not update tags"}) + } + } + files := form.File["images"] + if len(files) > 0 { + saved, err := saveUploadedFiles(c, files) + if err != nil { + return c.Status(http.StatusInternalServerError).JSON(fiber.Map{"error": "failed to save images"}) + } + imgsJSON, _ := json.Marshal(saved) + post.Images = string(imgsJSON) + } + if err := database.DB.Save(&post).Error; err != nil { + return c.Status(http.StatusInternalServerError).JSON(fiber.Map{"error": "could not update post"}) + } + return c.JSON(post) + } + + // JSON fallback + var input struct { + Title *string `json:"title" validate:"omitempty,min=3"` + Content *string `json:"content"` + CategoryIDs []uint `json:"category_ids"` + TagIDs []uint `json:"tag_ids"` + Images []string `json:"images"` + } + if err := c.Bind().Body(&input); err != nil { + return c.Status(http.StatusBadRequest).JSON(fiber.Map{"error": "invalid body"}) + } + if err := validate.Struct(input); err != nil { + return c.Status(http.StatusBadRequest).JSON(fiber.Map{"error": err.Error()}) + } + if input.Title != nil { + post.Title = *input.Title + post.Slug = makeUniqueSlugExclude(slugify(*input.Title), uint64(post.ID)) + } + if input.Content != nil { + post.Content = *input.Content + } + if input.CategoryIDs != nil { + var cats []models.Category + database.DB.Find(&cats, input.CategoryIDs) + if err := database.DB.Model(&post).Association("Categories").Replace(&cats); err != nil { + return c.Status(http.StatusInternalServerError).JSON(fiber.Map{"error": "could not update categories"}) + } + } + if input.TagIDs != nil { + var tags []models.Tag + database.DB.Find(&tags, input.TagIDs) + if err := database.DB.Model(&post).Association("Tags").Replace(&tags); err != nil { + return c.Status(http.StatusInternalServerError).JSON(fiber.Map{"error": "could not update tags"}) + } + } + if input.Images != nil { + imgsJSON, _ := json.Marshal(input.Images) + post.Images = string(imgsJSON) + } + if err := database.DB.Save(&post).Error; err != nil { + return c.Status(http.StatusInternalServerError).JSON(fiber.Map{"error": "could not update post"}) + } + return c.JSON(post) +} + + +func DeletePost(c fiber.Ctx) error { + id, err := strconv.ParseUint(c.Params("id"), 10, 64) + if err != nil { + return c.Status(http.StatusBadRequest).JSON(fiber.Map{"error": "invalid id"}) + } + var post models.Post + if err := database.DB.First(&post, id).Error; err != nil { + return c.Status(http.StatusNotFound).JSON(fiber.Map{"error": "post not found"}) + } + if err := database.DB.Delete(&post).Error; err != nil { + return c.Status(http.StatusInternalServerError).JSON(fiber.Map{"error": "could not delete post"}) + } + return c.JSON(fiber.Map{"message": "post deleted"}) +} + +func AdminListPosts(c fiber.Ctx) error { + trashed := c.Query("trashed", "none") + if trashed != "none" && trashed != "only" && trashed != "with" { + return c.Status(http.StatusBadRequest).JSON(fiber.Map{"error": "invalid trashed parameter, must be one of: none, only, with"}) + } + + pageStr := c.Query("page", "1") + perPageStr := c.Query("per_page", "10") + page, _ := strconv.Atoi(pageStr) + perPage, _ := strconv.Atoi(perPageStr) + if page < 1 { + page = 1 + } + if perPage < 1 { + perPage = 10 + } + if perPage > 100 { + perPage = 100 + } + offset := (page - 1) * perPage + + var total int64 + var posts []models.Post + db := database.DB + + switch trashed { + case "none": + db.Model(&models.Post{}).Count(&total) + db.Preload("Categories").Preload("Tags").Order("id desc").Limit(perPage).Offset(offset).Find(&posts) + case "only": + db.Unscoped().Model(&models.Post{}).Where("deleted_at IS NOT NULL").Count(&total) + db.Unscoped().Preload("Categories").Preload("Tags").Where("deleted_at IS NOT NULL").Order("deleted_at desc").Limit(perPage).Offset(offset).Find(&posts) + case "with": + db.Unscoped().Model(&models.Post{}).Count(&total) + db.Unscoped().Preload("Categories").Preload("Tags").Order("id desc").Limit(perPage).Offset(offset).Find(&posts) + } + + return c.JSON(fiber.Map{"data": posts, "meta": fiber.Map{"page": page, "per_page": perPage, "total": total}}) +} + +func HardDeletePost(c fiber.Ctx) error { + if database.DB == nil { + return c.Status(http.StatusServiceUnavailable).JSON(fiber.Map{"error": "database is not configured"}) + } + + id, err := strconv.ParseUint(c.Params("id"), 10, 64) + if err != nil || id == 0 { + return c.Status(http.StatusBadRequest).JSON(fiber.Map{"error": "invalid post id"}) + } + + var post models.Post + if err := database.DB.Unscoped().First(&post, id).Error; err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + return c.Status(http.StatusNotFound).JSON(fiber.Map{"error": "post not found"}) + } + return c.Status(http.StatusInternalServerError).JSON(fiber.Map{"error": "database error"}) + } + + err = database.DB.Transaction(func(tx *gorm.DB) error { + // clear many2many associations to avoid orphaned join rows + if err := tx.Model(&post).Association("Categories").Clear(); err != nil { + return err + } + if err := tx.Model(&post).Association("Tags").Clear(); err != nil { + return err + } + // permanently delete the post + return tx.Unscoped().Delete(&post).Error + }) + if err != nil { + return c.Status(http.StatusInternalServerError).JSON(fiber.Map{"error": "post hard-delete failed"}) + } + + return c.JSON(fiber.Map{ + "message": "post permanently deleted", + "post_id": id, + }) +} + +func AdminRestorePost(c fiber.Ctx) error { + if database.DB == nil { + return c.Status(http.StatusServiceUnavailable).JSON(fiber.Map{"error": "database is not configured"}) + } + + id, err := strconv.ParseUint(c.Params("id"), 10, 64) + if err != nil || id == 0 { + return c.Status(http.StatusBadRequest).JSON(fiber.Map{"error": "invalid post id"}) + } + + var post models.Post + if err := database.DB.Unscoped().First(&post, id).Error; err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + return c.Status(http.StatusNotFound).JSON(fiber.Map{"error": "post not found"}) + } + return c.Status(http.StatusInternalServerError).JSON(fiber.Map{"error": "database error"}) + } + + // Check if soft-deleted + if !post.DeletedAt.Valid { + return c.Status(http.StatusBadRequest).JSON(fiber.Map{"error": "post is not soft-deleted"}) + } + + if err := database.DB.Unscoped().Model(&models.Post{}).Where("id = ?", id).Update("deleted_at", nil).Error; err != nil { + return c.Status(http.StatusInternalServerError).JSON(fiber.Map{"error": "post could not be restored"}) + } + + return c.JSON(fiber.Map{ + "message": "post restored successfully", + "post_id": id, + }) +} + +// -------- CATEGORIES -------- + +// ListCategories godoc +// @Summary List categories (public) +// @Tags Categories +// @Produce json +// @Success 200 {array} models.CategoryDoc +// @Router /api/v1/categories [get] +func ListCategories(c fiber.Ctx) error { + var cats []models.Category + // return only root categories (no parent) and preload their immediate children + database.DB.Preload("Children").Where("parent_id IS NULL").Find(&cats) + return c.JSON(cats) +} + +// helper: convert models.Category -> models.CategoryDoc recursively +func categoryToDoc(cat models.Category) models.CategoryDoc { + doc := models.CategoryDoc{ + ID: uint(cat.ID), + Title: cat.Title, + Description: cat.Description, + ParentID: cat.ParentID, + } + if len(cat.Children) > 0 { + children := make([]models.CategoryDoc, 0, len(cat.Children)) + for _, ch := range cat.Children { + children = append(children, categoryToDoc(ch)) + } + doc.Children = children + } + return doc +} + +// GetCategory godoc +// @Summary Get single category (public) +// @Tags Categories +// @Produce json +// @Param slug path string true "Category slug" +// @Success 200 {object} models.CategoryDoc +// @Failure 404 {object} map[string]string +// @Router /api/v1/categories/{slug} [get] +func GetCategory(c fiber.Ctx) error { + slug := c.Params("slug") + if slug == "" { + return c.Status(http.StatusBadRequest).JSON(fiber.Map{"error": "invalid slug"}) + } + var cat models.Category + if err := database.DB.Preload("Children").Where("slug = ?", slug).First(&cat).Error; err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + return c.Status(http.StatusNotFound).JSON(fiber.Map{"error": "category not found"}) + } + return c.Status(http.StatusInternalServerError).JSON(fiber.Map{"error": "db error"}) + } + doc := categoryToDoc(cat) + return c.JSON(doc) +} + +// CreateCategoryRequest represents payload for creating a category +type CreateCategoryRequest struct { + Title string `json:"title" validate:"required,min=2"` + Description string `json:"description,omitempty"` + ParentID *uint `json:"parent_id,omitempty"` +} + + +func CreateCategory(c fiber.Ctx) error { + var input CreateCategoryRequest + if err := c.Bind().Body(&input); err != nil { + return c.Status(http.StatusBadRequest).JSON(fiber.Map{"error": "invalid body"}) + } + if err := validate.Struct(input); err != nil { + return c.Status(http.StatusBadRequest).JSON(fiber.Map{"error": err.Error()}) + } + // validate parent exists when provided + if input.ParentID != nil { + var parent models.Category + if err := database.DB.First(&parent, *input.ParentID).Error; err != nil { + return c.Status(http.StatusBadRequest).JSON(fiber.Map{"error": "invalid parent_id"}) + } + } + cat := models.Category{Title: input.Title, Description: input.Description, ParentID: input.ParentID} + // generate unique slug from title + base := slugify(input.Title) + cat.Slug = makeUniqueSlugCategory(base) + if err := database.DB.Create(&cat).Error; err != nil { + return c.Status(http.StatusInternalServerError).JSON(fiber.Map{"error": "could not create category"}) + } + return c.Status(http.StatusCreated).JSON(cat) +} + + +func UpdateCategory(c fiber.Ctx) error { + id, err := strconv.ParseUint(c.Params("id"), 10, 64) + if err != nil { + return c.Status(http.StatusBadRequest).JSON(fiber.Map{"error": "invalid id"}) + } + var cat models.Category + if err := database.DB.First(&cat, id).Error; err != nil { + return c.Status(http.StatusNotFound).JSON(fiber.Map{"error": "category not found"}) + } + var input struct { + Title *string `json:"title" validate:"omitempty,min=2"` + Description *string `json:"description"` + ParentID *uint `json:"parent_id"` + } + if err := c.Bind().Body(&input); err != nil { + return c.Status(http.StatusBadRequest).JSON(fiber.Map{"error": "invalid body"}) + } + if err := validate.Struct(input); err != nil { + return c.Status(http.StatusBadRequest).JSON(fiber.Map{"error": err.Error()}) + } + if input.Title != nil { + cat.Title = *input.Title + // regenerate slug on title change + cat.Slug = makeUniqueSlugCategoryExclude(slugify(*input.Title), uint64(cat.ID)) + } + if input.Description != nil { + cat.Description = *input.Description + } + if input.ParentID != nil { + // prevent setting parent to itself + if *input.ParentID == cat.ID { + return c.Status(http.StatusBadRequest).JSON(fiber.Map{"error": "parent_id cannot be the category itself"}) + } + // validate parent exists + var parent models.Category + if err := database.DB.First(&parent, *input.ParentID).Error; err != nil { + return c.Status(http.StatusBadRequest).JSON(fiber.Map{"error": "invalid parent_id"}) + } + cat.ParentID = input.ParentID + } + if err := database.DB.Save(&cat).Error; err != nil { + return c.Status(http.StatusInternalServerError).JSON(fiber.Map{"error": "could not update category"}) + } + return c.JSON(cat) +} + + +func DeleteCategory(c fiber.Ctx) error { + id, err := strconv.ParseUint(c.Params("id"), 10, 64) + if err != nil { + return c.Status(http.StatusBadRequest).JSON(fiber.Map{"error": "invalid id"}) + } + var cat models.Category + if err := database.DB.First(&cat, id).Error; err != nil { + return c.Status(http.StatusNotFound).JSON(fiber.Map{"error": "category not found"}) + } + if err := database.DB.Delete(&cat).Error; err != nil { + return c.Status(http.StatusInternalServerError).JSON(fiber.Map{"error": "could not delete category"}) + } + return c.JSON(fiber.Map{"message": "category deleted"}) +} + +func AdminListCategories(c fiber.Ctx) error { + trashed := c.Query("trashed", "none") + if trashed != "none" && trashed != "only" && trashed != "with" { + return c.Status(http.StatusBadRequest).JSON(fiber.Map{"error": "invalid trashed parameter, must be one of: none, only, with"}) + } + + pageStr := c.Query("page", "1") + perPageStr := c.Query("per_page", "10") + page, _ := strconv.Atoi(pageStr) + perPage, _ := strconv.Atoi(perPageStr) + if page < 1 { + page = 1 + } + if perPage < 1 { + perPage = 10 + } + if perPage > 100 { + perPage = 100 + } + offset := (page - 1) * perPage + + var total int64 + var cats []models.Category + db := database.DB + + switch trashed { + case "none": + db.Model(&models.Category{}).Count(&total) + db.Preload("Children").Order("id desc").Limit(perPage).Offset(offset).Find(&cats) + case "only": + db.Unscoped().Model(&models.Category{}).Where("deleted_at IS NOT NULL").Count(&total) + db.Unscoped().Preload("Children").Where("deleted_at IS NOT NULL").Order("deleted_at desc").Limit(perPage).Offset(offset).Find(&cats) + case "with": + db.Unscoped().Model(&models.Category{}).Count(&total) + db.Unscoped().Preload("Children").Order("id desc").Limit(perPage).Offset(offset).Find(&cats) + } + + return c.JSON(fiber.Map{"data": cats, "meta": fiber.Map{"page": page, "per_page": perPage, "total": total}}) +} + +func HardDeleteCategory(c fiber.Ctx) error { + if database.DB == nil { + return c.Status(http.StatusServiceUnavailable).JSON(fiber.Map{"error": "database is not configured"}) + } + + id, err := strconv.ParseUint(c.Params("id"), 10, 64) + if err != nil || id == 0 { + return c.Status(http.StatusBadRequest).JSON(fiber.Map{"error": "invalid category id"}) + } + + var cat models.Category + if err := database.DB.Unscoped().First(&cat, id).Error; err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + return c.Status(http.StatusNotFound).JSON(fiber.Map{"error": "category not found"}) + } + return c.Status(http.StatusInternalServerError).JSON(fiber.Map{"error": "database error"}) + } + + err = database.DB.Transaction(func(tx *gorm.DB) error { + // set parent_id of children to NULL to avoid FK issues + if err := tx.Model(&models.Category{}).Where("parent_id = ?", id).Update("parent_id", nil).Error; err != nil { + return err + } + // clear many2many association with posts to avoid FK constraint errors (post_categories) + if err := tx.Model(&cat).Association("Posts").Clear(); err != nil { + return err + } + return tx.Unscoped().Delete(&cat).Error + }) + if err != nil { + return c.Status(http.StatusInternalServerError).JSON(fiber.Map{"error": "category hard-delete failed"}) + } + + return c.JSON(fiber.Map{"message": "category permanently deleted", "category_id": id}) +} + +func AdminRestoreCategory(c fiber.Ctx) error { + if database.DB == nil { + return c.Status(http.StatusServiceUnavailable).JSON(fiber.Map{"error": "database is not configured"}) + } + + id, err := strconv.ParseUint(c.Params("id"), 10, 64) + if err != nil || id == 0 { + return c.Status(http.StatusBadRequest).JSON(fiber.Map{"error": "invalid category id"}) + } + + var cat models.Category + if err := database.DB.Unscoped().First(&cat, id).Error; err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + return c.Status(http.StatusNotFound).JSON(fiber.Map{"error": "category not found"}) + } + return c.Status(http.StatusInternalServerError).JSON(fiber.Map{"error": "database error"}) + } + + if !cat.DeletedAt.Valid { + return c.Status(http.StatusBadRequest).JSON(fiber.Map{"error": "category is not soft-deleted"}) + } + + if err := database.DB.Unscoped().Model(&models.Category{}).Where("id = ?", id).Update("deleted_at", nil).Error; err != nil { + return c.Status(http.StatusInternalServerError).JSON(fiber.Map{"error": "category could not be restored"}) + } + + return c.JSON(fiber.Map{"message": "category restored successfully", "category_id": id}) +} + +// -------- TAGS -------- + +// ListTags godoc +// @Summary List tags (public) +// @Tags Tags +// @Produce json +// @Success 200 {array} models.TagDoc +// @Router /api/v1/tags [get] +func ListTags(c fiber.Ctx) error { + var tags []models.Tag + database.DB.Find(&tags) + return c.JSON(tags) +} + +// CreateTagRequest represents payload for creating a tag +// swagger:model CreateTagRequest +type CreateTagRequest struct { + Name string `json:"name" validate:"required,min=1"` +} + +// UpdateTagRequest represents payload for updating a tag +// swagger:model UpdateTagRequest +type UpdateTagRequest struct { + Name *string `json:"name" validate:"omitempty,min=1"` +} + + +func CreateTag(c fiber.Ctx) error { + var input CreateTagRequest + if err := c.Bind().Body(&input); err != nil { + return c.Status(http.StatusBadRequest).JSON(fiber.Map{"error": "invalid body"}) + } + if err := validate.Struct(input); err != nil { + return c.Status(http.StatusBadRequest).JSON(fiber.Map{"error": err.Error()}) + } + tag := models.Tag{Name: input.Name} + if err := database.DB.Create(&tag).Error; err != nil { + return c.Status(http.StatusInternalServerError).JSON(fiber.Map{"error": "could not create tag"}) + } + return c.Status(http.StatusCreated).JSON(tag) +} + + +func UpdateTag(c fiber.Ctx) error { + id, err := strconv.ParseUint(c.Params("id"), 10, 64) + if err != nil { + return c.Status(http.StatusBadRequest).JSON(fiber.Map{"error": "invalid id"}) + } + var tag models.Tag + if err := database.DB.First(&tag, id).Error; err != nil { + return c.Status(http.StatusNotFound).JSON(fiber.Map{"error": "tag not found"}) + } + var input UpdateTagRequest + if err := c.Bind().Body(&input); err != nil { + return c.Status(http.StatusBadRequest).JSON(fiber.Map{"error": "invalid body"}) + } + if err := validate.Struct(input); err != nil { + return c.Status(http.StatusBadRequest).JSON(fiber.Map{"error": err.Error()}) + } + if input.Name != nil { + tag.Name = *input.Name + } + if err := database.DB.Save(&tag).Error; err != nil { + return c.Status(http.StatusInternalServerError).JSON(fiber.Map{"error": "could not update tag"}) + } + return c.JSON(tag) +} + + +func DeleteTag(c fiber.Ctx) error { + id, err := strconv.ParseUint(c.Params("id"), 10, 64) + if err != nil { + return c.Status(http.StatusBadRequest).JSON(fiber.Map{"error": "invalid id"}) + } + var tag models.Tag + if err := database.DB.First(&tag, id).Error; err != nil { + return c.Status(http.StatusNotFound).JSON(fiber.Map{"error": "tag not found"}) + } + if err := database.DB.Delete(&tag).Error; err != nil { + return c.Status(http.StatusInternalServerError).JSON(fiber.Map{"error": "could not delete tag"}) + } + return c.JSON(fiber.Map{"message": "tag deleted"}) +} + +func AdminListTags(c fiber.Ctx) error { + trashed := c.Query("trashed", "none") + if trashed != "none" && trashed != "only" && trashed != "with" { + return c.Status(http.StatusBadRequest).JSON(fiber.Map{"error": "invalid trashed parameter, must be one of: none, only, with"}) + } + + pageStr := c.Query("page", "1") + perPageStr := c.Query("per_page", "10") + page, _ := strconv.Atoi(pageStr) + perPage, _ := strconv.Atoi(perPageStr) + if page < 1 { + page = 1 + } + if perPage < 1 { + perPage = 10 + } + if perPage > 100 { + perPage = 100 + } + offset := (page - 1) * perPage + + var total int64 + var tags []models.Tag + db := database.DB + + switch trashed { + case "none": + db.Model(&models.Tag{}).Count(&total) + db.Preload("Posts").Order("id desc").Limit(perPage).Offset(offset).Find(&tags) + case "only": + db.Unscoped().Model(&models.Tag{}).Where("deleted_at IS NOT NULL").Count(&total) + db.Unscoped().Preload("Posts").Where("deleted_at IS NOT NULL").Order("deleted_at desc").Limit(perPage).Offset(offset).Find(&tags) + case "with": + db.Unscoped().Model(&models.Tag{}).Count(&total) + db.Unscoped().Preload("Posts").Order("id desc").Limit(perPage).Offset(offset).Find(&tags) + } + + return c.JSON(fiber.Map{"data": tags, "meta": fiber.Map{"page": page, "per_page": perPage, "total": total}}) +} + +func HardDeleteTag(c fiber.Ctx) error { + if database.DB == nil { + return c.Status(http.StatusServiceUnavailable).JSON(fiber.Map{"error": "database is not configured"}) + } + + id, err := strconv.ParseUint(c.Params("id"), 10, 64) + if err != nil || id == 0 { + return c.Status(http.StatusBadRequest).JSON(fiber.Map{"error": "invalid tag id"}) + } + + var tag models.Tag + if err := database.DB.Unscoped().First(&tag, id).Error; err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + return c.Status(http.StatusNotFound).JSON(fiber.Map{"error": "tag not found"}) + } + return c.Status(http.StatusInternalServerError).JSON(fiber.Map{"error": "database error"}) + } + + err = database.DB.Transaction(func(tx *gorm.DB) error { + // clear many2many association + if err := tx.Model(&tag).Association("Posts").Clear(); err != nil { + return err + } + return tx.Unscoped().Delete(&tag).Error + }) + if err != nil { + return c.Status(http.StatusInternalServerError).JSON(fiber.Map{"error": "tag hard-delete failed"}) + } + + return c.JSON(fiber.Map{"message": "tag permanently deleted", "tag_id": id}) +} + +func AdminRestoreTag(c fiber.Ctx) error { + if database.DB == nil { + return c.Status(http.StatusServiceUnavailable).JSON(fiber.Map{"error": "database is not configured"}) + } + + id, err := strconv.ParseUint(c.Params("id"), 10, 64) + if err != nil || id == 0 { + return c.Status(http.StatusBadRequest).JSON(fiber.Map{"error": "invalid tag id"}) + } + + var tag models.Tag + if err := database.DB.Unscoped().First(&tag, id).Error; err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + return c.Status(http.StatusNotFound).JSON(fiber.Map{"error": "tag not found"}) + } + return c.Status(http.StatusInternalServerError).JSON(fiber.Map{"error": "database error"}) + } + + if !tag.DeletedAt.Valid { + return c.Status(http.StatusBadRequest).JSON(fiber.Map{"error": "tag is not soft-deleted"}) + } + + if err := database.DB.Unscoped().Model(&models.Tag{}).Where("id = ?", id).Update("deleted_at", nil).Error; err != nil { + return c.Status(http.StatusInternalServerError).JSON(fiber.Map{"error": "tag could not be restored"}) + } + + return c.JSON(fiber.Map{"message": "tag restored successfully", "tag_id": id}) +} + +func AdminListCategoryViews(c fiber.Ctx) error { + trashed := c.Query("trashed", "none") + if trashed != "none" && trashed != "only" && trashed != "with" { + return c.Status(http.StatusBadRequest).JSON(fiber.Map{"error": "invalid trashed parameter, must be one of: none, only, with"}) + } + + pageStr := c.Query("page", "1") + perPageStr := c.Query("per_page", "10") + page, _ := strconv.Atoi(pageStr) + perPage, _ := strconv.Atoi(perPageStr) + if page < 1 { + page = 1 + } + if perPage < 1 { + perPage = 10 + } + if perPage > 100 { + perPage = 100 + } + offset := (page - 1) * perPage + + var total int64 + var cvs []models.CategoryView + db := database.DB + + switch trashed { + case "none": + db.Model(&models.CategoryView{}).Count(&total) + db.Order("id desc").Limit(perPage).Offset(offset).Find(&cvs) + case "only": + db.Unscoped().Model(&models.CategoryView{}).Where("deleted_at IS NOT NULL").Count(&total) + db.Unscoped().Where("deleted_at IS NOT NULL").Order("deleted_at desc").Limit(perPage).Offset(offset).Find(&cvs) + case "with": + db.Unscoped().Model(&models.CategoryView{}).Count(&total) + db.Unscoped().Order("id desc").Limit(perPage).Offset(offset).Find(&cvs) + } + + return c.JSON(fiber.Map{"data": cvs, "meta": fiber.Map{"page": page, "per_page": perPage, "total": total}}) +} + +func HardDeleteCategoryView(c fiber.Ctx) error { + if database.DB == nil { + return c.Status(http.StatusServiceUnavailable).JSON(fiber.Map{"error": "database is not configured"}) + } + + id, err := strconv.ParseUint(c.Params("id"), 10, 64) + if err != nil || id == 0 { + return c.Status(http.StatusBadRequest).JSON(fiber.Map{"error": "invalid id"}) + } + + var cv models.CategoryView + if err := database.DB.Unscoped().First(&cv, id).Error; err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + return c.Status(http.StatusNotFound).JSON(fiber.Map{"error": "category view not found"}) + } + return c.Status(http.StatusInternalServerError).JSON(fiber.Map{"error": "database error"}) + } + + if err := database.DB.Unscoped().Delete(&cv).Error; err != nil { + return c.Status(http.StatusInternalServerError).JSON(fiber.Map{"error": "category view hard-delete failed"}) + } + + return c.JSON(fiber.Map{"message": "category view permanently deleted", "id": id}) +} + +func AdminRestoreCategoryView(c fiber.Ctx) error { + if database.DB == nil { + return c.Status(http.StatusServiceUnavailable).JSON(fiber.Map{"error": "database is not configured"}) + } + + id, err := strconv.ParseUint(c.Params("id"), 10, 64) + if err != nil || id == 0 { + return c.Status(http.StatusBadRequest).JSON(fiber.Map{"error": "invalid id"}) + } + + var cv models.CategoryView + if err := database.DB.Unscoped().First(&cv, id).Error; err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + return c.Status(http.StatusNotFound).JSON(fiber.Map{"error": "category view not found"}) + } + return c.Status(http.StatusInternalServerError).JSON(fiber.Map{"error": "database error"}) + } + + if !cv.DeletedAt.Valid { + return c.Status(http.StatusBadRequest).JSON(fiber.Map{"error": "category view is not soft-deleted"}) + } + + if err := database.DB.Unscoped().Model(&models.CategoryView{}).Where("id = ?", id).Update("deleted_at", nil).Error; err != nil { + return c.Status(http.StatusInternalServerError).JSON(fiber.Map{"error": "category view could not be restored"}) + } + + return c.JSON(fiber.Map{"message": "category view restored successfully", "id": id}) +} + +// -------- COMMENTS -------- + +// CreateComment godoc +// @Summary Create comment (public) +// @Tags Comments +// @Accept json +// @Produce json +// @Param data body object true "Comment payload" +// @Success 201 {object} models.CommentDoc +// @Failure 400 {object} map[string]string +// @Router /api/v1/comments [post] +func CreateComment(c fiber.Ctx) error { + var input struct { + UserID uint `json:"user_id" validate:"required"` + PostID uint `json:"post_id" validate:"required"` + Body string `json:"body" validate:"required,min=1"` + } + if err := c.Bind().Body(&input); err != nil { + return c.Status(http.StatusBadRequest).JSON(fiber.Map{"error": "invalid body"}) + } + if err := validate.Struct(input); err != nil { + return c.Status(http.StatusBadRequest).JSON(fiber.Map{"error": err.Error()}) + } + cm := models.Comment{UserID: input.UserID, PostID: input.PostID, Body: input.Body} + if err := database.DB.Create(&cm).Error; err != nil { + return c.Status(http.StatusInternalServerError).JSON(fiber.Map{"error": "could not create comment"}) + } + return c.Status(http.StatusCreated).JSON(cm) +} + +// ListComments godoc +// @Summary List comments for a post (public) +// @Tags Comments +// @Produce json +// @Param post_id query int true "Post ID" +// @Success 200 {array} models.CommentDoc +// @Router /api/v1/comments [get] +func ListComments(c fiber.Ctx) error { + postIDStr := c.Query("post_id") + if postIDStr == "" { + return c.Status(http.StatusBadRequest).JSON(fiber.Map{"error": "post_id required"}) + } + postID, err := strconv.ParseUint(postIDStr, 10, 64) + if err != nil { + return c.Status(http.StatusBadRequest).JSON(fiber.Map{"error": "invalid post_id"}) + } + var comments []models.Comment + database.DB.Where("post_id = ?", postID).Find(&comments) + return c.JSON(comments) +} + + +func DeleteComment(c fiber.Ctx) error { + id, err := strconv.ParseUint(c.Params("id"), 10, 64) + if err != nil { + return c.Status(http.StatusBadRequest).JSON(fiber.Map{"error": "invalid id"}) + } + var cm models.Comment + if err := database.DB.First(&cm, id).Error; err != nil { + return c.Status(http.StatusNotFound).JSON(fiber.Map{"error": "comment not found"}) + } + if err := database.DB.Delete(&cm).Error; err != nil { + return c.Status(http.StatusInternalServerError).JSON(fiber.Map{"error": "could not delete comment"}) + } + return c.JSON(fiber.Map{"message": "comment deleted"}) +} diff --git a/controllers/hero_controller.go b/controllers/hero_controller.go new file mode 100644 index 0000000..bf9cd3e --- /dev/null +++ b/controllers/hero_controller.go @@ -0,0 +1,164 @@ +package controllers + +import ( + configs "ares/config" + database "ares/database/config" + "ares/database/models" + "fmt" + "net/http" + "os" + "path/filepath" + "strconv" + "time" + + "github.com/gofiber/fiber/v3" +) + +// GetHero godoc +// @Summary Get active hero/banner +// @Tags Hero +// @Produce json +// @Success 200 {object} map[string]interface{} +// @Failure 404 {object} map[string]string +// @Router /api/v1/hero [get] +func GetHero(c fiber.Ctx) error { + var heroes []models.Hero + // Aktif olan tüm hero'ları getir + if err := database.DB.Where("is_active = ?", true).Find(&heroes).Error; err != nil { + return c.Status(http.StatusInternalServerError).JSON(fiber.Map{"error": "database error"}) + } + if len(heroes) == 0 { + return c.Status(http.StatusNotFound).JSON(fiber.Map{"error": "no active hero found"}) + } + return c.JSON(heroes) +} + +// GetHeroAll godoc +// @Summary Get all heroes +// @Description Returns all hero/banner records (no filter) +// @Tags Hero +// @Produce json +// @Success 200 {array} map[string]interface{} +// @Failure 404 {object} map[string]string +// @Router /api/v1/heroes [get] +func GetHeroAll(c fiber.Ctx) error { + var heroes []models.Hero + // Tüm hero'ları getir (filtre yok) + if err := database.DB.Find(&heroes).Error; err != nil { + return c.Status(http.StatusInternalServerError).JSON(fiber.Map{"error": "database error"}) + } + if len(heroes) == 0 { + return c.Status(http.StatusNotFound).JSON(fiber.Map{"error": "no hero found"}) + } + return c.JSON(heroes) +} + +func CreateHero(c fiber.Ctx) error { + var hero models.Hero + if err := c.Bind().Body(&hero); err != nil { + return c.Status(http.StatusBadRequest).JSON(fiber.Map{"error": "invalid request body"}) + } + + // Image upload + file, err := c.FormFile("image") + if err == nil { + if _, err := os.Stat("./uploads/heroes"); os.IsNotExist(err) { + os.MkdirAll("./uploads/heroes", 0755) + } + filename := fmt.Sprintf("%d_%s", time.Now().Unix(), file.Filename) + filePath := filepath.Join("./uploads/heroes", filename) + if err := c.SaveFile(file, filePath); err != nil { + return c.Status(http.StatusInternalServerError).JSON(fiber.Map{"error": "failed to save image"}) + } + hero.Image = "/uploads/heroes/" + filename + } + + // Eğer sadece bir aktif hero olacaksa, diğerlerini pasife çekebiliriz + //if hero.IsActive { + // database.DB.Model(&models.Hero{}).Where("is_active = ?", true).Update("is_active", false) + //} + + if err := database.DB.Create(&hero).Error; err != nil { + return c.Status(http.StatusInternalServerError).JSON(fiber.Map{"error": "hero could not be created"}) + } + + return c.Status(http.StatusCreated).JSON(hero) +} + +func UpdateHero(c fiber.Ctx) error { + id, err := strconv.ParseUint(c.Params("id"), 10, 64) + if err != nil { + return c.Status(http.StatusBadRequest).JSON(fiber.Map{"error": "invalid id"}) + } + + var hero models.Hero + if err := database.DB.First(&hero, id).Error; err != nil { + return c.Status(http.StatusNotFound).JSON(fiber.Map{"error": "hero not found"}) + } + + // Log raw request body (works for JSON). For multipart/form-data, also log form values. + //log.Printf("Raw request body: %s\n", string(c.Body())) + //log.Printf("Form title: %s, is_active: %s\n", c.FormValue("title"), c.FormValue("is_active")) + + var updateData models.Hero + if err := c.Bind().Body(&updateData); err != nil { + return c.Status(http.StatusBadRequest).JSON(fiber.Map{"error": "invalid request body"}) + } + //log.Printf("Received update data: %+v\n", updateData) // Debug log + // Image upload + file, err := c.FormFile("image") + if err == nil { + if _, err := os.Stat("./uploads/heroes"); os.IsNotExist(err) { + os.MkdirAll("./uploads/heroes", 0755) + } + filename := fmt.Sprintf("%d_%s", time.Now().Unix(), file.Filename) + filePath := filepath.Join("./uploads/heroes", filename) + if err := c.SaveFile(file, filePath); err != nil { + return c.Status(http.StatusInternalServerError).JSON(fiber.Map{"error": "failed to save image"}) + } + updateData.Image = "/uploads/heroes/" + filename + } + + // Eğer bu hero aktif yapılıyorsa diğerlerini pasife çek + //if updateData.IsActive { + // database.DB.Model(&models.Hero{}).Where("id != ?", id).Where("is_active = ?", true).Update("is_active", false) + //} + + // Handle is_active coming from multipart/form-data: parse and update explicitly + if v := c.FormValue("is_active"); v != "" { + if parsed, err := strconv.ParseBool(v); err == nil { + // Ensure boolean field is updated even if it's false (zero value) + if err := database.DB.Model(&hero).Update("is_active", parsed).Error; err != nil { + return c.Status(http.StatusInternalServerError).JSON(fiber.Map{"error": "hero could not be updated"}) + } + // reflect into updateData for consistency + updateData.IsActive = parsed + } else { + configs.Logger.Sugar().Warnf("invalid is_active value: %s", v) + } + } + + if err := database.DB.Model(&hero).Updates(updateData).Error; err != nil { + return c.Status(http.StatusInternalServerError).JSON(fiber.Map{"error": "hero could not be updated"}) + } + + return c.JSON(hero) +} + +func DeleteHero(c fiber.Ctx) error { + id, err := strconv.ParseUint(c.Params("id"), 10, 64) + if err != nil { + return c.Status(http.StatusBadRequest).JSON(fiber.Map{"error": "invalid id"}) + } + + var hero models.Hero + if err := database.DB.First(&hero, id).Error; err != nil { + return c.Status(http.StatusNotFound).JSON(fiber.Map{"error": "hero not found"}) + } + + if err := database.DB.Delete(&hero).Error; err != nil { + return c.Status(http.StatusInternalServerError).JSON(fiber.Map{"error": "hero could not be deleted"}) + } + + return c.JSON(fiber.Map{"message": "hero deleted successfully"}) +} diff --git a/controllers/product_controller.go b/controllers/product_controller.go new file mode 100644 index 0000000..14a352a --- /dev/null +++ b/controllers/product_controller.go @@ -0,0 +1,161 @@ +package controllers + +import ( + database "ares/database/config" + "ares/database/models" + "errors" + "net/http" + "strconv" + + "github.com/gofiber/fiber/v3" + "gorm.io/gorm" +) + +// GetProducts godoc +// @Summary List products (public) with pagination +// @Tags Products +// @Produce json +// @Param page query int false "Page number" +// @Param per_page query int false "Items per page" +// @Success 200 {object} map[string]interface{} +// @Router /api/v1/products [get] +func GetProducts(c fiber.Ctx) error { + pageStr := c.Query("page", "1") + perPageStr := c.Query("per_page", "10") + page, _ := strconv.Atoi(pageStr) + perPage, _ := strconv.Atoi(perPageStr) + if page < 1 { + page = 1 + } + if perPage < 1 { + perPage = 10 + } + if perPage > 100 { + perPage = 100 + } + offset := (page - 1) * perPage + + var total int64 + database.DB.Model(&models.Product{}).Count(&total) + + var products []models.Product + database.DB.Preload("Categories").Preload("Tags").Limit(perPage).Offset(offset).Order("created_at desc").Find(&products) + + return c.JSON(fiber.Map{ + "data": products, + "meta": fiber.Map{"page": page, "per_page": perPage, "total": total}, + }) +} + +// GetProduct godoc +// @Summary Get single product (public) by slug +// @Tags Products +// @Produce json +// @Param slug path string true "Product slug" +// @Success 200 {object} models.ProductDoc +// @Failure 404 {object} map[string]string +// @Router /api/v1/products/{slug} [get] +func GetProduct(c fiber.Ctx) error { + slug := c.Params("slug") + if slug == "" { + return c.Status(http.StatusBadRequest).JSON(fiber.Map{"error": "invalid slug"}) + } + + var product models.Product + if err := database.DB.Preload("Categories").Preload("Tags").Where("slug = ? AND deleted_at IS NULL", slug).First(&product).Error; err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + return c.Status(http.StatusNotFound).JSON(fiber.Map{"error": "product not found"}) + } + return c.Status(http.StatusInternalServerError).JSON(fiber.Map{"error": "db error"}) + } + + return c.JSON(product) +} + +// AddProductCommentRequest represents payload +type AddProductCommentRequest struct { + ProductID uint `json:"product_id" validate:"required"` + Body string `json:"body" validate:"required,min=3"` +} + + +func AddProductComment(c fiber.Ctx) error { + userID, ok := c.Locals("user_id").(uint) + if !ok || userID == 0 { + return c.Status(http.StatusUnauthorized).JSON(fiber.Map{"error": "unauthorized"}) + } + + var input AddProductCommentRequest + if err := c.Bind().Body(&input); err != nil { + return c.Status(http.StatusBadRequest).JSON(fiber.Map{"error": "invalid payload"}) + } + + // Add validation if needed + if input.Body == "" { + return c.Status(http.StatusBadRequest).JSON(fiber.Map{"error": "body is required"}) + } + + var product models.Product + if err := database.DB.First(&product, input.ProductID).Error; err != nil { + return c.Status(http.StatusBadRequest).JSON(fiber.Map{"error": "product not found"}) + } + + comment := models.ProductComment{ + UserID: userID, + ProductID: input.ProductID, + Body: input.Body, + } + + if err := database.DB.Create(&comment).Error; err != nil { + return c.Status(http.StatusInternalServerError).JSON(fiber.Map{"error": "could not save comment"}) + } + + return c.Status(http.StatusCreated).JSON(comment) +} + +// GetProductComments godoc +// @Summary Get comments for a product +// @Tags Products +// @Produce json +// @Param id path int true "Product ID" +// @Success 200 {array} models.ProductCommentDoc +// @Router /api/v1/products/{id}/comments [get] +func GetProductComments(c fiber.Ctx) error { + productID, err := strconv.Atoi(c.Params("id")) + if err != nil { + return c.Status(http.StatusBadRequest).JSON(fiber.Map{"error": "invalid product id"}) + } + + var comments []models.ProductComment + database.DB.Where("product_id = ?", productID).Order("created_at desc").Find(&comments) + + return c.JSON(comments) +} + +// RecordProductCategoryView godoc +// @Summary Record a view for a product category +// @Tags Products +// @Produce json +// @Param id path int true "Category ID" +// @Success 201 {object} models.ProductCategoryViewDoc +// @Router /api/v1/product-categories/{id}/view [post] +func RecordProductCategoryView(c fiber.Ctx) error { + categoryID, err := strconv.Atoi(c.Params("id")) + if err != nil { + return c.Status(http.StatusBadRequest).JSON(fiber.Map{"error": "invalid category id"}) + } + + var category models.ProductCategory + if err := database.DB.First(&category, categoryID).Error; err != nil { + return c.Status(http.StatusBadRequest).JSON(fiber.Map{"error": "category not found"}) + } + + view := models.ProductCategoryView{ + CategoryID: uint(categoryID), + IPAddress: c.IP(), + } + + database.DB.Create(&view) + + return c.Status(http.StatusCreated).JSON(view) +} diff --git a/controllers/security_controller.go b/controllers/security_controller.go new file mode 100644 index 0000000..c590ac9 --- /dev/null +++ b/controllers/security_controller.go @@ -0,0 +1,419 @@ +package controllers + +import ( + configs "ares/config" + database "ares/database/config" + "ares/database/models" + "ares/middlewares" + "encoding/json" + "errors" + "net/http" + "strconv" + "strings" + + "github.com/gofiber/fiber/v3" + "github.com/redis/go-redis/v9" + "gorm.io/gorm" +) + +const ( + corsWhitelistCacheKey = "admin:cors:whitelist:list" + corsBlacklistCacheKey = "admin:cors:blacklist:list" + rateLimitCacheKey = "admin:rate_limit:list" + securityCacheTTL = 60 +) + +type CorsWhitelistRequest struct { + Origin string `json:"origin" validate:"required"` + Description string `json:"description"` + IsActive *bool `json:"is_active"` +} + +type CorsBlacklistRequest struct { + Origin string `json:"origin" validate:"required"` + Reason string `json:"reason"` + IsActive *bool `json:"is_active"` +} + +type RateLimitSettingRequest struct { + Name string `json:"name" validate:"required"` + Description string `json:"description"` + MaxRequests int64 `json:"max_requests" validate:"required,min=1"` + WindowSeconds int `json:"window_seconds" validate:"required,min=1"` + IsActive *bool `json:"is_active"` +} + +func ListCorsWhitelists(c fiber.Ctx) error { + if database.DB == nil { + return c.Status(http.StatusServiceUnavailable).JSON(fiber.Map{"error": "database is not configured"}) + } + + var items []models.CorsWhitelist + if cached, err := database.Get(corsWhitelistCacheKey); err == nil { + if unmarshalErr := json.Unmarshal([]byte(cached), &items); unmarshalErr == nil { + securityLogf("[security][cors-whitelist][cache-hit] count=%d", len(items)) + return c.JSON(fiber.Map{"count": len(items), "items": items}) + } + } else if !errors.Is(err, redis.Nil) { + return c.Status(http.StatusInternalServerError).JSON(fiber.Map{"error": "cache read error"}) + } + + if err := database.DB.Order("id DESC").Find(&items).Error; err != nil { + return c.Status(http.StatusInternalServerError).JSON(fiber.Map{"error": "database error"}) + } + + cacheJSON, _ := json.Marshal(items) + _ = database.SetEx(corsWhitelistCacheKey, string(cacheJSON), securityCacheTTL) + securityLogf("[security][cors-whitelist][db-load] count=%d", len(items)) + + return c.JSON(fiber.Map{"count": len(items), "items": items}) +} + +func CreateCorsWhitelist(c fiber.Ctx) error { + var req CorsWhitelistRequest + if err := c.Bind().JSON(&req); err != nil { + return c.Status(http.StatusBadRequest).JSON(fiber.Map{"error": "invalid request body"}) + } + if err := validate.Struct(req); err != nil { + return c.Status(http.StatusBadRequest).JSON(fiber.Map{"error": err.Error()}) + } + + item := models.CorsWhitelist{ + Origin: strings.TrimSpace(req.Origin), + Description: strings.TrimSpace(req.Description), + IsActive: boolValue(req.IsActive, true), + CreatedBy: currentActor(c), + } + if err := database.DB.Create(&item).Error; err != nil { + return c.Status(http.StatusBadRequest).JSON(fiber.Map{"error": "record could not be created"}) + } + invalidateSecurityCaches() + securityLogf("[security][cors-whitelist][create] origin=%s by=%s", item.Origin, item.CreatedBy) + return c.Status(http.StatusCreated).JSON(fiber.Map{"item": item}) +} + +func UpdateCorsWhitelist(c fiber.Ctx) error { + id, err := parseID(c.Params("id")) + if err != nil { + return c.Status(http.StatusBadRequest).JSON(fiber.Map{"error": "invalid id"}) + } + + var req CorsWhitelistRequest + if err := c.Bind().JSON(&req); err != nil { + return c.Status(http.StatusBadRequest).JSON(fiber.Map{"error": "invalid request body"}) + } + if err := validate.Struct(req); err != nil { + return c.Status(http.StatusBadRequest).JSON(fiber.Map{"error": err.Error()}) + } + + var item models.CorsWhitelist + if err := database.DB.First(&item, id).Error; err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + return c.Status(http.StatusNotFound).JSON(fiber.Map{"error": "record not found"}) + } + return c.Status(http.StatusInternalServerError).JSON(fiber.Map{"error": "database error"}) + } + + item.Origin = strings.TrimSpace(req.Origin) + item.Description = strings.TrimSpace(req.Description) + item.IsActive = boolValue(req.IsActive, item.IsActive) + item.CreatedBy = currentActor(c) + if err := database.DB.Save(&item).Error; err != nil { + return c.Status(http.StatusInternalServerError).JSON(fiber.Map{"error": "record could not be updated"}) + } + invalidateSecurityCaches() + securityLogf("[security][cors-whitelist][update] id=%d origin=%s by=%s", item.ID, item.Origin, item.CreatedBy) + return c.JSON(fiber.Map{"item": item}) +} + +func DeleteCorsWhitelist(c fiber.Ctx) error { + id, err := parseID(c.Params("id")) + if err != nil { + return c.Status(http.StatusBadRequest).JSON(fiber.Map{"error": "invalid id"}) + } + + if err := database.DB.Delete(&models.CorsWhitelist{}, id).Error; err != nil { + return c.Status(http.StatusInternalServerError).JSON(fiber.Map{"error": "record could not be deleted"}) + } + invalidateSecurityCaches() + securityLogf("[security][cors-whitelist][soft-delete] id=%d by=%s", id, currentActor(c)) + return c.JSON(fiber.Map{"message": "soft deleted", "id": id}) +} + +func HardDeleteCorsWhitelist(c fiber.Ctx) error { + id, err := parseID(c.Params("id")) + if err != nil { + return c.Status(http.StatusBadRequest).JSON(fiber.Map{"error": "invalid id"}) + } + + if err := database.DB.Unscoped().Delete(&models.CorsWhitelist{}, id).Error; err != nil { + return c.Status(http.StatusInternalServerError).JSON(fiber.Map{"error": "record could not be hard-deleted"}) + } + invalidateSecurityCaches() + securityLogf("[security][cors-whitelist][hard-delete] id=%d by=%s", id, currentActor(c)) + return c.JSON(fiber.Map{"message": "hard deleted", "id": id}) +} + +func ListCorsBlacklists(c fiber.Ctx) error { + if database.DB == nil { + return c.Status(http.StatusServiceUnavailable).JSON(fiber.Map{"error": "database is not configured"}) + } + + var items []models.CorsBlacklist + if cached, err := database.Get(corsBlacklistCacheKey); err == nil { + if unmarshalErr := json.Unmarshal([]byte(cached), &items); unmarshalErr == nil { + securityLogf("[security][cors-blacklist][cache-hit] count=%d", len(items)) + return c.JSON(fiber.Map{"count": len(items), "items": items}) + } + } else if !errors.Is(err, redis.Nil) { + return c.Status(http.StatusInternalServerError).JSON(fiber.Map{"error": "cache read error"}) + } + + if err := database.DB.Order("id DESC").Find(&items).Error; err != nil { + return c.Status(http.StatusInternalServerError).JSON(fiber.Map{"error": "database error"}) + } + + cacheJSON, _ := json.Marshal(items) + _ = database.SetEx(corsBlacklistCacheKey, string(cacheJSON), securityCacheTTL) + securityLogf("[security][cors-blacklist][db-load] count=%d", len(items)) + + return c.JSON(fiber.Map{"count": len(items), "items": items}) +} + +func CreateCorsBlacklist(c fiber.Ctx) error { + var req CorsBlacklistRequest + if err := c.Bind().JSON(&req); err != nil { + return c.Status(http.StatusBadRequest).JSON(fiber.Map{"error": "invalid request body"}) + } + if err := validate.Struct(req); err != nil { + return c.Status(http.StatusBadRequest).JSON(fiber.Map{"error": err.Error()}) + } + + item := models.CorsBlacklist{ + Origin: strings.TrimSpace(req.Origin), + Reason: strings.TrimSpace(req.Reason), + IsActive: boolValue(req.IsActive, true), + CreatedBy: currentActor(c), + } + if err := database.DB.Create(&item).Error; err != nil { + return c.Status(http.StatusBadRequest).JSON(fiber.Map{"error": "record could not be created"}) + } + invalidateSecurityCaches() + securityLogf("[security][cors-blacklist][create] origin=%s by=%s", item.Origin, item.CreatedBy) + return c.Status(http.StatusCreated).JSON(fiber.Map{"item": item}) +} + +func UpdateCorsBlacklist(c fiber.Ctx) error { + id, err := parseID(c.Params("id")) + if err != nil { + return c.Status(http.StatusBadRequest).JSON(fiber.Map{"error": "invalid id"}) + } + + var req CorsBlacklistRequest + if err := c.Bind().JSON(&req); err != nil { + return c.Status(http.StatusBadRequest).JSON(fiber.Map{"error": "invalid request body"}) + } + if err := validate.Struct(req); err != nil { + return c.Status(http.StatusBadRequest).JSON(fiber.Map{"error": err.Error()}) + } + + var item models.CorsBlacklist + if err := database.DB.First(&item, id).Error; err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + return c.Status(http.StatusNotFound).JSON(fiber.Map{"error": "record not found"}) + } + return c.Status(http.StatusInternalServerError).JSON(fiber.Map{"error": "database error"}) + } + + item.Origin = strings.TrimSpace(req.Origin) + item.Reason = strings.TrimSpace(req.Reason) + item.IsActive = boolValue(req.IsActive, item.IsActive) + item.CreatedBy = currentActor(c) + if err := database.DB.Save(&item).Error; err != nil { + return c.Status(http.StatusInternalServerError).JSON(fiber.Map{"error": "record could not be updated"}) + } + invalidateSecurityCaches() + securityLogf("[security][cors-blacklist][update] id=%d origin=%s by=%s", item.ID, item.Origin, item.CreatedBy) + return c.JSON(fiber.Map{"item": item}) +} + +func DeleteCorsBlacklist(c fiber.Ctx) error { + id, err := parseID(c.Params("id")) + if err != nil { + return c.Status(http.StatusBadRequest).JSON(fiber.Map{"error": "invalid id"}) + } + + if err := database.DB.Delete(&models.CorsBlacklist{}, id).Error; err != nil { + return c.Status(http.StatusInternalServerError).JSON(fiber.Map{"error": "record could not be deleted"}) + } + invalidateSecurityCaches() + securityLogf("[security][cors-blacklist][soft-delete] id=%d by=%s", id, currentActor(c)) + return c.JSON(fiber.Map{"message": "soft deleted", "id": id}) +} + +func HardDeleteCorsBlacklist(c fiber.Ctx) error { + id, err := parseID(c.Params("id")) + if err != nil { + return c.Status(http.StatusBadRequest).JSON(fiber.Map{"error": "invalid id"}) + } + + if err := database.DB.Unscoped().Delete(&models.CorsBlacklist{}, id).Error; err != nil { + return c.Status(http.StatusInternalServerError).JSON(fiber.Map{"error": "record could not be hard-deleted"}) + } + invalidateSecurityCaches() + securityLogf("[security][cors-blacklist][hard-delete] id=%d by=%s", id, currentActor(c)) + return c.JSON(fiber.Map{"message": "hard deleted", "id": id}) +} + +func ListRateLimitSettings(c fiber.Ctx) error { + if database.DB == nil { + return c.Status(http.StatusServiceUnavailable).JSON(fiber.Map{"error": "database is not configured"}) + } + + var items []models.RateLimitSetting + if cached, err := database.Get(rateLimitCacheKey); err == nil { + if unmarshalErr := json.Unmarshal([]byte(cached), &items); unmarshalErr == nil { + securityLogf("[security][rate-limit][cache-hit] count=%d", len(items)) + return c.JSON(fiber.Map{"count": len(items), "items": items}) + } + } else if !errors.Is(err, redis.Nil) { + return c.Status(http.StatusInternalServerError).JSON(fiber.Map{"error": "cache read error"}) + } + + if err := database.DB.Order("id DESC").Find(&items).Error; err != nil { + return c.Status(http.StatusInternalServerError).JSON(fiber.Map{"error": "database error"}) + } + + cacheJSON, _ := json.Marshal(items) + _ = database.SetEx(rateLimitCacheKey, string(cacheJSON), securityCacheTTL) + securityLogf("[security][rate-limit][db-load] count=%d", len(items)) + + return c.JSON(fiber.Map{"count": len(items), "items": items}) +} + +func CreateRateLimitSetting(c fiber.Ctx) error { + var req RateLimitSettingRequest + if err := c.Bind().JSON(&req); err != nil { + return c.Status(http.StatusBadRequest).JSON(fiber.Map{"error": "invalid request body"}) + } + if err := validate.Struct(req); err != nil { + return c.Status(http.StatusBadRequest).JSON(fiber.Map{"error": err.Error()}) + } + + item := models.RateLimitSetting{ + Name: strings.TrimSpace(req.Name), + Description: strings.TrimSpace(req.Description), + MaxRequests: req.MaxRequests, + WindowSeconds: req.WindowSeconds, + IsActive: boolValue(req.IsActive, true), + UpdatedBy: currentActor(c), + } + if err := database.DB.Create(&item).Error; err != nil { + return c.Status(http.StatusBadRequest).JSON(fiber.Map{"error": "record could not be created"}) + } + invalidateSecurityCaches() + securityLogf("[security][rate-limit][create] name=%s max=%d window=%ds by=%s", item.Name, item.MaxRequests, item.WindowSeconds, item.UpdatedBy) + return c.Status(http.StatusCreated).JSON(fiber.Map{"item": item}) +} + +func UpdateRateLimitSetting(c fiber.Ctx) error { + id, err := parseID(c.Params("id")) + if err != nil { + return c.Status(http.StatusBadRequest).JSON(fiber.Map{"error": "invalid id"}) + } + + var req RateLimitSettingRequest + if err := c.Bind().JSON(&req); err != nil { + return c.Status(http.StatusBadRequest).JSON(fiber.Map{"error": "invalid request body"}) + } + if err := validate.Struct(req); err != nil { + return c.Status(http.StatusBadRequest).JSON(fiber.Map{"error": err.Error()}) + } + + var item models.RateLimitSetting + if err := database.DB.First(&item, id).Error; err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + return c.Status(http.StatusNotFound).JSON(fiber.Map{"error": "record not found"}) + } + return c.Status(http.StatusInternalServerError).JSON(fiber.Map{"error": "database error"}) + } + + item.Name = strings.TrimSpace(req.Name) + item.Description = strings.TrimSpace(req.Description) + item.MaxRequests = req.MaxRequests + item.WindowSeconds = req.WindowSeconds + item.IsActive = boolValue(req.IsActive, item.IsActive) + item.UpdatedBy = currentActor(c) + if err := database.DB.Save(&item).Error; err != nil { + return c.Status(http.StatusInternalServerError).JSON(fiber.Map{"error": "record could not be updated"}) + } + invalidateSecurityCaches() + securityLogf("[security][rate-limit][update] id=%d name=%s max=%d window=%ds by=%s", item.ID, item.Name, item.MaxRequests, item.WindowSeconds, item.UpdatedBy) + return c.JSON(fiber.Map{"item": item}) +} + +func DeleteRateLimitSetting(c fiber.Ctx) error { + id, err := parseID(c.Params("id")) + if err != nil { + return c.Status(http.StatusBadRequest).JSON(fiber.Map{"error": "invalid id"}) + } + + if err := database.DB.Delete(&models.RateLimitSetting{}, id).Error; err != nil { + return c.Status(http.StatusInternalServerError).JSON(fiber.Map{"error": "record could not be deleted"}) + } + invalidateSecurityCaches() + securityLogf("[security][rate-limit][soft-delete] id=%d by=%s", id, currentActor(c)) + return c.JSON(fiber.Map{"message": "soft deleted", "id": id}) +} + +func HardDeleteRateLimitSetting(c fiber.Ctx) error { + id, err := parseID(c.Params("id")) + if err != nil { + return c.Status(http.StatusBadRequest).JSON(fiber.Map{"error": "invalid id"}) + } + + if err := database.DB.Unscoped().Delete(&models.RateLimitSetting{}, id).Error; err != nil { + return c.Status(http.StatusInternalServerError).JSON(fiber.Map{"error": "record could not be hard-deleted"}) + } + invalidateSecurityCaches() + securityLogf("[security][rate-limit][hard-delete] id=%d by=%s", id, currentActor(c)) + return c.JSON(fiber.Map{"message": "hard deleted", "id": id}) +} + +func parseID(param string) (uint, error) { + v, err := strconv.ParseUint(strings.TrimSpace(param), 10, 64) + if err != nil || v == 0 { + return 0, errors.New("invalid id") + } + return uint(v), nil +} + +func invalidateSecurityCaches() { + _ = database.Delete(corsWhitelistCacheKey) + _ = database.Delete(corsBlacklistCacheKey) + _ = database.Delete(rateLimitCacheKey) + _ = database.Delete("cors:active:whitelist") + _ = database.Delete("cors:active:blacklist") +} + +func currentActor(c fiber.Ctx) string { + if claims, ok := middlewares.GetAuthClaims(c); ok && strings.TrimSpace(claims.Email) != "" { + return claims.Email + } + return "system" +} + +func boolValue(v *bool, fallback bool) bool { + if v == nil { + return fallback + } + return *v +} + +func securityLogf(format string, args ...interface{}) { + if configs.AppConfig != nil && configs.AppConfig.CorsDebug { + if configs.Logger != nil { + configs.Logger.Sugar().Infof(format, args...) + } + } +} diff --git a/controllers/setting_controller.go b/controllers/setting_controller.go new file mode 100644 index 0000000..bba37ce --- /dev/null +++ b/controllers/setting_controller.go @@ -0,0 +1,150 @@ +package controllers + +import ( + database "ares/database/config" + "ares/database/models" + "fmt" + "net/http" + "os" + "path/filepath" + "strconv" + "time" + + "github.com/gofiber/fiber/v3" + "gorm.io/gorm" +) + +// GetSetting godoc +// @Summary Get site settings +// @Tags Setting +// @Produce json +// @Success 200 {object} map[string]interface{} +// @Failure 404 {object} map[string]string +// @Router /api/v1/setting [get] +func GetSetting(c fiber.Ctx) error { + var setting models.Setting + // Arkaplanda tek bir aktif ayar varsayıyoruz veya en son ekleneni/güncelleneni + if err := database.DB.Where("is_active = ?", true).Last(&setting).Error; err != nil { + if err == gorm.ErrRecordNotFound { + return c.Status(http.StatusNotFound).JSON(fiber.Map{"error": "no active setting found"}) + } + return c.Status(http.StatusInternalServerError).JSON(fiber.Map{"error": "database error"}) + } + return c.JSON(setting) +} + +func CreateSetting(c fiber.Ctx) error { + var setting models.Setting + if err := c.Bind().Body(&setting); err != nil { + return c.Status(http.StatusBadRequest).JSON(fiber.Map{"error": "invalid request body"}) + } + + // White Logo upload + if file, err := c.FormFile("w_logo"); err == nil { + if _, err := os.Stat("./uploads/settings"); os.IsNotExist(err) { + os.MkdirAll("./uploads/settings", 0755) + } + filename := fmt.Sprintf("w_%d_%s", time.Now().Unix(), file.Filename) + filePath := filepath.Join("./uploads/settings", filename) + if err := c.SaveFile(file, filePath); err != nil { + return c.Status(http.StatusInternalServerError).JSON(fiber.Map{"error": "failed to save w_logo"}) + } + setting.WLogo = "/uploads/settings/" + filename + } + + // Black Logo upload + if file, err := c.FormFile("b_logo"); err == nil { + if _, err := os.Stat("./uploads/settings"); os.IsNotExist(err) { + os.MkdirAll("./uploads/settings", 0755) + } + filename := fmt.Sprintf("b_%d_%s", time.Now().Unix(), file.Filename) + filePath := filepath.Join("./uploads/settings", filename) + if err := c.SaveFile(file, filePath); err != nil { + return c.Status(http.StatusInternalServerError).JSON(fiber.Map{"error": "failed to save b_logo"}) + } + setting.BLogo = "/uploads/settings/" + filename + } + + // Eğer sadece bir aktif ayar olacaksa, diğerlerini pasife çekebiliriz + if setting.IsActive { + database.DB.Model(&models.Setting{}).Where("is_active = ?", true).Update("is_active", false) + } + + if err := database.DB.Create(&setting).Error; err != nil { + return c.Status(http.StatusInternalServerError).JSON(fiber.Map{"error": "setting could not be created"}) + } + + return c.Status(http.StatusCreated).JSON(setting) +} + +func UpdateSetting(c fiber.Ctx) error { + id, err := strconv.ParseUint(c.Params("id"), 10, 64) + if err != nil { + return c.Status(http.StatusBadRequest).JSON(fiber.Map{"error": "invalid id"}) + } + + var setting models.Setting + if err := database.DB.First(&setting, id).Error; err != nil { + return c.Status(http.StatusNotFound).JSON(fiber.Map{"error": "setting not found"}) + } + + var updateData models.Setting + if err := c.Bind().Body(&updateData); err != nil { + return c.Status(http.StatusBadRequest).JSON(fiber.Map{"error": "invalid request body"}) + } + + // White Logo upload + if file, err := c.FormFile("w_logo"); err == nil { + if _, err := os.Stat("./uploads/settings"); os.IsNotExist(err) { + os.MkdirAll("./uploads/settings", 0755) + } + filename := fmt.Sprintf("w_%d_%s", time.Now().Unix(), file.Filename) + filePath := filepath.Join("./uploads/settings", filename) + if err := c.SaveFile(file, filePath); err != nil { + return c.Status(http.StatusInternalServerError).JSON(fiber.Map{"error": "failed to save w_logo"}) + } + updateData.WLogo = "/uploads/settings/" + filename + } + + // Black Logo upload + if file, err := c.FormFile("b_logo"); err == nil { + if _, err := os.Stat("./uploads/settings"); os.IsNotExist(err) { + os.MkdirAll("./uploads/settings", 0755) + } + filename := fmt.Sprintf("b_%d_%s", time.Now().Unix(), file.Filename) + filePath := filepath.Join("./uploads/settings", filename) + if err := c.SaveFile(file, filePath); err != nil { + return c.Status(http.StatusInternalServerError).JSON(fiber.Map{"error": "failed to save b_logo"}) + } + updateData.BLogo = "/uploads/settings/" + filename + } + + // Eğer bu ayar aktif yapılıyorsa diğerlerini pasife çek + if updateData.IsActive { + database.DB.Model(&models.Setting{}).Where("id != ?", id).Where("is_active = ?", true).Update("is_active", false) + } + + if err := database.DB.Model(&setting).Updates(updateData).Error; err != nil { + return c.Status(http.StatusInternalServerError).JSON(fiber.Map{"error": "setting could not be updated"}) + } + + return c.JSON(setting) +} + +func DeleteSetting(c fiber.Ctx) error { + id, err := strconv.ParseUint(c.Params("id"), 10, 64) + if err != nil { + return c.Status(http.StatusBadRequest).JSON(fiber.Map{"error": "invalid id"}) + } + + var setting models.Setting + if err := database.DB.First(&setting, id).Error; err != nil { + return c.Status(http.StatusNotFound).JSON(fiber.Map{"error": "setting not found"}) + } + + if err := database.DB.Delete(&setting).Error; err != nil { + return c.Status(http.StatusInternalServerError).JSON(fiber.Map{"error": "setting could not be deleted"}) + } + + return c.JSON(fiber.Map{"message": "setting deleted successfully"}) +} diff --git a/controllers/user.go b/controllers/user.go new file mode 100644 index 0000000..8bf35ad --- /dev/null +++ b/controllers/user.go @@ -0,0 +1,798 @@ +package controllers + +import ( + configs "ares/config" + database "ares/database/config" + "ares/database/models" + "ares/middlewares" + utils "ares/pkg/utis" + "ares/services" + "encoding/json" + "errors" + "fmt" + "net/http" + "net/url" + "os" + "path/filepath" + "strconv" + "strings" + "time" + + "github.com/go-playground/validator/v10" + "github.com/gofiber/fiber/v3" + "golang.org/x/crypto/bcrypt" + "gorm.io/gorm" +) + +var validate = validator.New() + +type RegisterRequest struct { + UserName string `json:"username" validate:"required,min=3"` + Email string `json:"email" validate:"required,email"` + Password string `json:"password" validate:"required,min=6"` + FirstName string `json:"first_name" validate:"required"` + LastName string `json:"last_name" validate:"required"` +} + +type LoginRequest struct { + Email string `json:"email" validate:"required,email"` + Password string `json:"password" validate:"required"` +} + +type RefreshRequest struct { + RefreshToken string `json:"refresh_token" validate:"required"` +} + +type ResendVerificationRequest struct { + Email string `json:"email" validate:"required,email"` +} + +// UpdateUserRequest represents allowed fields for updating a user +type UpdateUserRequest struct { + UserName string `json:"username,omitempty" example:"jdoe"` + Email string `json:"email,omitempty" example:"jdoe@example.com"` + IsAdmin *bool `json:"is_admin,omitempty" example:"false"` + Password string `json:"password,omitempty" example:"#secret"` + FirstName string `json:"first_name,omitempty" example:"John"` + LastName string `json:"last_name,omitempty" example:"Doe"` + AvatarURL string `json:"avatar_url,omitempty" example:"/uploads/avatar.jpg"` + EmailVerified *bool `json:"email_verified,omitempty" example:"true"` + // Accept avatar file via multipart/form-data with field name "avatar" when using form upload +} + +func GetUser(c fiber.Ctx) error { + return c.Status(fiber.StatusOK).SendString("Get User") +} + +func AdminListUsers(c fiber.Ctx) error { + if database.DB == nil { + return c.Status(http.StatusServiceUnavailable).JSON(fiber.Map{"error": "database is not configured"}) + } + + var users []models.User + if err := database.DB.Preload("Profile").Order("id DESC").Find(&users).Error; err != nil { + return c.Status(http.StatusInternalServerError).JSON(fiber.Map{"error": "database error"}) + } + + return c.JSON(fiber.Map{ + "count": len(users), + "users": users, + }) +} + +func AdminListDeletedUsers(c fiber.Ctx) error { + if database.DB == nil { + return c.Status(http.StatusServiceUnavailable).JSON(fiber.Map{"error": "database is not configured"}) + } + + var users []models.User + if err := database.DB.Unscoped(). + Preload("Profile"). + Where("deleted_at IS NOT NULL"). + Order("deleted_at DESC"). + Find(&users).Error; err != nil { + return c.Status(http.StatusInternalServerError).JSON(fiber.Map{"error": "database error"}) + } + + return c.JSON(fiber.Map{ + "count": len(users), + "users": users, + }) +} + +func GetUserOne(c fiber.Ctx) error { + return c.Status(fiber.StatusOK).SendString("Get User One") +} + +func UpdateUser(c fiber.Ctx) error { + if database.DB == nil { + return c.Status(http.StatusServiceUnavailable).JSON(fiber.Map{"error": "database is not configured"}) + } + + id, err := strconv.ParseUint(c.Params("id"), 10, 64) + if err != nil || id == 0 { + return c.Status(http.StatusBadRequest).JSON(fiber.Map{"error": "invalid user id"}) + } + + var user models.User + if err := database.DB.Preload("Profile").First(&user, id).Error; err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + return c.Status(http.StatusNotFound).JSON(fiber.Map{"error": "user not found"}) + } + return c.Status(http.StatusInternalServerError).JSON(fiber.Map{"error": "database error"}) + } + + // Parse incoming JSON or multipart/form-data into map to allow partial updates including false values + var payload map[string]interface{} + + // Prefer detecting multipart by trying to read the multipart form first + if mf, err := c.MultipartForm(); err == nil && mf != nil { + payload = map[string]interface{}{} + // form values + for k, vals := range mf.Value { + if len(vals) > 0 { + payload[k] = vals[0] + } + } + + // handle avatar file if present + if files, ok := mf.File["avatar"]; ok && len(files) > 0 { + file := files[0] + if _, err := os.Stat("./uploads/avatars"); os.IsNotExist(err) { + os.MkdirAll("./uploads/avatars", 0755) + } + filename := fmt.Sprintf("%d_%s", time.Now().Unix(), file.Filename) + filePath := filepath.Join("./uploads/avatars", filename) + if err := c.SaveFile(file, filePath); err != nil { + if configs.Logger != nil { + configs.Logger.Sugar().Errorf("failed to save avatar: %v", err) + } + } else { + payload["avatar_url"] = "/uploads/avatars/" + filename + } + } + } else { + // fallback to JSON body + if err := json.Unmarshal(c.Body(), &payload); err != nil { + return c.Status(http.StatusBadRequest).JSON(fiber.Map{"error": "invalid request body"}) + } + } + + // Prepare updates for user table + userUpdates := map[string]interface{}{} + if v, ok := payload["username"].(string); ok { + userUpdates["user_name"] = v + userUpdates["user_name"] = v + user.UserName = v + } + if v, ok := payload["email"].(string); ok { + userUpdates["email"] = v + user.Email = v + } + if v, ok := payload["is_admin"]; ok { + // handle bool or string representations + switch val := v.(type) { + case bool: + userUpdates["is_admin"] = val + user.IsAdmin = &val + case string: + if parsed, err := strconv.ParseBool(val); err == nil { + userUpdates["is_admin"] = parsed + user.IsAdmin = &parsed + } + } + } + // Handle email_verified explicitly (bool or string) + if v, ok := payload["email_verified"]; ok { + switch val := v.(type) { + case bool: + userUpdates["email_verified"] = val + now := time.Now() + if val { + userUpdates["email_verified_at"] = now + user.EmailVerified = &val + user.EmailVerifiedAt = &now + } else { + userUpdates["email_verified_at"] = nil + user.EmailVerified = &val + user.EmailVerifiedAt = nil + } + case string: + if parsed, err := strconv.ParseBool(val); err == nil { + userUpdates["email_verified"] = parsed + now := time.Now() + if parsed { + userUpdates["email_verified_at"] = now + user.EmailVerified = &parsed + user.EmailVerifiedAt = &now + } else { + userUpdates["email_verified_at"] = nil + user.EmailVerified = &parsed + user.EmailVerifiedAt = nil + } + } + } + } + if v, ok := payload["password"].(string); ok && v != "" { + hashed, err := bcrypt.GenerateFromPassword([]byte(v), bcrypt.DefaultCost) + if err != nil { + return c.Status(http.StatusInternalServerError).JSON(fiber.Map{"error": "could not hash password"}) + } + userUpdates["password"] = string(hashed) + user.Password = string(hashed) + } + + // Apply user updates if any + if len(userUpdates) > 0 { + if err := database.DB.Model(&user).Updates(userUpdates).Error; err != nil { + return c.Status(http.StatusInternalServerError).JSON(fiber.Map{"error": "user could not be updated"}) + } + } + + // Handle profile updates (first_name, last_name, avatar_url) + profileUpdates := map[string]interface{}{} + if v, ok := payload["first_name"].(string); ok { + profileUpdates["first_name"] = v + } + if v, ok := payload["last_name"].(string); ok { + profileUpdates["last_name"] = v + } + if v, ok := payload["avatar_url"].(string); ok { + profileUpdates["avatar_url"] = v + } + + if len(profileUpdates) > 0 { + // Profile may be stored as slice; update first profile if exists else create + var profile models.Profile + if len(user.Profile) > 0 { + profile = user.Profile[0] + if err := database.DB.Model(&profile).Updates(profileUpdates).Error; err != nil { + return c.Status(http.StatusInternalServerError).JSON(fiber.Map{"error": "profile could not be updated"}) + } + } else { + profile = models.Profile{ + UserID: uint64(user.ID), + } + if v, ok := profileUpdates["first_name"].(string); ok { + profile.FirstName = v + } + if v, ok := profileUpdates["last_name"].(string); ok { + profile.LastName = v + } + if v, ok := profileUpdates["avatar_url"].(string); ok { + profile.AvatarURL = v + } + if err := database.DB.Create(&profile).Error; err != nil { + return c.Status(http.StatusInternalServerError).JSON(fiber.Map{"error": "profile could not be created"}) + } + } + } + + // Reload user with profile + if err := database.DB.Preload("Profile").First(&user, id).Error; err != nil { + return c.Status(http.StatusInternalServerError).JSON(fiber.Map{"error": "database error"}) + } + + return c.JSON(fiber.Map{"message": "user updated", "user": user}) +} + +func DeleteUser(c fiber.Ctx) error { + if database.DB == nil { + return c.Status(http.StatusServiceUnavailable).JSON(fiber.Map{"error": "database is not configured"}) + } + + id, err := strconv.ParseUint(c.Params("id"), 10, 64) + if err != nil || id == 0 { + return c.Status(http.StatusBadRequest).JSON(fiber.Map{"error": "invalid user id"}) + } + + var user models.User + if err := database.DB.First(&user, id).Error; err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + return c.Status(http.StatusNotFound).JSON(fiber.Map{"error": "user not found"}) + } + return c.Status(http.StatusInternalServerError).JSON(fiber.Map{"error": "database error"}) + } + + if err := database.DB.Delete(&user).Error; err != nil { + return c.Status(http.StatusInternalServerError).JSON(fiber.Map{"error": "user could not be deleted"}) + } + + return c.JSON(fiber.Map{ + "message": "user soft-deleted successfully", + "user_id": id, + }) +} + +func HardDeleteUser(c fiber.Ctx) error { + if database.DB == nil { + return c.Status(http.StatusServiceUnavailable).JSON(fiber.Map{"error": "database is not configured"}) + } + + id, err := strconv.ParseUint(c.Params("id"), 10, 64) + if err != nil || id == 0 { + return c.Status(http.StatusBadRequest).JSON(fiber.Map{"error": "invalid user id"}) + } + + var user models.User + if err := database.DB.Unscoped().First(&user, id).Error; err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + return c.Status(http.StatusNotFound).JSON(fiber.Map{"error": "user not found"}) + } + return c.Status(http.StatusInternalServerError).JSON(fiber.Map{"error": "database error"}) + } + + err = database.DB.Transaction(func(tx *gorm.DB) error { + if err := tx.Unscoped().Where("user_id = ?", id).Delete(&models.Profile{}).Error; err != nil { + return err + } + if err := tx.Unscoped().Where("user_id = ?", id).Delete(&models.SocialAccount{}).Error; err != nil { + return err + } + return tx.Unscoped().Delete(&models.User{}, id).Error + }) + if err != nil { + return c.Status(http.StatusInternalServerError).JSON(fiber.Map{"error": "user hard-delete failed"}) + } + + return c.JSON(fiber.Map{ + "message": "user permanently deleted", + "user_id": id, + }) +} + +func RestoreUser(c fiber.Ctx) error { + if database.DB == nil { + return c.Status(http.StatusServiceUnavailable).JSON(fiber.Map{"error": "database is not configured"}) + } + + id, err := strconv.ParseUint(c.Params("id"), 10, 64) + if err != nil || id == 0 { + return c.Status(http.StatusBadRequest).JSON(fiber.Map{"error": "invalid user id"}) + } + + var user models.User + if err := database.DB.Unscoped().First(&user, id).Error; err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + return c.Status(http.StatusNotFound).JSON(fiber.Map{"error": "user not found"}) + } + return c.Status(http.StatusInternalServerError).JSON(fiber.Map{"error": "database error"}) + } + + if !user.DeletedAt.Valid { + return c.Status(http.StatusBadRequest).JSON(fiber.Map{"error": "user is not soft-deleted"}) + } + + if err := database.DB.Unscoped().Model(&models.User{}).Where("id = ?", id).Update("deleted_at", nil).Error; err != nil { + return c.Status(http.StatusInternalServerError).JSON(fiber.Map{"error": "user could not be restored"}) + } + + return c.JSON(fiber.Map{ + "message": "user restored successfully", + "user_id": id, + }) +} + +// Register godoc +// @Summary Register user +// @Tags Auth +// @Accept json +// @Produce json +// @Param request body RegisterRequest true "Register payload" +// @Success 201 {object} map[string]interface{} +// @Failure 400 {object} map[string]string +// @Failure 409 {object} map[string]string +// @Router /api/v1/auth/register [post] +func Register(c fiber.Ctx) error { + if database.DB == nil { + return c.Status(http.StatusServiceUnavailable).JSON(fiber.Map{"error": "database is not configured"}) + } + + var req RegisterRequest + if err := c.Bind().JSON(&req); err != nil { + return c.Status(http.StatusBadRequest).JSON(fiber.Map{"error": "invalid request body"}) + } + if err := validate.Struct(req); err != nil { + return c.Status(http.StatusBadRequest).JSON(fiber.Map{"error": err.Error()}) + } + + hashedPassword, err := bcrypt.GenerateFromPassword([]byte(req.Password), bcrypt.DefaultCost) + if err != nil { + return c.Status(http.StatusInternalServerError).JSON(fiber.Map{"error": "password could not be hashed"}) + } + + verifyToken, err := utils.GenerateSecureToken(32) + if err != nil { + return c.Status(http.StatusInternalServerError).JSON(fiber.Map{"error": "verify token could not be generated"}) + } + + user := models.User{ + UserName: req.UserName, + Email: req.Email, + Password: string(hashedPassword), + EmailVerifyToken: verifyToken, + } + + if err := database.DB.Create(&user).Error; err != nil { + return c.Status(http.StatusConflict).JSON(fiber.Map{"error": "email already exists"}) + } + + profile := models.Profile{ + UserID: uint64(user.ID), + FirstName: req.FirstName, + LastName: req.LastName, + } + if err := database.DB.Create(&profile).Error; err != nil { + return c.Status(http.StatusInternalServerError).JSON(fiber.Map{"error": "profile could not be created"}) + } + + appURL := strings.TrimRight(configs.AppConfig.AppURL, "/") + verifyURL := fmt.Sprintf("%s/api/v1/auth/verify-email?token=%s", appURL, url.QueryEscape(verifyToken)) + + emailService := services.NewEmailService() + err = emailService.SendVerificationEmail(user.Email, profile.FirstName, verifyURL) + if err != nil { + return c.Status(http.StatusInternalServerError).JSON(fiber.Map{"error": "verification email could not be sent"}) + } + + return c.Status(http.StatusCreated).JSON(fiber.Map{ + "message": "registration successful, please verify your email before login", + "user": fiber.Map{ + "id": user.ID, + "username": user.UserName, + "email": user.Email, + "is_admin": boolPtrValue(user.IsAdmin), + "email_verified": false, + "first_name": profile.FirstName, + "last_name": profile.LastName, + }, + }) +} + +// Login godoc +// @Summary Login user +// @Tags Auth +// @Accept json +// @Produce json +// @Param request body LoginRequest true "Login payload" +// @Success 200 {object} map[string]interface{} +// @Failure 400 {object} map[string]string +// @Failure 401 {object} map[string]string +// @Router /api/v1/auth/login [post] +func Login(c fiber.Ctx) error { + if database.DB == nil { + return c.Status(http.StatusServiceUnavailable).JSON(fiber.Map{"error": "database is not configured"}) + } + + var req LoginRequest + if err := c.Bind().JSON(&req); err != nil { + return c.Status(http.StatusBadRequest).JSON(fiber.Map{"error": "invalid request body"}) + } + if err := validate.Struct(req); err != nil { + return c.Status(http.StatusBadRequest).JSON(fiber.Map{"error": err.Error()}) + } + + var user models.User + if err := database.DB.Preload("Profile").Where("email = ?", req.Email).First(&user).Error; err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + return c.Status(http.StatusUnauthorized).JSON(fiber.Map{"error": "invalid email or password"}) + } + return c.Status(http.StatusInternalServerError).JSON(fiber.Map{"error": "database error"}) + } + + if err := bcrypt.CompareHashAndPassword([]byte(user.Password), []byte(req.Password)); err != nil { + return c.Status(http.StatusUnauthorized).JSON(fiber.Map{"error": "invalid email or password"}) + } + + if !user.IsEmailVerified() { + return c.Status(http.StatusForbidden).JSON(fiber.Map{"error": "please verify your email before login"}) + } + + firstName, lastName := extractProfileName(user.Profile) + jwtService := services.NewJWTService() + accessToken, refreshToken, err := jwtService.GenerateTokenPair( + user.ID, + user.Email, + boolPtrValue(user.IsAdmin), + firstName, + lastName, + ) + if err != nil { + return c.Status(http.StatusInternalServerError).JSON(fiber.Map{"error": "tokens could not be generated"}) + } + + return c.JSON(fiber.Map{ + "user": fiber.Map{ + "id": user.ID, + "username": user.UserName, + "email": user.Email, + "is_admin": boolPtrValue(user.IsAdmin), + "first_name": firstName, + "last_name": lastName, + }, + "access_token": accessToken, + "refresh_token": refreshToken, + }) +} + +// RefreshToken godoc +// @Summary Refresh access token +// @Tags Auth +// @Accept json +// @Produce json +// @Param request body RefreshRequest true "Refresh payload" +// @Success 200 {object} map[string]string +// @Failure 400 {object} map[string]string +// @Failure 401 {object} map[string]string +// @Router /api/v1/auth/refresh [post] +func RefreshToken(c fiber.Ctx) error { + if database.DB == nil { + return c.Status(http.StatusServiceUnavailable).JSON(fiber.Map{"error": "database is not configured"}) + } + + var req RefreshRequest + if err := c.Bind().JSON(&req); err != nil { + return c.Status(http.StatusBadRequest).JSON(fiber.Map{"error": "invalid request body"}) + } + if err := validate.Struct(req); err != nil { + return c.Status(http.StatusBadRequest).JSON(fiber.Map{"error": err.Error()}) + } + + jwtService := services.NewJWTService() + claims, err := jwtService.ValidateToken(req.RefreshToken) + if err != nil || claims.TokenType != services.TokenTypeRefresh { + return c.Status(http.StatusUnauthorized).JSON(fiber.Map{"error": "invalid refresh token"}) + } + + var user models.User + if err := database.DB.Preload("Profile").First(&user, claims.UserID).Error; err != nil { + return c.Status(http.StatusUnauthorized).JSON(fiber.Map{"error": "user not found"}) + } + + firstName, lastName := extractProfileName(user.Profile) + accessToken, refreshToken, err := jwtService.GenerateTokenPair( + user.ID, + user.Email, + boolPtrValue(user.IsAdmin), + firstName, + lastName, + ) + if err != nil { + return c.Status(http.StatusInternalServerError).JSON(fiber.Map{"error": "tokens could not be generated"}) + } + fmt.Println(accessToken, "Access Token Yenilendi !!!") + return c.JSON(fiber.Map{ + "access_token": accessToken, + "refresh_token": refreshToken, + }) +} + +// VerifyEmail godoc +// @Summary Verify email address with token +// @Tags Auth +// @Produce json +// @Param token query string true "Email verify token" +// @Success 200 {object} map[string]string +// @Failure 400 {object} map[string]string +// @Failure 404 {object} map[string]string +// @Router /api/v1/auth/verify-email [get] +func VerifyEmail(c fiber.Ctx) error { + if database.DB == nil { + return c.Status(http.StatusServiceUnavailable).JSON(fiber.Map{"error": "database is not configured"}) + } + + token := strings.TrimSpace(c.Query("token")) + if token == "" { + return c.Status(http.StatusBadRequest).JSON(fiber.Map{"error": "token is required"}) + } + + var user models.User + if err := database.DB.Where("email_verify_token = ?", token).First(&user).Error; err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + return c.Status(http.StatusNotFound).JSON(fiber.Map{"error": "invalid or expired token"}) + } + return c.Status(http.StatusInternalServerError).JSON(fiber.Map{"error": "database error"}) + } + + now := time.Now() + isVerified := true + user.EmailVerified = &isVerified + user.EmailVerifiedAt = &now + user.EmailVerifyToken = "" + + if err := database.DB.Save(&user).Error; err != nil { + return c.Status(http.StatusInternalServerError).JSON(fiber.Map{"error": "email verification could not be saved"}) + } + + return c.JSON(fiber.Map{"message": "email verified successfully"}) +} + +// ResendVerificationEmail godoc +// @Summary Resend verification email +// @Tags Auth +// @Accept json +// @Produce json +// @Param request body ResendVerificationRequest true "Resend verification payload" +// @Success 200 {object} map[string]string +// @Failure 400 {object} map[string]string +// @Failure 404 {object} map[string]string +// @Router /api/v1/auth/resend-verification [post] +func ResendVerificationEmail(c fiber.Ctx) error { + if database.DB == nil { + return c.Status(http.StatusServiceUnavailable).JSON(fiber.Map{"error": "database is not configured"}) + } + + var req ResendVerificationRequest + if err := c.Bind().JSON(&req); err != nil { + return c.Status(http.StatusBadRequest).JSON(fiber.Map{"error": "invalid request body"}) + } + if err := validate.Struct(req); err != nil { + return c.Status(http.StatusBadRequest).JSON(fiber.Map{"error": err.Error()}) + } + + var user models.User + if err := database.DB.Preload("Profile").Where("email = ?", req.Email).First(&user).Error; err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + return c.Status(http.StatusNotFound).JSON(fiber.Map{"error": "user not found"}) + } + return c.Status(http.StatusInternalServerError).JSON(fiber.Map{"error": "database error"}) + } + + if user.IsEmailVerified() { + return c.JSON(fiber.Map{"message": "email is already verified"}) + } + + verifyToken, err := utils.GenerateSecureToken(32) + if err != nil { + return c.Status(http.StatusInternalServerError).JSON(fiber.Map{"error": "verify token could not be generated"}) + } + user.EmailVerifyToken = verifyToken + if err := database.DB.Save(&user).Error; err != nil { + return c.Status(http.StatusInternalServerError).JSON(fiber.Map{"error": "verification token could not be saved"}) + } + + firstName, _ := extractProfileName(user.Profile) + appURL := strings.TrimRight(configs.AppConfig.AppURL, "/") + verifyURL := fmt.Sprintf("%s/api/v1/auth/verify-email?token=%s", appURL, url.QueryEscape(verifyToken)) + + emailService := services.NewEmailService() + if err := emailService.SendVerificationEmail(user.Email, firstName, verifyURL); err != nil { + return c.Status(http.StatusInternalServerError).JSON(fiber.Map{"error": "verification email could not be sent"}) + } + + return c.JSON(fiber.Map{"message": "verification email has been sent"}) +} + +// Me godoc +// @Summary Get current user from token +// @Tags Auth +// @Produce json +// @Security BearerAuth +// @Success 200 {object} map[string]interface{} +// @Failure 401 {object} map[string]string +// @Router /api/v1/auth/me [get] +func Me(c fiber.Ctx) error { + claims, ok := middlewares.GetAuthClaims(c) + if !ok { + return c.Status(http.StatusUnauthorized).JSON(fiber.Map{"error": "unauthorized"}) + } + + return c.JSON(fiber.Map{ + "user": fiber.Map{ + "id": claims.UserID, + "email": claims.Email, + "is_admin": claims.IsAdmin, + "first_name": claims.FirstName, + "last_name": claims.LastName, + }, + }) +} + +func AdminOnlyExample(c fiber.Ctx) error { + claims, ok := middlewares.GetAuthClaims(c) + if !ok { + return c.Status(http.StatusUnauthorized).JSON(fiber.Map{"error": "unauthorized"}) + } + + return c.JSON(fiber.Map{ + "message": "only admins can access this endpoint", + "user": claims.Email, + }) +} + +func UserOnlyExample(c fiber.Ctx) error { + claims, ok := middlewares.GetAuthClaims(c) + if !ok { + return c.Status(http.StatusUnauthorized).JSON(fiber.Map{"error": "unauthorized"}) + } + + return c.JSON(fiber.Map{ + "message": "only normal users can access this endpoint", + "user": claims.Email, + }) +} + +func GoogleAuth(c fiber.Ctx) error { + if configs.AppConfig.GoogleClientID == "" { + return c.Status(http.StatusServiceUnavailable).JSON(fiber.Map{"error": "google oauth is not configured"}) + } + + stateToken, err := utils.GenerateSecureToken(16) + if err != nil { + return c.Status(http.StatusInternalServerError).JSON(fiber.Map{"error": "state token could not be generated"}) + } + + authURL := "https://accounts.google.com/o/oauth2/v2/auth?" + url.Values{ + "client_id": []string{configs.AppConfig.GoogleClientID}, + "redirect_uri": []string{configs.AppConfig.GoogleRedirectURL}, + "response_type": []string{"code"}, + "scope": []string{"openid email profile"}, + "state": []string{stateToken}, + }.Encode() + + return c.JSON(fiber.Map{"provider": "google", "auth_url": authURL, "state": stateToken}) +} + +func GoogleAuthCallback(c fiber.Ctx) error { + code := c.Query("code") + if code == "" { + return c.Status(http.StatusBadRequest).JSON(fiber.Map{"error": "google callback code is missing"}) + } + + // OAuth token exchange is intentionally left simple for now. + return c.JSON(fiber.Map{ + "provider": "google", + "message": "google callback infrastructure is ready, token exchange can be added next", + "code": code, + "state": c.Query("state"), + }) +} + +func GithubAuth(c fiber.Ctx) error { + if configs.AppConfig.GithubClientID == "" { + return c.Status(http.StatusServiceUnavailable).JSON(fiber.Map{"error": "github oauth is not configured"}) + } + + stateToken, err := utils.GenerateSecureToken(16) + if err != nil { + return c.Status(http.StatusInternalServerError).JSON(fiber.Map{"error": "state token could not be generated"}) + } + + authURL := "https://github.com/login/oauth/authorize?" + url.Values{ + "client_id": []string{configs.AppConfig.GithubClientID}, + "redirect_uri": []string{configs.AppConfig.GithubRedirectURL}, + "scope": []string{"read:user user:email"}, + "state": []string{stateToken}, + }.Encode() + + return c.JSON(fiber.Map{"provider": "github", "auth_url": authURL, "state": stateToken}) +} + +func GithubAuthCallback(c fiber.Ctx) error { + code := c.Query("code") + if code == "" { + return c.Status(http.StatusBadRequest).JSON(fiber.Map{"error": "github callback code is missing"}) + } + + // OAuth token exchange is intentionally left simple for now. + return c.JSON(fiber.Map{ + "provider": "github", + "message": "github callback infrastructure is ready, token exchange can be added next", + "code": code, + "state": c.Query("state"), + }) +} + +func extractProfileName(profiles []models.Profile) (string, string) { + if len(profiles) == 0 { + return "", "" + } + return profiles[0].FirstName, profiles[0].LastName +} + +func boolPtrValue(v *bool) bool { + if v == nil { + return false + } + return *v +} diff --git a/database/config/mysql_db.go b/database/config/mysql_db.go new file mode 100644 index 0000000..3eb6351 --- /dev/null +++ b/database/config/mysql_db.go @@ -0,0 +1,46 @@ +package database + +import ( + configs "ares/config" + "time" + + "gorm.io/driver/mysql" + "gorm.io/gorm" + "gorm.io/gorm/logger" +) + +var DB *gorm.DB + +func ConnectDB() { + dsn := configs.AppConfig.DBUrl + if dsn == "" { + if configs.Logger != nil { + configs.Logger.Warn(".env dosyasında DB_URL ayarlı değil — veritabanı bağlantısı atlanıyor (geliştirme modu)") + } + return + } + + if configs.Logger != nil { + configs.Logger.Info("Yapılandırmada DB_URL bulundu, veritabanına bağlanılmaya çalışılıyor...") + } + + // GORM için MySQL konfigürasyonu + db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{ + Logger: logger.Default.LogMode(logger.Warn), // Info seviyesi (performans etkileyebilir); üretimde Error seviyesine alınabilir + PrepareStmt: true, // PrepareStmt performansını artırmak için + NowFunc: func() time.Time { + return time.Now().UTC() + }, + }) + if err != nil { + if configs.Logger != nil { + configs.Logger.Sugar().Errorf("MySQL veritabanı bağlantısı kurulamadı: %v", err) + } + return + } + + if configs.Logger != nil { + configs.Logger.Info("MySQL veritabanı bağlantısı kuruldu.") + } + DB = db +} diff --git a/database/config/postgres_db.go b/database/config/postgres_db.go new file mode 100644 index 0000000..3152300 --- /dev/null +++ b/database/config/postgres_db.go @@ -0,0 +1,46 @@ +package database + +import ( + configs "ares/config" + "time" + + "gorm.io/driver/postgres" + "gorm.io/gorm" + "gorm.io/gorm/logger" +) + +var DBPg *gorm.DB + +func ConnectDBPg() { + dsn := configs.AppConfig.DBPGUrl + if dsn == "" { + if configs.Logger != nil { + configs.Logger.Warn(".env dosyasında DB_URL ayarlı değil — veritabanı bağlantısı atlanıyor (geliştirme modu)") + } + return + } + + if configs.Logger != nil { + configs.Logger.Info("Yapılandırmada DB_URL_PG bulundu, veritabanına bağlanılmaya çalışılıyor...") + } + + // GORM için MySQL konfigürasyonu + db, err := gorm.Open(postgres.Open(dsn), &gorm.Config{ + Logger: logger.Default.LogMode(logger.Warn), // Info seviyesi (performans etkileyebilir); üretimde Error seviyesine alınabilir + PrepareStmt: true, // PrepareStmt performansını artırmak için + NowFunc: func() time.Time { + return time.Now().UTC() + }, + }) + if err != nil { + if configs.Logger != nil { + configs.Logger.Sugar().Errorf("Postgres veritabanı bağlantısı kurulamadı: %v", err) + } + return + } + + if configs.Logger != nil { + configs.Logger.Info("Postgres veritabanı bağlantısı kuruldu.") + } + DBPg = db +} diff --git a/database/config/redis_db.go b/database/config/redis_db.go new file mode 100644 index 0000000..e70f482 --- /dev/null +++ b/database/config/redis_db.go @@ -0,0 +1,117 @@ +package database + +import ( + configs "ares/config" + "context" + "github.com/redis/go-redis/v9" + "time" +) + +var RedisClient *redis.Client +var RedisOptions *redis.Options +var ctx = context.Background() + +func ConnectRedis() { + redisURL := configs.AppConfig.RedisUrl + if redisURL == "" { + if configs.Logger != nil { + configs.Logger.Warn("Warning: REDIS_URL is not set, continuing without Redis cache") + } + return + } + + opt, err := redis.ParseURL(redisURL) + if err != nil { + if configs.Logger != nil { + configs.Logger.Sugar().Warnf("Warning: Failed to parse Redis URL: %v, continuing without Redis cache", err) + } + RedisOptions = nil + return + } + + RedisOptions = opt + RedisClient = redis.NewClient(opt) + + // Test connection + _, err = RedisClient.Ping(ctx).Result() + if err != nil { + if configs.Logger != nil { + configs.Logger.Sugar().Warnf("Warning: Failed to connect to Redis: %v, continuing without Redis cache", err) + } + RedisClient = nil + RedisOptions = nil + return + } + + if configs.Logger != nil { + configs.Logger.Info("Connected to Redis successfully") + } +} + +// Set stores a key-value pair in Redis with expiration +func Set(key string, value interface{}, expiration time.Duration) error { + if RedisClient == nil { + return nil // Gracefully handle when Redis is not available + } + return RedisClient.Set(ctx, key, value, expiration).Err() +} + +// Get retrieves a value from Redis +func Get(key string) (string, error) { + if RedisClient == nil { + return "", redis.Nil // Return Nil error when Redis is not available + } + return RedisClient.Get(ctx, key).Result() +} + +// Delete removes a key from Redis +func Delete(key string) error { + if RedisClient == nil { + return nil + } + return RedisClient.Del(ctx, key).Err() +} + +// Exists checks if a key exists in Redis +func Exists(key string) (bool, error) { + if RedisClient == nil { + return false, nil + } + count, err := RedisClient.Exists(ctx, key).Result() + return count > 0, err +} + +// SetWithJSON stores a JSON-serializable value in Redis +func SetEx(key string, value interface{}, seconds int) error { + if RedisClient == nil { + return nil + } + return RedisClient.Set(ctx, key, value, time.Duration(seconds)*time.Second).Err() +} + +// Increment increments a counter in Redis +func Increment(key string) (int64, error) { + if RedisClient == nil { + return 0, nil + } + return RedisClient.Incr(ctx, key).Result() +} + +// Expire sets expiration time for a key +func Expire(key string, expiration time.Duration) error { + if RedisClient == nil { + return nil + } + return RedisClient.Expire(ctx, key, expiration).Err() +} + +// FlushAll clears all keys in the current database +func FlushAll() error { + if RedisClient == nil { + return nil + } + if configs.Logger != nil { + configs.Logger.Info("🧹 Clearing Redis Cache...") + } + return RedisClient.FlushDB(ctx).Err() +} diff --git a/database/migrate/migrate.go b/database/migrate/migrate.go new file mode 100644 index 0000000..3c0308d --- /dev/null +++ b/database/migrate/migrate.go @@ -0,0 +1,162 @@ +package migrate + +import ( + configs "ares/config" + database "ares/database/config" + "ares/database/models" + "net/url" + "strings" +) + +// Only run AutoMigrate if DB is initialized + +func Migrate() { + if database.DB != nil { + if err := database.DB.AutoMigrate( + &models.User{}, + &models.SocialAccount{}, + &models.Profile{}, + &models.Hero{}, + &models.Setting{}, + &models.CorsWhitelist{}, + &models.CorsBlacklist{}, + &models.RateLimitSetting{}, + &models.Category{}, + &models.Tag{}, + &models.Post{}, + &models.CategoryView{}, + &models.Comment{}, + &models.ProductCategory{}, + &models.ProductTag{}, + &models.Product{}, + &models.ProductCategoryView{}, + &models.ProductComment{}, + &models.Cart{}, + &models.CartItem{}, + ); err != nil { + configs.Logger.Sugar().Errorf("AutoMigrate Yapılamadı !!: %v", err) + } + seedSecurityDefaults() + configs.Logger.Info("AutoMigrate Yapıldı.") + } else { + configs.Logger.Info("DB not initialized: skipping AutoMigrate") + } +} + +func MigratePg() { + if database.DBPg != nil { + if err := database.DBPg.AutoMigrate( + &models.User{}, + &models.SocialAccount{}, + &models.Profile{}, + &models.Hero{}, + &models.Setting{}, + &models.CorsWhitelist{}, + &models.CorsBlacklist{}, + &models.RateLimitSetting{}, + &models.Category{}, + &models.Tag{}, + &models.Post{}, + &models.CategoryView{}, + &models.Comment{}, + &models.ProductCategory{}, + &models.ProductTag{}, + &models.Product{}, + &models.ProductCategoryView{}, + &models.ProductComment{}, + &models.Cart{}, + &models.CartItem{}, + ); err != nil { + configs.Logger.Sugar().Errorf("PG AutoMigrate Yapılamadı !!: %v", err) + } + seedSecurityDefaults() + configs.Logger.Info("PG AutoMigrate Yapıldı.") + } else { + configs.Logger.Info("PG DB not initialized: skipping AutoMigrate") + } +} + +func seedSecurityDefaults() { + seedRateLimit("register", "Register endpoint default rate limit", 5, 60) + seedRateLimit("login", "Login endpoint default rate limit", 10, 60) + seedRateLimit("global", "Global endpoint default rate limit", 1000, 60) + + for _, origin := range defaultWhitelistOrigins() { + seedCorsWhitelist(origin, "default seeded whitelist") + } +} + +func seedRateLimit(name, description string, maxRequests int64, windowSeconds int) { + var existing models.RateLimitSetting + if err := database.DB.Where("name = ?", name).First(&existing).Error; err == nil { + return + } + + item := models.RateLimitSetting{ + Name: name, + Description: description, + MaxRequests: maxRequests, + WindowSeconds: windowSeconds, + IsActive: true, + UpdatedBy: "seed", + } + if err := database.DB.Create(&item).Error; err != nil { + configs.Logger.Sugar().Errorf("RateLimit seed failed (%s): %v", name, err) + return + } + configs.Logger.Sugar().Infof("RateLimit seed created: name=%s max=%d window=%ds", name, maxRequests, windowSeconds) +} + +func seedCorsWhitelist(origin, description string) { + origin = strings.TrimSpace(origin) + if origin == "" { + return + } + + var existing models.CorsWhitelist + if err := database.DB.Where("origin = ?", origin).First(&existing).Error; err == nil { + return + } + + item := models.CorsWhitelist{ + Origin: origin, + Description: description, + IsActive: true, + CreatedBy: "seed", + } + if err := database.DB.Create(&item).Error; err != nil { + configs.Logger.Sugar().Errorf("CorsWhitelist seed failed (%s): %v", origin, err) + return + } + configs.Logger.Sugar().Infof("CorsWhitelist seed created: origin=%s", origin) +} + +func defaultWhitelistOrigins() []string { + origins := []string{ + "http://localhost:3000", + "http://localhost:5173", + "http://localhost:8080", + } + + appURL := strings.TrimSpace(configs.AppConfig.AppURL) + if appURL != "" { + if parsed, err := url.Parse(appURL); err == nil && parsed.Scheme != "" && parsed.Host != "" { + origins = append(origins, parsed.Scheme+"://"+parsed.Host) + } + } + + uniq := make(map[string]struct{}) + out := make([]string, 0, len(origins)) + for _, origin := range origins { + origin = strings.TrimSpace(origin) + if origin == "" { + continue + } + if _, ok := uniq[origin]; ok { + continue + } + uniq[origin] = struct{}{} + out = append(out, origin) + } + return out +} diff --git a/database/models/blog.go b/database/models/blog.go new file mode 100644 index 0000000..abff7a4 --- /dev/null +++ b/database/models/blog.go @@ -0,0 +1,53 @@ +package models + +import ( + "gorm.io/gorm" +) + +// Minimal, temiz GORM modelleri + +type Category struct { + gorm.Model + Title string `gorm:"type:varchar(254);not null" json:"title"` + Slug string `gorm:"type:varchar(254);not null;uniqueIndex" json:"slug"` + Description string `json:"description,omitempty"` + ParentID *uint `json:"parent_id,omitempty"` + Parent *Category `gorm:"constraint:OnUpdate:CASCADE,OnDelete:SET NULL;foreignKey:ParentID" json:"parent,omitempty"` + Children []Category `gorm:"foreignKey:ParentID" json:"children,omitempty"` + Posts []Post `gorm:"many2many:post_categories;" json:"posts,omitempty"` +} + +type Tag struct { + gorm.Model + Name string `gorm:"type:varchar(254);not null" json:"name"` + Posts []Post `gorm:"many2many:post_tags;" json:"posts,omitempty"` +} + +type Post struct { + gorm.Model + Title string `gorm:"type:varchar(254);not null" json:"title" form:"title"` + Images string `gorm:"type:text;not null" json:"images" form:"images"` + ImagesMid string `gorm:"type:text;not null" json:"images_mid" form:"images_mid"` + ImagesMin string `gorm:"type:text;not null" json:"images_min" form:"images_min"` + Width int `gorm:"default:0" json:"width" form:"width"` + Height int `gorm:"default:0" json:"height" form:"height"` + Quality int `gorm:"default:0" json:"quality" form:"quality"` + Format string `gorm:"type:varchar(10)" json:"format" form:"format" default:"avif"` + Content string `gorm:"type:text" json:"content,omitempty" form:"content"` + Slug string `gorm:"type:varchar(254);not null;uniqueIndex" json:"slug" form:"slug"` + Categories []Category `gorm:"many2many:post_categories;" json:"categories,omitempty" form:"categories"` + Tags []Tag `gorm:"many2many:post_tags;" json:"tags,omitempty" form:"tags"` +} + +type CategoryView struct { + gorm.Model + CategoryID uint `json:"category_id"` + IPAddress string `gorm:"type:varchar(45)" json:"ip_address,omitempty"` +} + +type Comment struct { + gorm.Model + UserID uint `json:"user_id"` + PostID uint `json:"post_id"` + Body string `gorm:"type:text" json:"body,omitempty"` +} diff --git a/database/models/cart.go b/database/models/cart.go new file mode 100644 index 0000000..658677c --- /dev/null +++ b/database/models/cart.go @@ -0,0 +1,20 @@ +package models + +import ( + "gorm.io/gorm" +) + +type Cart struct { + gorm.Model + UserID uint `gorm:"not null;index" json:"user_id"` + Items []CartItem `gorm:"foreignKey:CartID" json:"items,omitempty"` +} + +type CartItem struct { + gorm.Model + CartID uint `gorm:"not null;index" json:"cart_id"` + Cart *Cart `gorm:"constraint:OnUpdate:CASCADE,OnDelete:CASCADE;foreignKey:CartID" json:"cart,omitempty"` + ProductID uint `gorm:"not null;index" json:"product_id"` + Product *Product `gorm:"constraint:OnUpdate:CASCADE,OnDelete:CASCADE;foreignKey:ProductID" json:"product,omitempty"` + Quantity int `gorm:"default:1" json:"quantity"` +} diff --git a/database/models/cors.go b/database/models/cors.go new file mode 100644 index 0000000..d3faaf0 --- /dev/null +++ b/database/models/cors.go @@ -0,0 +1,34 @@ +package models + +import ( + "gorm.io/gorm" +) + +// CorsWhitelist - CORS için izin verilen origin'ler +type CorsWhitelist struct { + gorm.Model + Origin string `gorm:"type:varchar(255);uniqueIndex;not null" json:"origin"` + Description string `gorm:"type:varchar(255)" json:"description"` + IsActive bool `gorm:"default:true" json:"is_active"` + CreatedBy string `gorm:"type:varchar(255)" json:"created_by,omitempty"` +} + +// CorsBlacklist - CORS için yasaklanan origin'ler +type CorsBlacklist struct { + gorm.Model + Origin string `gorm:"type:varchar(255);uniqueIndex;not null" json:"origin"` + Reason string `gorm:"type:varchar(255)" json:"reason"` + IsActive bool `gorm:"default:true" json:"is_active"` + CreatedBy string `gorm:"type:varchar(255)" json:"created_by,omitempty"` +} + +// RateLimitSetting - Rate limit ayarları +type RateLimitSetting struct { + gorm.Model + Name string `gorm:"type:varchar(100);uniqueIndex;not null" json:"name"` // e.g., "login", "register", "api" + Description string `gorm:"type:varchar(255)" json:"description"` + MaxRequests int64 `gorm:"not null" json:"max_requests"` // Max istek sayısı + WindowSeconds int `gorm:"not null" json:"window_seconds"` // Zaman penceresi (saniye) + IsActive bool `gorm:"default:true" json:"is_active"` + UpdatedBy string `gorm:"type:varchar(255)" json:"updated_by,omitempty"` +} diff --git a/database/models/docs_models.go b/database/models/docs_models.go new file mode 100644 index 0000000..0a1062d --- /dev/null +++ b/database/models/docs_models.go @@ -0,0 +1,96 @@ +package models + +// Swagger-friendly (light) structs for documentation only. +// These avoid embedding external types (gorm.Model) so `swag` can parse them. + +type CategoryDoc struct { + ID uint `json:"id"` + Title string `json:"title"` + Description string `json:"description,omitempty"` + ParentID *uint `json:"parent_id,omitempty"` + Children []CategoryDoc `json:"children,omitempty"` +} + +type TagDoc struct { + ID uint `json:"id"` + Name string `json:"name"` +} + +type PostDoc struct { + ID uint `json:"id"` + Title string `json:"title"` + Content string `json:"content,omitempty"` + Images []string `json:"images,omitempty"` + Categories []CategoryDoc `json:"categories,omitempty"` + Tags []TagDoc `json:"tags,omitempty"` +} + +type CommentDoc struct { + ID uint `json:"id"` + UserID uint `json:"user_id"` + PostID uint `json:"post_id"` + Body string `json:"body,omitempty"` +} + +type CategoryViewDoc struct { + ID uint `json:"id"` + CategoryID uint `json:"category_id"` + IPAddress string `json:"ip_address,omitempty"` +} + +type ProductCategoryDoc struct { + ID uint `json:"id"` + Title string `json:"title"` + Slug string `json:"slug"` + Description string `json:"description,omitempty"` + Keywords string `json:"keywords,omitempty"` + ParentID *uint `json:"parent_id,omitempty"` + Children []ProductCategoryDoc `json:"children,omitempty"` +} + +type ProductTagDoc struct { + ID uint `json:"id"` + Name string `json:"name"` +} + +type ProductDoc struct { + ID uint `json:"id"` + Title string `json:"title"` + Images string `json:"images"` + Price float64 `json:"price"` + Width int `json:"width"` + Height int `json:"height"` + Quality int `json:"quality"` + Format string `json:"format"` + Content string `json:"content,omitempty"` + Slug string `json:"slug"` + Categories []ProductCategoryDoc `json:"categories,omitempty"` + Tags []ProductTagDoc `json:"tags,omitempty"` +} + +type CartItemDoc struct { + ID uint `json:"id"` + CartID uint `json:"cart_id"` + ProductID uint `json:"product_id"` + Product ProductDoc `json:"product,omitempty"` + Quantity int `json:"quantity"` +} + +type CartDoc struct { + ID uint `json:"id"` + UserID uint `json:"user_id"` + Items []CartItemDoc `json:"items,omitempty"` +} + +type ProductCommentDoc struct { + ID uint `json:"id"` + UserID uint `json:"user_id"` + ProductID uint `json:"product_id"` + Body string `json:"body"` +} + +type ProductCategoryViewDoc struct { + ID uint `json:"id"` + CategoryID uint `json:"category_id"` + IPAddress string `json:"ip_address,omitempty"` +} diff --git a/database/models/hero.go b/database/models/hero.go new file mode 100644 index 0000000..314a3df --- /dev/null +++ b/database/models/hero.go @@ -0,0 +1,23 @@ +package models + +import ( + "gorm.io/gorm" +) + +// Banner model structure +// Represents a banner item with optional thumbnail. +type Hero struct { + gorm.Model + Color string `gorm:"type:varchar(32);not null" json:"color" form:"color"` + Title string `gorm:"type:varchar(254)" json:"title,omitempty" form:"title"` + Text1 string `gorm:"type:varchar(254)" json:"text1,omitempty" form:"text1"` + Text2 string `gorm:"type:varchar(254)" json:"text2,omitempty" form:"text2"` + Text4 string `gorm:"type:varchar(254)" json:"text4,omitempty" form:"text4"` + Text5 string `gorm:"type:varchar(254)" json:"text5,omitempty" form:"text5"` + Image string `gorm:"type:varchar(254)" json:"image" form:"image"` + IsActive bool `gorm:"default:true" json:"is_active" form:"is_active"` + Width int `gorm:"default:0" json:"width" form:"width"` + Height int `gorm:"default:0" json:"height" form:"height"` + Quality int `gorm:"default:0" json:"quality" form:"quality"` + Format string `gorm:"type:varchar(10)" json:"format" form:"format"` +} diff --git a/database/models/product.go b/database/models/product.go new file mode 100644 index 0000000..6e16827 --- /dev/null +++ b/database/models/product.go @@ -0,0 +1,53 @@ +package models + +import ( + "gorm.io/gorm" +) + +// Minimal, temiz GORM modelleri + +type ProductCategory struct { + gorm.Model + Title string `gorm:"type:varchar(254);not null" json:"title"` + Slug string `gorm:"type:varchar(254);not null;uniqueIndex" json:"slug"` + Description string `json:"description,omitempty"` + Keywords string `json:"keywords,omitempty"` + ParentID *uint `json:"parent_id,omitempty"` + Parent *ProductCategory `gorm:"constraint:OnUpdate:CASCADE,OnDelete:SET NULL;foreignKey:ParentID" json:"parent,omitempty"` + Children []ProductCategory `gorm:"foreignKey:ParentID" json:"children,omitempty"` + Products []Product `gorm:"many2many:product_product_categories;" json:"products,omitempty"` +} + +type ProductTag struct { + gorm.Model + Name string `gorm:"type:varchar(254);not null" json:"name"` + Products []Product `gorm:"many2many:product_product_tags;" json:"products,omitempty"` +} + +type Product struct { + gorm.Model + Title string `gorm:"type:varchar(254);not null" json:"title" form:"title"` + Images string `gorm:"type:text;not null" json:"images" form:"images"` + Price float64 `gorm:"type:decimal(10,2);default:0.0" json:"price" form:"price"` + Width int `gorm:"default:0" json:"width" form:"width"` + Height int `gorm:"default:0" json:"height" form:"height"` + Quality int `gorm:"default:0" json:"quality" form:"quality"` + Format string `gorm:"type:varchar(10);default:avif" json:"format" form:"format"` + Content string `gorm:"type:text" json:"content,omitempty" form:"content"` + Slug string `gorm:"type:varchar(254);not null;uniqueIndex" json:"slug" form:"slug"` + Categories []ProductCategory `gorm:"many2many:product_product_categories;" json:"categories,omitempty" form:"product_category"` + Tags []ProductTag `gorm:"many2many:product_product_tags;" json:"tags,omitempty" form:"tags"` +} + +type ProductCategoryView struct { + gorm.Model + CategoryID uint `json:"category_id"` + IPAddress string `gorm:"type:varchar(45)" json:"ip_address,omitempty"` +} + +type ProductComment struct { + gorm.Model + UserID uint `json:"user_id"` + ProductID uint `json:"product_id"` + Body string `gorm:"type:text" json:"body,omitempty"` +} diff --git a/database/models/setting.go b/database/models/setting.go new file mode 100644 index 0000000..cfcd73e --- /dev/null +++ b/database/models/setting.go @@ -0,0 +1,43 @@ +package models + +import ( + "gorm.io/gorm" +) + +// Setting model structure +// Stores site-wide metadata and contact information. +type Setting struct { + gorm.Model + Title string `gorm:"type:varchar(254);not null" json:"title" form:"title"` + MetaTitle string `gorm:"type:varchar(254);not null" json:"meta_title" form:"meta_title"` + MetaDescription string `gorm:"type:varchar(254);not null" json:"meta_description" form:"meta_description"` + Phone string `gorm:"type:varchar(254);not null" json:"phone" form:"phone"` + URL string `gorm:"type:varchar(254);not null" json:"url" form:"url"` + Email string `gorm:"type:varchar(254);not null" json:"email" form:"email"` + Facebook string `gorm:"type:varchar(254)" json:"facebook,omitempty" form:"facebook"` + X string `gorm:"type:varchar(254)" json:"x,omitempty" form:"x"` + Instagram string `gorm:"type:varchar(254)" json:"instagram,omitempty" form:"instagram"` + Whatsapp string `gorm:"type:varchar(254)" json:"whatsapp,omitempty" form:"whatsapp"` + Pinterest string `gorm:"type:varchar(254)" json:"pinterest,omitempty" form:"pinterest"` + Linkedin string `gorm:"type:varchar(254)" json:"linkedin,omitempty" form:"linkedin"` + Slogan string `gorm:"type:varchar(254)" json:"slogan,omitempty" form:"slogan"` + Address string `gorm:"type:text" json:"address,omitempty" form:"address"` + Copyright string `gorm:"type:varchar(254)" json:"copyright,omitempty" form:"copyright"` + MapEmbed string `gorm:"type:text" json:"map_embed,omitempty" form:"map_embed"` + WLogo string `gorm:"type:text" json:"w_logo,omitempty" form:"w_logo"` + BLogo string `gorm:"type:text" json:"b_logo,omitempty" form:"b_logo"` + IsActive bool `gorm:"default:false" json:"is_active" form:"is_active"` + WWidth int `gorm:"default:0" json:"w_width" form:"w_width"` + WHeight int `gorm:"default:0" json:"w_height" form:"w_height"` + WQuality int `gorm:"default:0" json:"w_quality" form:"w_quality"` + WFormat string `gorm:"type:varchar(10)" json:"w_format" form:"w_format"` + BWidth int `gorm:"default:0" json:"b_width" form:"b_width"` + BHeight int `gorm:"default:0" json:"b_height" form:"b_height"` + BQuality int `gorm:"default:0" json:"b_quality" form:"b_quality"` + BFormat string `gorm:"type:varchar(10)" json:"b_format" form:"b_format"` +} + +// TableName overrides the table name used by Setting to `settings` +func (Setting) TableName() string { + return "settings" +} diff --git a/database/models/user.go b/database/models/user.go new file mode 100644 index 0000000..b461716 --- /dev/null +++ b/database/models/user.go @@ -0,0 +1,48 @@ +package models + +import ( + "time" + + "gorm.io/gorm" +) + +type User struct { + gorm.Model + UserName string `json:"username" gorm:"type:varchar(255)"` + Email string `gorm:"uniqueIndex;not null;type:varchar(255)" json:"email"` + Password string `json:"-" gorm:"type:varchar(255)"` // Password shouldn't be returned in JSON + EmailVerified *bool `gorm:"default:false" json:"email_verified"` // default false for email/password registration + EmailVerifyToken string `gorm:"index;type:varchar(255)" json:"-"` + EmailVerifiedAt *time.Time `json:"email_verified_at,omitempty"` + IsAdmin *bool `gorm:"default:false" json:"is_admin"` + SocialAccounts []SocialAccount `gorm:"foreignKey:UserID" json:"social_accounts,omitempty"` + Profile []Profile `gorm:"foreignKey:UserID" json:"profiles,omitempty"` +} + +// Email Veriyf i False Döndürüyor +func (u *User) IsEmailVerified() bool { + if u.EmailVerified == nil { + return false + } + return *u.EmailVerified +} + +// SocialAccount model structure +type SocialAccount struct { + gorm.Model + UserID uint64 `gorm:"type:bigint unsigned;not null;index" json:"user_id"` + Provider string `gorm:"not null" json:"provider"` // google, github + ProviderID string `gorm:"not null" json:"provider_id"` + Email string `json:"email" gorm:"type:varchar(255)"` + Name string `json:"name,omitempty" gorm:"type:varchar(255)"` // Full name from provider + AvatarURL string `json:"avatar_url,omitempty" gorm:"type:varchar(255)"` // Avatar URL from provider + +} +type Profile struct { + gorm.Model + UserID uint64 `gorm:"type:bigint unsigned;not null;index" json:"user_id"` + AvatarURL string `json:"avatar_url,omitempty" gorm:"type:varchar(255)"` // Avatar URL from provider + FirstName string `json:"first_name" gorm:"type:varchar(255)"` // Full name from provider + LastName string `json:"last_name" gorm:"type:varchar(255)"` // Full name from provider + +} diff --git a/database/seeder/seeder.go b/database/seeder/seeder.go new file mode 100644 index 0000000..71bc857 --- /dev/null +++ b/database/seeder/seeder.go @@ -0,0 +1,75 @@ +package seeder + +import ( + dbConfig "ares/database/config" + "ares/database/models" + "errors" + "fmt" + + "golang.org/x/crypto/bcrypt" + "gorm.io/gorm" + "gorm.io/gorm/clause" +) + +// Seed checks for essential data and creates it if missing +func Seed() { + seedAdmin() +} + +func seedAdmin() { + // Include soft-deleted records in lookup + var existing models.User + err := dbConfig.DB.Unscoped().Where("email = ?", "admin@example.com").First(&existing).Error + if err == nil { + // Found a user (could be soft-deleted) + // If soft-deleted, restore it + if existing.DeletedAt.Valid { + // Restore (set deleted_at to NULL) and ensure admin/verified flags + updateErr := dbConfig.DB.Unscoped().Model(&existing).Updates(map[string]interface{}{ + "deleted_at": nil, + "is_admin": true, + "email_verified": true, + }).Error + if updateErr != nil { + fmt.Println("Admin restore hatası:", updateErr) + return + } + } + // user exists or restored, nothing more to do + return + } else if !errors.Is(err, gorm.ErrRecordNotFound) { + fmt.Println("Admin seed lookup error:", err) + return + } + + // If not found at all, create + password := "password123" + hashedPassword, _ := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost) + isTrue := true + + admin := models.User{ + UserName: "Admin", + Email: "admin@example.com", + Password: string(hashedPassword), + IsAdmin: &isTrue, + EmailVerified: &isTrue, + } + + res := dbConfig.DB.Clauses(clause.OnConflict{DoNothing: true}).Create(&admin) + if res.Error != nil { + fmt.Println("Admin seed hatası:", res.Error) + return + } + + if res.RowsAffected == 0 { + // Another process likely created it concurrently + fmt.Println("Admin kullanıcı zaten mevcut; seed atlandı.") + return + } + + fmt.Println("------------------------------------------------") + fmt.Println("Admin kullanıcısı oluşturuldu:") + fmt.Println("Email: admin@example.com") + fmt.Println("Şifre: password123") + fmt.Println("------------------------------------------------") +} diff --git a/docker-compose.c.yml b/docker-compose.c.yml new file mode 100644 index 0000000..b9c594d --- /dev/null +++ b/docker-compose.c.yml @@ -0,0 +1,20 @@ +version: '3.8' + +services: + app: + build: . + container_name: ares_app + # ports: + # - "8080:8080" + volumes: + - ./uploads:/app/uploads + - uploads_data:/app/uploads + env_file: + - .env + # Assumes MySQL and Redis are provided externally. Configure hosts in .env (DB_HOST, REDIS_HOST) + restart: always + + +volumes: + uploads_data: + diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..3421284 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,26 @@ +version: '3.8' + +services: + app: + build: . + container_name: ares_app + # ports: + # - "8080:8080" + volumes: + # For local development, bind mount the host uploads folder so files appear on host + #- ./uploads:/app/uploads + # For production platforms that support named volumes, you can use: + - uploads_data:/app/uploads + env_file: + - .env + # Assumes MySQL and Redis are provided externally. Configure hosts in .env (DB_HOST, REDIS_HOST) + restart: always + networks: + - dokploy-network + +volumes: + uploads_data: + +networks: + dokploy-network: + external: true diff --git a/docker-entrypoint.sh b/docker-entrypoint.sh new file mode 100644 index 0000000..c99e194 --- /dev/null +++ b/docker-entrypoint.sh @@ -0,0 +1,13 @@ +#!/bin/sh +set -e + +# Ensure uploads dir exists; try to chown but ignore failures (some platforms forbid chown) +if [ -d /app/uploads ]; then + chown -R 1000:1000 /app/uploads >/dev/null 2>&1 || true +else + mkdir -p /app/uploads >/dev/null 2>&1 || true + chown -R 1000:1000 /app/uploads >/dev/null 2>&1 || true +fi + +# Execute the passed command (do not attempt to change user/groups here) +exec "$@" diff --git a/docs/docs.go b/docs/docs.go new file mode 100644 index 0000000..6773f4b --- /dev/null +++ b/docs/docs.go @@ -0,0 +1,1377 @@ +// Package docs Code generated by swaggo/swag. DO NOT EDIT +package docs + +import "github.com/swaggo/swag" + +const docTemplate = `{ + "schemes": {{ marshal .Schemes }}, + "swagger": "2.0", + "info": { + "description": "{{escape .Description}}", + "title": "{{.Title}}", + "contact": {}, + "version": "{{.Version}}" + }, + "host": "{{.Host}}", + "basePath": "{{.BasePath}}", + "paths": { + "/api/v1/auth/login": { + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "Auth" + ], + "summary": "Login user", + "parameters": [ + { + "description": "Login payload", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/controllers.LoginRequest" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "object", + "additionalProperties": true + } + }, + "400": { + "description": "Bad Request", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "401": { + "description": "Unauthorized", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + } + } + } + }, + "/api/v1/auth/me": { + "get": { + "security": [ + { + "BearerAuth": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Auth" + ], + "summary": "Get current user from token", + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "object", + "additionalProperties": true + } + }, + "401": { + "description": "Unauthorized", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + } + } + } + }, + "/api/v1/auth/refresh": { + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "Auth" + ], + "summary": "Refresh access token", + "parameters": [ + { + "description": "Refresh payload", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/controllers.RefreshRequest" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "400": { + "description": "Bad Request", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "401": { + "description": "Unauthorized", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + } + } + } + }, + "/api/v1/auth/register": { + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "Auth" + ], + "summary": "Register user", + "parameters": [ + { + "description": "Register payload", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/controllers.RegisterRequest" + } + } + ], + "responses": { + "201": { + "description": "Created", + "schema": { + "type": "object", + "additionalProperties": true + } + }, + "400": { + "description": "Bad Request", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "409": { + "description": "Conflict", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + } + } + } + }, + "/api/v1/auth/resend-verification": { + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "Auth" + ], + "summary": "Resend verification email", + "parameters": [ + { + "description": "Resend verification payload", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/controllers.ResendVerificationRequest" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "400": { + "description": "Bad Request", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "404": { + "description": "Not Found", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + } + } + } + }, + "/api/v1/auth/verify-email": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "Auth" + ], + "summary": "Verify email address with token", + "parameters": [ + { + "type": "string", + "description": "Email verify token", + "name": "token", + "in": "query", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "400": { + "description": "Bad Request", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "404": { + "description": "Not Found", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + } + } + } + }, + "/api/v1/cart": { + "get": { + "security": [ + { + "BearerAuth": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Cart" + ], + "summary": "Get the current user's cart", + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/models.CartDoc" + } + }, + "401": { + "description": "Unauthorized", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + } + } + }, + "delete": { + "security": [ + { + "BearerAuth": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Cart" + ], + "summary": "Clear the entire cart", + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/models.CartDoc" + } + }, + "401": { + "description": "Unauthorized", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + } + } + } + }, + "/api/v1/cart/items": { + "post": { + "security": [ + { + "BearerAuth": [] + } + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "Cart" + ], + "summary": "Add item to cart", + "parameters": [ + { + "description": "Cart Item Details", + "name": "data", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/controllers.AddToCartRequest" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/models.CartDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "401": { + "description": "Unauthorized", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "404": { + "description": "Not Found", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + } + } + } + }, + "/api/v1/cart/items/{item_id}": { + "put": { + "security": [ + { + "BearerAuth": [] + } + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "Cart" + ], + "summary": "Update cart item quantity", + "parameters": [ + { + "type": "integer", + "description": "Cart Item ID", + "name": "item_id", + "in": "path", + "required": true + }, + { + "description": "Update Quantity", + "name": "data", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/controllers.UpdateCartItemRequest" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/models.CartDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "401": { + "description": "Unauthorized", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "404": { + "description": "Not Found", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + } + } + }, + "delete": { + "security": [ + { + "BearerAuth": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Cart" + ], + "summary": "Remove item from cart", + "parameters": [ + { + "type": "integer", + "description": "Cart Item ID", + "name": "item_id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/models.CartDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "401": { + "description": "Unauthorized", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "404": { + "description": "Not Found", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + } + } + } + }, + "/api/v1/categories": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "Categories" + ], + "summary": "List categories (public)", + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/models.CategoryDoc" + } + } + } + } + } + }, + "/api/v1/categories/{slug}": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "Categories" + ], + "summary": "Get single category (public)", + "parameters": [ + { + "type": "string", + "description": "Category slug", + "name": "slug", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/models.CategoryDoc" + } + }, + "404": { + "description": "Not Found", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + } + } + } + }, + "/api/v1/comments": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "Comments" + ], + "summary": "List comments for a post (public)", + "parameters": [ + { + "type": "integer", + "description": "Post ID", + "name": "post_id", + "in": "query", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/models.CommentDoc" + } + } + } + } + }, + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "Comments" + ], + "summary": "Create comment (public)", + "parameters": [ + { + "description": "Comment payload", + "name": "data", + "in": "body", + "required": true, + "schema": { + "type": "object" + } + } + ], + "responses": { + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/models.CommentDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + } + } + } + }, + "/api/v1/hero": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "Hero" + ], + "summary": "Get active hero/banner", + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "object", + "additionalProperties": true + } + }, + "404": { + "description": "Not Found", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + } + } + } + }, + "/api/v1/heroes": { + "get": { + "description": "Returns all hero/banner records (no filter)", + "produces": [ + "application/json" + ], + "tags": [ + "Hero" + ], + "summary": "Get all heroes", + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": true + } + } + }, + "404": { + "description": "Not Found", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + } + } + } + }, + "/api/v1/posts": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "Posts" + ], + "summary": "List posts (public) with pagination", + "parameters": [ + { + "type": "integer", + "description": "Page number", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "description": "Items per page", + "name": "per_page", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "object", + "additionalProperties": true + } + } + } + } + }, + "/api/v1/posts/{slug}": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "Posts" + ], + "summary": "Get single post (public)", + "parameters": [ + { + "type": "string", + "description": "Post slug", + "name": "slug", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/models.PostDoc" + } + }, + "404": { + "description": "Not Found", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + } + } + } + }, + "/api/v1/product-categories/{id}/view": { + "post": { + "produces": [ + "application/json" + ], + "tags": [ + "Products" + ], + "summary": "Record a view for a product category", + "parameters": [ + { + "type": "integer", + "description": "Category ID", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/models.ProductCategoryViewDoc" + } + } + } + } + }, + "/api/v1/products": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "Products" + ], + "summary": "List products (public) with pagination", + "parameters": [ + { + "type": "integer", + "description": "Page number", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "description": "Items per page", + "name": "per_page", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "object", + "additionalProperties": true + } + } + } + } + }, + "/api/v1/products/{id}/comments": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "Products" + ], + "summary": "Get comments for a product", + "parameters": [ + { + "type": "integer", + "description": "Product ID", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/models.ProductCommentDoc" + } + } + } + } + } + }, + "/api/v1/products/{slug}": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "Products" + ], + "summary": "Get single product (public) by slug", + "parameters": [ + { + "type": "string", + "description": "Product slug", + "name": "slug", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/models.ProductDoc" + } + }, + "404": { + "description": "Not Found", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + } + } + } + }, + "/api/v1/setting": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "Setting" + ], + "summary": "Get site settings", + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "object", + "additionalProperties": true + } + }, + "404": { + "description": "Not Found", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + } + } + } + }, + "/api/v1/tags": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "Tags" + ], + "summary": "List tags (public)", + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/models.TagDoc" + } + } + } + } + } + } + }, + "definitions": { + "controllers.AddToCartRequest": { + "type": "object", + "required": [ + "product_id", + "quantity" + ], + "properties": { + "product_id": { + "type": "integer" + }, + "quantity": { + "type": "integer", + "minimum": 1 + } + } + }, + "controllers.LoginRequest": { + "type": "object", + "required": [ + "email", + "password" + ], + "properties": { + "email": { + "type": "string" + }, + "password": { + "type": "string" + } + } + }, + "controllers.RefreshRequest": { + "type": "object", + "required": [ + "refresh_token" + ], + "properties": { + "refresh_token": { + "type": "string" + } + } + }, + "controllers.RegisterRequest": { + "type": "object", + "required": [ + "email", + "first_name", + "last_name", + "password", + "username" + ], + "properties": { + "email": { + "type": "string" + }, + "first_name": { + "type": "string" + }, + "last_name": { + "type": "string" + }, + "password": { + "type": "string", + "minLength": 6 + }, + "username": { + "type": "string", + "minLength": 3 + } + } + }, + "controllers.ResendVerificationRequest": { + "type": "object", + "required": [ + "email" + ], + "properties": { + "email": { + "type": "string" + } + } + }, + "controllers.UpdateCartItemRequest": { + "type": "object", + "required": [ + "quantity" + ], + "properties": { + "quantity": { + "type": "integer", + "minimum": 1 + } + } + }, + "models.CartDoc": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "items": { + "type": "array", + "items": { + "$ref": "#/definitions/models.CartItemDoc" + } + }, + "user_id": { + "type": "integer" + } + } + }, + "models.CartItemDoc": { + "type": "object", + "properties": { + "cart_id": { + "type": "integer" + }, + "id": { + "type": "integer" + }, + "product": { + "$ref": "#/definitions/models.ProductDoc" + }, + "product_id": { + "type": "integer" + }, + "quantity": { + "type": "integer" + } + } + }, + "models.CategoryDoc": { + "type": "object", + "properties": { + "children": { + "type": "array", + "items": { + "$ref": "#/definitions/models.CategoryDoc" + } + }, + "description": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "parent_id": { + "type": "integer" + }, + "title": { + "type": "string" + } + } + }, + "models.CommentDoc": { + "type": "object", + "properties": { + "body": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "post_id": { + "type": "integer" + }, + "user_id": { + "type": "integer" + } + } + }, + "models.PostDoc": { + "type": "object", + "properties": { + "categories": { + "type": "array", + "items": { + "$ref": "#/definitions/models.CategoryDoc" + } + }, + "content": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "images": { + "type": "array", + "items": { + "type": "string" + } + }, + "tags": { + "type": "array", + "items": { + "$ref": "#/definitions/models.TagDoc" + } + }, + "title": { + "type": "string" + } + } + }, + "models.ProductCategoryDoc": { + "type": "object", + "properties": { + "children": { + "type": "array", + "items": { + "$ref": "#/definitions/models.ProductCategoryDoc" + } + }, + "description": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "keywords": { + "type": "string" + }, + "parent_id": { + "type": "integer" + }, + "slug": { + "type": "string" + }, + "title": { + "type": "string" + } + } + }, + "models.ProductCategoryViewDoc": { + "type": "object", + "properties": { + "category_id": { + "type": "integer" + }, + "id": { + "type": "integer" + }, + "ip_address": { + "type": "string" + } + } + }, + "models.ProductCommentDoc": { + "type": "object", + "properties": { + "body": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "product_id": { + "type": "integer" + }, + "user_id": { + "type": "integer" + } + } + }, + "models.ProductDoc": { + "type": "object", + "properties": { + "categories": { + "type": "array", + "items": { + "$ref": "#/definitions/models.ProductCategoryDoc" + } + }, + "content": { + "type": "string" + }, + "format": { + "type": "string" + }, + "height": { + "type": "integer" + }, + "id": { + "type": "integer" + }, + "images": { + "type": "string" + }, + "price": { + "type": "number" + }, + "quality": { + "type": "integer" + }, + "slug": { + "type": "string" + }, + "tags": { + "type": "array", + "items": { + "$ref": "#/definitions/models.ProductTagDoc" + } + }, + "title": { + "type": "string" + }, + "width": { + "type": "integer" + } + } + }, + "models.ProductTagDoc": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "name": { + "type": "string" + } + } + }, + "models.TagDoc": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "name": { + "type": "string" + } + } + } + }, + "securityDefinitions": { + "BearerAuth": { + "description": "Enter your bearer token in the format 'Bearer {token}'", + "type": "apiKey", + "name": "Authorization", + "in": "header" + } + } +}` + +// SwaggerInfo holds exported Swagger Info so clients can modify it +var SwaggerInfo = &swag.Spec{ + Version: "", + Host: "", + BasePath: "", + Schemes: []string{}, + Title: "", + Description: "", + InfoInstanceName: "swagger", + SwaggerTemplate: docTemplate, + LeftDelim: "{{", + RightDelim: "}}", +} + +func init() { + swag.Register(SwaggerInfo.InstanceName(), SwaggerInfo) +} diff --git a/docs/swagger.json b/docs/swagger.json new file mode 100644 index 0000000..2fb3e56 --- /dev/null +++ b/docs/swagger.json @@ -0,0 +1,1348 @@ +{ + "swagger": "2.0", + "info": { + "contact": {} + }, + "paths": { + "/api/v1/auth/login": { + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "Auth" + ], + "summary": "Login user", + "parameters": [ + { + "description": "Login payload", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/controllers.LoginRequest" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "object", + "additionalProperties": true + } + }, + "400": { + "description": "Bad Request", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "401": { + "description": "Unauthorized", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + } + } + } + }, + "/api/v1/auth/me": { + "get": { + "security": [ + { + "BearerAuth": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Auth" + ], + "summary": "Get current user from token", + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "object", + "additionalProperties": true + } + }, + "401": { + "description": "Unauthorized", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + } + } + } + }, + "/api/v1/auth/refresh": { + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "Auth" + ], + "summary": "Refresh access token", + "parameters": [ + { + "description": "Refresh payload", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/controllers.RefreshRequest" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "400": { + "description": "Bad Request", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "401": { + "description": "Unauthorized", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + } + } + } + }, + "/api/v1/auth/register": { + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "Auth" + ], + "summary": "Register user", + "parameters": [ + { + "description": "Register payload", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/controllers.RegisterRequest" + } + } + ], + "responses": { + "201": { + "description": "Created", + "schema": { + "type": "object", + "additionalProperties": true + } + }, + "400": { + "description": "Bad Request", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "409": { + "description": "Conflict", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + } + } + } + }, + "/api/v1/auth/resend-verification": { + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "Auth" + ], + "summary": "Resend verification email", + "parameters": [ + { + "description": "Resend verification payload", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/controllers.ResendVerificationRequest" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "400": { + "description": "Bad Request", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "404": { + "description": "Not Found", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + } + } + } + }, + "/api/v1/auth/verify-email": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "Auth" + ], + "summary": "Verify email address with token", + "parameters": [ + { + "type": "string", + "description": "Email verify token", + "name": "token", + "in": "query", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "400": { + "description": "Bad Request", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "404": { + "description": "Not Found", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + } + } + } + }, + "/api/v1/cart": { + "get": { + "security": [ + { + "BearerAuth": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Cart" + ], + "summary": "Get the current user's cart", + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/models.CartDoc" + } + }, + "401": { + "description": "Unauthorized", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + } + } + }, + "delete": { + "security": [ + { + "BearerAuth": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Cart" + ], + "summary": "Clear the entire cart", + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/models.CartDoc" + } + }, + "401": { + "description": "Unauthorized", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + } + } + } + }, + "/api/v1/cart/items": { + "post": { + "security": [ + { + "BearerAuth": [] + } + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "Cart" + ], + "summary": "Add item to cart", + "parameters": [ + { + "description": "Cart Item Details", + "name": "data", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/controllers.AddToCartRequest" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/models.CartDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "401": { + "description": "Unauthorized", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "404": { + "description": "Not Found", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + } + } + } + }, + "/api/v1/cart/items/{item_id}": { + "put": { + "security": [ + { + "BearerAuth": [] + } + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "Cart" + ], + "summary": "Update cart item quantity", + "parameters": [ + { + "type": "integer", + "description": "Cart Item ID", + "name": "item_id", + "in": "path", + "required": true + }, + { + "description": "Update Quantity", + "name": "data", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/controllers.UpdateCartItemRequest" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/models.CartDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "401": { + "description": "Unauthorized", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "404": { + "description": "Not Found", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + } + } + }, + "delete": { + "security": [ + { + "BearerAuth": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Cart" + ], + "summary": "Remove item from cart", + "parameters": [ + { + "type": "integer", + "description": "Cart Item ID", + "name": "item_id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/models.CartDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "401": { + "description": "Unauthorized", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "404": { + "description": "Not Found", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + } + } + } + }, + "/api/v1/categories": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "Categories" + ], + "summary": "List categories (public)", + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/models.CategoryDoc" + } + } + } + } + } + }, + "/api/v1/categories/{slug}": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "Categories" + ], + "summary": "Get single category (public)", + "parameters": [ + { + "type": "string", + "description": "Category slug", + "name": "slug", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/models.CategoryDoc" + } + }, + "404": { + "description": "Not Found", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + } + } + } + }, + "/api/v1/comments": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "Comments" + ], + "summary": "List comments for a post (public)", + "parameters": [ + { + "type": "integer", + "description": "Post ID", + "name": "post_id", + "in": "query", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/models.CommentDoc" + } + } + } + } + }, + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "Comments" + ], + "summary": "Create comment (public)", + "parameters": [ + { + "description": "Comment payload", + "name": "data", + "in": "body", + "required": true, + "schema": { + "type": "object" + } + } + ], + "responses": { + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/models.CommentDoc" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + } + } + } + }, + "/api/v1/hero": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "Hero" + ], + "summary": "Get active hero/banner", + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "object", + "additionalProperties": true + } + }, + "404": { + "description": "Not Found", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + } + } + } + }, + "/api/v1/heroes": { + "get": { + "description": "Returns all hero/banner records (no filter)", + "produces": [ + "application/json" + ], + "tags": [ + "Hero" + ], + "summary": "Get all heroes", + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": true + } + } + }, + "404": { + "description": "Not Found", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + } + } + } + }, + "/api/v1/posts": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "Posts" + ], + "summary": "List posts (public) with pagination", + "parameters": [ + { + "type": "integer", + "description": "Page number", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "description": "Items per page", + "name": "per_page", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "object", + "additionalProperties": true + } + } + } + } + }, + "/api/v1/posts/{slug}": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "Posts" + ], + "summary": "Get single post (public)", + "parameters": [ + { + "type": "string", + "description": "Post slug", + "name": "slug", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/models.PostDoc" + } + }, + "404": { + "description": "Not Found", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + } + } + } + }, + "/api/v1/product-categories/{id}/view": { + "post": { + "produces": [ + "application/json" + ], + "tags": [ + "Products" + ], + "summary": "Record a view for a product category", + "parameters": [ + { + "type": "integer", + "description": "Category ID", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/models.ProductCategoryViewDoc" + } + } + } + } + }, + "/api/v1/products": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "Products" + ], + "summary": "List products (public) with pagination", + "parameters": [ + { + "type": "integer", + "description": "Page number", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "description": "Items per page", + "name": "per_page", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "object", + "additionalProperties": true + } + } + } + } + }, + "/api/v1/products/{id}/comments": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "Products" + ], + "summary": "Get comments for a product", + "parameters": [ + { + "type": "integer", + "description": "Product ID", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/models.ProductCommentDoc" + } + } + } + } + } + }, + "/api/v1/products/{slug}": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "Products" + ], + "summary": "Get single product (public) by slug", + "parameters": [ + { + "type": "string", + "description": "Product slug", + "name": "slug", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/models.ProductDoc" + } + }, + "404": { + "description": "Not Found", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + } + } + } + }, + "/api/v1/setting": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "Setting" + ], + "summary": "Get site settings", + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "object", + "additionalProperties": true + } + }, + "404": { + "description": "Not Found", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + } + } + } + }, + "/api/v1/tags": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "Tags" + ], + "summary": "List tags (public)", + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/models.TagDoc" + } + } + } + } + } + } + }, + "definitions": { + "controllers.AddToCartRequest": { + "type": "object", + "required": [ + "product_id", + "quantity" + ], + "properties": { + "product_id": { + "type": "integer" + }, + "quantity": { + "type": "integer", + "minimum": 1 + } + } + }, + "controllers.LoginRequest": { + "type": "object", + "required": [ + "email", + "password" + ], + "properties": { + "email": { + "type": "string" + }, + "password": { + "type": "string" + } + } + }, + "controllers.RefreshRequest": { + "type": "object", + "required": [ + "refresh_token" + ], + "properties": { + "refresh_token": { + "type": "string" + } + } + }, + "controllers.RegisterRequest": { + "type": "object", + "required": [ + "email", + "first_name", + "last_name", + "password", + "username" + ], + "properties": { + "email": { + "type": "string" + }, + "first_name": { + "type": "string" + }, + "last_name": { + "type": "string" + }, + "password": { + "type": "string", + "minLength": 6 + }, + "username": { + "type": "string", + "minLength": 3 + } + } + }, + "controllers.ResendVerificationRequest": { + "type": "object", + "required": [ + "email" + ], + "properties": { + "email": { + "type": "string" + } + } + }, + "controllers.UpdateCartItemRequest": { + "type": "object", + "required": [ + "quantity" + ], + "properties": { + "quantity": { + "type": "integer", + "minimum": 1 + } + } + }, + "models.CartDoc": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "items": { + "type": "array", + "items": { + "$ref": "#/definitions/models.CartItemDoc" + } + }, + "user_id": { + "type": "integer" + } + } + }, + "models.CartItemDoc": { + "type": "object", + "properties": { + "cart_id": { + "type": "integer" + }, + "id": { + "type": "integer" + }, + "product": { + "$ref": "#/definitions/models.ProductDoc" + }, + "product_id": { + "type": "integer" + }, + "quantity": { + "type": "integer" + } + } + }, + "models.CategoryDoc": { + "type": "object", + "properties": { + "children": { + "type": "array", + "items": { + "$ref": "#/definitions/models.CategoryDoc" + } + }, + "description": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "parent_id": { + "type": "integer" + }, + "title": { + "type": "string" + } + } + }, + "models.CommentDoc": { + "type": "object", + "properties": { + "body": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "post_id": { + "type": "integer" + }, + "user_id": { + "type": "integer" + } + } + }, + "models.PostDoc": { + "type": "object", + "properties": { + "categories": { + "type": "array", + "items": { + "$ref": "#/definitions/models.CategoryDoc" + } + }, + "content": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "images": { + "type": "array", + "items": { + "type": "string" + } + }, + "tags": { + "type": "array", + "items": { + "$ref": "#/definitions/models.TagDoc" + } + }, + "title": { + "type": "string" + } + } + }, + "models.ProductCategoryDoc": { + "type": "object", + "properties": { + "children": { + "type": "array", + "items": { + "$ref": "#/definitions/models.ProductCategoryDoc" + } + }, + "description": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "keywords": { + "type": "string" + }, + "parent_id": { + "type": "integer" + }, + "slug": { + "type": "string" + }, + "title": { + "type": "string" + } + } + }, + "models.ProductCategoryViewDoc": { + "type": "object", + "properties": { + "category_id": { + "type": "integer" + }, + "id": { + "type": "integer" + }, + "ip_address": { + "type": "string" + } + } + }, + "models.ProductCommentDoc": { + "type": "object", + "properties": { + "body": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "product_id": { + "type": "integer" + }, + "user_id": { + "type": "integer" + } + } + }, + "models.ProductDoc": { + "type": "object", + "properties": { + "categories": { + "type": "array", + "items": { + "$ref": "#/definitions/models.ProductCategoryDoc" + } + }, + "content": { + "type": "string" + }, + "format": { + "type": "string" + }, + "height": { + "type": "integer" + }, + "id": { + "type": "integer" + }, + "images": { + "type": "string" + }, + "price": { + "type": "number" + }, + "quality": { + "type": "integer" + }, + "slug": { + "type": "string" + }, + "tags": { + "type": "array", + "items": { + "$ref": "#/definitions/models.ProductTagDoc" + } + }, + "title": { + "type": "string" + }, + "width": { + "type": "integer" + } + } + }, + "models.ProductTagDoc": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "name": { + "type": "string" + } + } + }, + "models.TagDoc": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "name": { + "type": "string" + } + } + } + }, + "securityDefinitions": { + "BearerAuth": { + "description": "Enter your bearer token in the format 'Bearer {token}'", + "type": "apiKey", + "name": "Authorization", + "in": "header" + } + } +} \ No newline at end of file diff --git a/docs/swagger.yaml b/docs/swagger.yaml new file mode 100644 index 0000000..b57ec06 --- /dev/null +++ b/docs/swagger.yaml @@ -0,0 +1,872 @@ +definitions: + controllers.AddToCartRequest: + properties: + product_id: + type: integer + quantity: + minimum: 1 + type: integer + required: + - product_id + - quantity + type: object + controllers.LoginRequest: + properties: + email: + type: string + password: + type: string + required: + - email + - password + type: object + controllers.RefreshRequest: + properties: + refresh_token: + type: string + required: + - refresh_token + type: object + controllers.RegisterRequest: + properties: + email: + type: string + first_name: + type: string + last_name: + type: string + password: + minLength: 6 + type: string + username: + minLength: 3 + type: string + required: + - email + - first_name + - last_name + - password + - username + type: object + controllers.ResendVerificationRequest: + properties: + email: + type: string + required: + - email + type: object + controllers.UpdateCartItemRequest: + properties: + quantity: + minimum: 1 + type: integer + required: + - quantity + type: object + models.CartDoc: + properties: + id: + type: integer + items: + items: + $ref: '#/definitions/models.CartItemDoc' + type: array + user_id: + type: integer + type: object + models.CartItemDoc: + properties: + cart_id: + type: integer + id: + type: integer + product: + $ref: '#/definitions/models.ProductDoc' + product_id: + type: integer + quantity: + type: integer + type: object + models.CategoryDoc: + properties: + children: + items: + $ref: '#/definitions/models.CategoryDoc' + type: array + description: + type: string + id: + type: integer + parent_id: + type: integer + title: + type: string + type: object + models.CommentDoc: + properties: + body: + type: string + id: + type: integer + post_id: + type: integer + user_id: + type: integer + type: object + models.PostDoc: + properties: + categories: + items: + $ref: '#/definitions/models.CategoryDoc' + type: array + content: + type: string + id: + type: integer + images: + items: + type: string + type: array + tags: + items: + $ref: '#/definitions/models.TagDoc' + type: array + title: + type: string + type: object + models.ProductCategoryDoc: + properties: + children: + items: + $ref: '#/definitions/models.ProductCategoryDoc' + type: array + description: + type: string + id: + type: integer + keywords: + type: string + parent_id: + type: integer + slug: + type: string + title: + type: string + type: object + models.ProductCategoryViewDoc: + properties: + category_id: + type: integer + id: + type: integer + ip_address: + type: string + type: object + models.ProductCommentDoc: + properties: + body: + type: string + id: + type: integer + product_id: + type: integer + user_id: + type: integer + type: object + models.ProductDoc: + properties: + categories: + items: + $ref: '#/definitions/models.ProductCategoryDoc' + type: array + content: + type: string + format: + type: string + height: + type: integer + id: + type: integer + images: + type: string + price: + type: number + quality: + type: integer + slug: + type: string + tags: + items: + $ref: '#/definitions/models.ProductTagDoc' + type: array + title: + type: string + width: + type: integer + type: object + models.ProductTagDoc: + properties: + id: + type: integer + name: + type: string + type: object + models.TagDoc: + properties: + id: + type: integer + name: + type: string + type: object +info: + contact: {} +paths: + /api/v1/auth/login: + post: + consumes: + - application/json + parameters: + - description: Login payload + in: body + name: request + required: true + schema: + $ref: '#/definitions/controllers.LoginRequest' + produces: + - application/json + responses: + "200": + description: OK + schema: + additionalProperties: true + type: object + "400": + description: Bad Request + schema: + additionalProperties: + type: string + type: object + "401": + description: Unauthorized + schema: + additionalProperties: + type: string + type: object + summary: Login user + tags: + - Auth + /api/v1/auth/me: + get: + produces: + - application/json + responses: + "200": + description: OK + schema: + additionalProperties: true + type: object + "401": + description: Unauthorized + schema: + additionalProperties: + type: string + type: object + security: + - BearerAuth: [] + summary: Get current user from token + tags: + - Auth + /api/v1/auth/refresh: + post: + consumes: + - application/json + parameters: + - description: Refresh payload + in: body + name: request + required: true + schema: + $ref: '#/definitions/controllers.RefreshRequest' + produces: + - application/json + responses: + "200": + description: OK + schema: + additionalProperties: + type: string + type: object + "400": + description: Bad Request + schema: + additionalProperties: + type: string + type: object + "401": + description: Unauthorized + schema: + additionalProperties: + type: string + type: object + summary: Refresh access token + tags: + - Auth + /api/v1/auth/register: + post: + consumes: + - application/json + parameters: + - description: Register payload + in: body + name: request + required: true + schema: + $ref: '#/definitions/controllers.RegisterRequest' + produces: + - application/json + responses: + "201": + description: Created + schema: + additionalProperties: true + type: object + "400": + description: Bad Request + schema: + additionalProperties: + type: string + type: object + "409": + description: Conflict + schema: + additionalProperties: + type: string + type: object + summary: Register user + tags: + - Auth + /api/v1/auth/resend-verification: + post: + consumes: + - application/json + parameters: + - description: Resend verification payload + in: body + name: request + required: true + schema: + $ref: '#/definitions/controllers.ResendVerificationRequest' + produces: + - application/json + responses: + "200": + description: OK + schema: + additionalProperties: + type: string + type: object + "400": + description: Bad Request + schema: + additionalProperties: + type: string + type: object + "404": + description: Not Found + schema: + additionalProperties: + type: string + type: object + summary: Resend verification email + tags: + - Auth + /api/v1/auth/verify-email: + get: + parameters: + - description: Email verify token + in: query + name: token + required: true + type: string + produces: + - application/json + responses: + "200": + description: OK + schema: + additionalProperties: + type: string + type: object + "400": + description: Bad Request + schema: + additionalProperties: + type: string + type: object + "404": + description: Not Found + schema: + additionalProperties: + type: string + type: object + summary: Verify email address with token + tags: + - Auth + /api/v1/cart: + delete: + produces: + - application/json + responses: + "200": + description: OK + schema: + $ref: '#/definitions/models.CartDoc' + "401": + description: Unauthorized + schema: + additionalProperties: + type: string + type: object + security: + - BearerAuth: [] + summary: Clear the entire cart + tags: + - Cart + get: + produces: + - application/json + responses: + "200": + description: OK + schema: + $ref: '#/definitions/models.CartDoc' + "401": + description: Unauthorized + schema: + additionalProperties: + type: string + type: object + security: + - BearerAuth: [] + summary: Get the current user's cart + tags: + - Cart + /api/v1/cart/items: + post: + consumes: + - application/json + parameters: + - description: Cart Item Details + in: body + name: data + required: true + schema: + $ref: '#/definitions/controllers.AddToCartRequest' + produces: + - application/json + responses: + "200": + description: OK + schema: + $ref: '#/definitions/models.CartDoc' + "400": + description: Bad Request + schema: + additionalProperties: + type: string + type: object + "401": + description: Unauthorized + schema: + additionalProperties: + type: string + type: object + "404": + description: Not Found + schema: + additionalProperties: + type: string + type: object + security: + - BearerAuth: [] + summary: Add item to cart + tags: + - Cart + /api/v1/cart/items/{item_id}: + delete: + parameters: + - description: Cart Item ID + in: path + name: item_id + required: true + type: integer + produces: + - application/json + responses: + "200": + description: OK + schema: + $ref: '#/definitions/models.CartDoc' + "400": + description: Bad Request + schema: + additionalProperties: + type: string + type: object + "401": + description: Unauthorized + schema: + additionalProperties: + type: string + type: object + "404": + description: Not Found + schema: + additionalProperties: + type: string + type: object + security: + - BearerAuth: [] + summary: Remove item from cart + tags: + - Cart + put: + consumes: + - application/json + parameters: + - description: Cart Item ID + in: path + name: item_id + required: true + type: integer + - description: Update Quantity + in: body + name: data + required: true + schema: + $ref: '#/definitions/controllers.UpdateCartItemRequest' + produces: + - application/json + responses: + "200": + description: OK + schema: + $ref: '#/definitions/models.CartDoc' + "400": + description: Bad Request + schema: + additionalProperties: + type: string + type: object + "401": + description: Unauthorized + schema: + additionalProperties: + type: string + type: object + "404": + description: Not Found + schema: + additionalProperties: + type: string + type: object + security: + - BearerAuth: [] + summary: Update cart item quantity + tags: + - Cart + /api/v1/categories: + get: + produces: + - application/json + responses: + "200": + description: OK + schema: + items: + $ref: '#/definitions/models.CategoryDoc' + type: array + summary: List categories (public) + tags: + - Categories + /api/v1/categories/{slug}: + get: + parameters: + - description: Category slug + in: path + name: slug + required: true + type: string + produces: + - application/json + responses: + "200": + description: OK + schema: + $ref: '#/definitions/models.CategoryDoc' + "404": + description: Not Found + schema: + additionalProperties: + type: string + type: object + summary: Get single category (public) + tags: + - Categories + /api/v1/comments: + get: + parameters: + - description: Post ID + in: query + name: post_id + required: true + type: integer + produces: + - application/json + responses: + "200": + description: OK + schema: + items: + $ref: '#/definitions/models.CommentDoc' + type: array + summary: List comments for a post (public) + tags: + - Comments + post: + consumes: + - application/json + parameters: + - description: Comment payload + in: body + name: data + required: true + schema: + type: object + produces: + - application/json + responses: + "201": + description: Created + schema: + $ref: '#/definitions/models.CommentDoc' + "400": + description: Bad Request + schema: + additionalProperties: + type: string + type: object + summary: Create comment (public) + tags: + - Comments + /api/v1/hero: + get: + produces: + - application/json + responses: + "200": + description: OK + schema: + additionalProperties: true + type: object + "404": + description: Not Found + schema: + additionalProperties: + type: string + type: object + summary: Get active hero/banner + tags: + - Hero + /api/v1/heroes: + get: + description: Returns all hero/banner records (no filter) + produces: + - application/json + responses: + "200": + description: OK + schema: + items: + additionalProperties: true + type: object + type: array + "404": + description: Not Found + schema: + additionalProperties: + type: string + type: object + summary: Get all heroes + tags: + - Hero + /api/v1/posts: + get: + parameters: + - description: Page number + in: query + name: page + type: integer + - description: Items per page + in: query + name: per_page + type: integer + produces: + - application/json + responses: + "200": + description: OK + schema: + additionalProperties: true + type: object + summary: List posts (public) with pagination + tags: + - Posts + /api/v1/posts/{slug}: + get: + parameters: + - description: Post slug + in: path + name: slug + required: true + type: string + produces: + - application/json + responses: + "200": + description: OK + schema: + $ref: '#/definitions/models.PostDoc' + "404": + description: Not Found + schema: + additionalProperties: + type: string + type: object + summary: Get single post (public) + tags: + - Posts + /api/v1/product-categories/{id}/view: + post: + parameters: + - description: Category ID + in: path + name: id + required: true + type: integer + produces: + - application/json + responses: + "201": + description: Created + schema: + $ref: '#/definitions/models.ProductCategoryViewDoc' + summary: Record a view for a product category + tags: + - Products + /api/v1/products: + get: + parameters: + - description: Page number + in: query + name: page + type: integer + - description: Items per page + in: query + name: per_page + type: integer + produces: + - application/json + responses: + "200": + description: OK + schema: + additionalProperties: true + type: object + summary: List products (public) with pagination + tags: + - Products + /api/v1/products/{id}/comments: + get: + parameters: + - description: Product ID + in: path + name: id + required: true + type: integer + produces: + - application/json + responses: + "200": + description: OK + schema: + items: + $ref: '#/definitions/models.ProductCommentDoc' + type: array + summary: Get comments for a product + tags: + - Products + /api/v1/products/{slug}: + get: + parameters: + - description: Product slug + in: path + name: slug + required: true + type: string + produces: + - application/json + responses: + "200": + description: OK + schema: + $ref: '#/definitions/models.ProductDoc' + "404": + description: Not Found + schema: + additionalProperties: + type: string + type: object + summary: Get single product (public) by slug + tags: + - Products + /api/v1/setting: + get: + produces: + - application/json + responses: + "200": + description: OK + schema: + additionalProperties: true + type: object + "404": + description: Not Found + schema: + additionalProperties: + type: string + type: object + summary: Get site settings + tags: + - Setting + /api/v1/tags: + get: + produces: + - application/json + responses: + "200": + description: OK + schema: + items: + $ref: '#/definitions/models.TagDoc' + type: array + summary: List tags (public) + tags: + - Tags +securityDefinitions: + BearerAuth: + description: Enter your bearer token in the format 'Bearer {token}' + in: header + name: Authorization + type: apiKey +swagger: "2.0" diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..55a592b --- /dev/null +++ b/go.mod @@ -0,0 +1,70 @@ +module ares + +go 1.26.0 + +require ( + github.com/go-playground/validator/v10 v10.30.1 + github.com/gofiber/fiber/v3 v3.0.0 + github.com/gofiber/template/html/v2 v2.1.3 + github.com/golang-jwt/jwt/v5 v5.3.1 + github.com/h2non/bimg v1.1.9 + github.com/joho/godotenv v1.5.1 + github.com/redis/go-redis/v9 v9.18.0 + github.com/swaggo/swag v1.16.6 + go.uber.org/zap v1.27.1 + golang.org/x/crypto v0.48.0 + gorm.io/driver/mysql v1.6.0 + gorm.io/driver/postgres v1.6.0 + gorm.io/gorm v1.31.1 +) + +require ( + filippo.io/edwards25519 v1.2.0 // indirect + github.com/KyleBanks/depth v1.2.1 // indirect + github.com/andybalholm/brotli v1.2.0 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect + github.com/gabriel-vasile/mimetype v1.4.13 // indirect + github.com/go-openapi/jsonpointer v0.22.4 // indirect + github.com/go-openapi/jsonreference v0.21.4 // indirect + github.com/go-openapi/spec v0.22.3 // indirect + github.com/go-openapi/swag/conv v0.25.4 // indirect + github.com/go-openapi/swag/jsonname v0.25.4 // indirect + github.com/go-openapi/swag/jsonutils v0.25.4 // indirect + github.com/go-openapi/swag/loading v0.25.4 // indirect + github.com/go-openapi/swag/stringutils v0.25.4 // indirect + github.com/go-openapi/swag/typeutils v0.25.4 // indirect + github.com/go-openapi/swag/yamlutils v0.25.4 // indirect + github.com/go-playground/locales v0.14.1 // indirect + github.com/go-playground/universal-translator v0.18.1 // indirect + github.com/go-sql-driver/mysql v1.9.3 // indirect + github.com/gofiber/schema v1.7.0 // indirect + github.com/gofiber/template v1.8.3 // indirect + github.com/gofiber/utils v1.2.0 // indirect + github.com/gofiber/utils/v2 v2.0.2 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/jackc/pgpassfile v1.0.0 // indirect + github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect + github.com/jackc/pgx/v5 v5.8.0 // indirect + github.com/jackc/puddle/v2 v2.2.2 // indirect + github.com/jinzhu/inflection v1.0.0 // indirect + github.com/jinzhu/now v1.1.5 // indirect + github.com/klauspost/compress v1.18.4 // indirect + github.com/leodido/go-urn v1.4.0 // indirect + github.com/mattn/go-colorable v0.1.14 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect + github.com/philhofer/fwd v1.2.0 // indirect + github.com/rogpeppe/go-internal v1.14.1 // indirect + github.com/tinylib/msgp v1.6.3 // indirect + github.com/valyala/bytebufferpool v1.0.0 // indirect + github.com/valyala/fasthttp v1.69.0 // indirect + go.uber.org/atomic v1.11.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + go.yaml.in/yaml/v3 v3.0.4 // indirect + golang.org/x/mod v0.33.0 // indirect + golang.org/x/net v0.50.0 // indirect + golang.org/x/sync v0.19.0 // indirect + golang.org/x/sys v0.41.0 // indirect + golang.org/x/text v0.34.0 // indirect + golang.org/x/tools v0.42.0 // indirect +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..ee275b8 --- /dev/null +++ b/go.sum @@ -0,0 +1,172 @@ +filippo.io/edwards25519 v1.2.0 h1:crnVqOiS4jqYleHd9vaKZ+HKtHfllngJIiOpNpoJsjo= +filippo.io/edwards25519 v1.2.0/go.mod h1:xzAOLCNug/yB62zG1bQ8uziwrIqIuxhctzJT18Q77mc= +github.com/KyleBanks/depth v1.2.1 h1:5h8fQADFrWtarTdtDudMmGsC7GPbOAu6RVB3ffsVFHc= +github.com/KyleBanks/depth v1.2.1/go.mod h1:jzSb9d0L43HxTQfT+oSA1EEp2q+ne2uh6XgeJcm8brE= +github.com/andybalholm/brotli v1.2.0 h1:ukwgCxwYrmACq68yiUqwIWnGY0cTPox/M94sVwToPjQ= +github.com/andybalholm/brotli v1.2.0/go.mod h1:rzTDkvFWvIrjDXZHkuS16NPggd91W3kUSvPlQ1pLaKY= +github.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs= +github.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c= +github.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA= +github.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= +github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= +github.com/fxamacker/cbor/v2 v2.9.0 h1:NpKPmjDBgUfBms6tr6JZkTHtfFGcMKsw3eGcmD/sapM= +github.com/fxamacker/cbor/v2 v2.9.0/go.mod h1:vM4b+DJCtHn+zz7h3FFp/hDAI9WNWCsZj23V5ytsSxQ= +github.com/gabriel-vasile/mimetype v1.4.13 h1:46nXokslUBsAJE/wMsp5gtO500a4F3Nkz9Ufpk2AcUM= +github.com/gabriel-vasile/mimetype v1.4.13/go.mod h1:d+9Oxyo1wTzWdyVUPMmXFvp4F9tea18J8ufA774AB3s= +github.com/go-openapi/jsonpointer v0.22.4 h1:dZtK82WlNpVLDW2jlA1YCiVJFVqkED1MegOUy9kR5T4= +github.com/go-openapi/jsonpointer v0.22.4/go.mod h1:elX9+UgznpFhgBuaMQ7iu4lvvX1nvNsesQ3oxmYTw80= +github.com/go-openapi/jsonreference v0.21.4 h1:24qaE2y9bx/q3uRK/qN+TDwbok1NhbSmGjjySRCHtC8= +github.com/go-openapi/jsonreference v0.21.4/go.mod h1:rIENPTjDbLpzQmQWCj5kKj3ZlmEh+EFVbz3RTUh30/4= +github.com/go-openapi/spec v0.22.3 h1:qRSmj6Smz2rEBxMnLRBMeBWxbbOvuOoElvSvObIgwQc= +github.com/go-openapi/spec v0.22.3/go.mod h1:iIImLODL2loCh3Vnox8TY2YWYJZjMAKYyLH2Mu8lOZs= +github.com/go-openapi/swag v0.19.15 h1:D2NRCBzS9/pEY3gP9Nl8aDqGUcPFrwG2p+CNFrLyrCM= +github.com/go-openapi/swag/conv v0.25.4 h1:/Dd7p0LZXczgUcC/Ikm1+YqVzkEeCc9LnOWjfkpkfe4= +github.com/go-openapi/swag/conv v0.25.4/go.mod h1:3LXfie/lwoAv0NHoEuY1hjoFAYkvlqI/Bn5EQDD3PPU= +github.com/go-openapi/swag/jsonname v0.25.4 h1:bZH0+MsS03MbnwBXYhuTttMOqk+5KcQ9869Vye1bNHI= +github.com/go-openapi/swag/jsonname v0.25.4/go.mod h1:GPVEk9CWVhNvWhZgrnvRA6utbAltopbKwDu8mXNUMag= +github.com/go-openapi/swag/jsonutils v0.25.4 h1:VSchfbGhD4UTf4vCdR2F4TLBdLwHyUDTd1/q4i+jGZA= +github.com/go-openapi/swag/jsonutils v0.25.4/go.mod h1:7OYGXpvVFPn4PpaSdPHJBtF0iGnbEaTk8AvBkoWnaAY= +github.com/go-openapi/swag/jsonutils/fixtures_test v0.25.4 h1:IACsSvBhiNJwlDix7wq39SS2Fh7lUOCJRmx/4SN4sVo= +github.com/go-openapi/swag/jsonutils/fixtures_test v0.25.4/go.mod h1:Mt0Ost9l3cUzVv4OEZG+WSeoHwjWLnarzMePNDAOBiM= +github.com/go-openapi/swag/loading v0.25.4 h1:jN4MvLj0X6yhCDduRsxDDw1aHe+ZWoLjW+9ZQWIKn2s= +github.com/go-openapi/swag/loading v0.25.4/go.mod h1:rpUM1ZiyEP9+mNLIQUdMiD7dCETXvkkC30z53i+ftTE= +github.com/go-openapi/swag/stringutils v0.25.4 h1:O6dU1Rd8bej4HPA3/CLPciNBBDwZj9HiEpdVsb8B5A8= +github.com/go-openapi/swag/stringutils v0.25.4/go.mod h1:GTsRvhJW5xM5gkgiFe0fV3PUlFm0dr8vki6/VSRaZK0= +github.com/go-openapi/swag/typeutils v0.25.4 h1:1/fbZOUN472NTc39zpa+YGHn3jzHWhv42wAJSN91wRw= +github.com/go-openapi/swag/typeutils v0.25.4/go.mod h1:Ou7g//Wx8tTLS9vG0UmzfCsjZjKhpjxayRKTHXf2pTE= +github.com/go-openapi/swag/yamlutils v0.25.4 h1:6jdaeSItEUb7ioS9lFoCZ65Cne1/RZtPBZ9A56h92Sw= +github.com/go-openapi/swag/yamlutils v0.25.4/go.mod h1:MNzq1ulQu+yd8Kl7wPOut/YHAAU/H6hL91fF+E2RFwc= +github.com/go-openapi/testify/enable/yaml/v2 v2.0.2 h1:0+Y41Pz1NkbTHz8NngxTuAXxEodtNSI1WG1c/m5Akw4= +github.com/go-openapi/testify/enable/yaml/v2 v2.0.2/go.mod h1:kme83333GCtJQHXQ8UKX3IBZu6z8T5Dvy5+CW3NLUUg= +github.com/go-openapi/testify/v2 v2.0.2 h1:X999g3jeLcoY8qctY/c/Z8iBHTbwLz7R2WXd6Ub6wls= +github.com/go-openapi/testify/v2 v2.0.2/go.mod h1:HCPmvFFnheKK2BuwSA0TbbdxJ3I16pjwMkYkP4Ywn54= +github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= +github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= +github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= +github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= +github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= +github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= +github.com/go-playground/validator/v10 v10.30.1 h1:f3zDSN/zOma+w6+1Wswgd9fLkdwy06ntQJp0BBvFG0w= +github.com/go-playground/validator/v10 v10.30.1/go.mod h1:oSuBIQzuJxL//3MelwSLD5hc2Tu889bF0Idm9Dg26cM= +github.com/go-sql-driver/mysql v1.9.3 h1:U/N249h2WzJ3Ukj8SowVFjdtZKfu9vlLZxjPXV1aweo= +github.com/go-sql-driver/mysql v1.9.3/go.mod h1:qn46aNg1333BRMNU69Lq93t8du/dwxI64Gl8i5p1WMU= +github.com/gofiber/fiber/v3 v3.0.0 h1:GPeCG8X60L42wLKrzgeewDHBr6pE6veAvwaXsqD3Xjk= +github.com/gofiber/fiber/v3 v3.0.0/go.mod h1:kVZiO/AwyT5Pq6PgC8qRCJ+j/BHrMy5jNw1O9yH38aY= +github.com/gofiber/schema v1.7.0 h1:yNM+FNRZjyYEli9Ey0AXRBrAY9jTnb+kmGs3lJGPvKg= +github.com/gofiber/schema v1.7.0/go.mod h1:A/X5Ffyru4p9eBdp99qu+nzviHzQiZ7odLT+TwxWhbk= +github.com/gofiber/template v1.8.3 h1:hzHdvMwMo/T2kouz2pPCA0zGiLCeMnoGsQZBTSYgZxc= +github.com/gofiber/template v1.8.3/go.mod h1:bs/2n0pSNPOkRa5VJ8zTIvedcI/lEYxzV3+YPXdBvq8= +github.com/gofiber/template/html/v2 v2.1.3 h1:n1LYBtmr9C0V/k/3qBblXyMxV5B0o/gpb6dFLp8ea+o= +github.com/gofiber/template/html/v2 v2.1.3/go.mod h1:U5Fxgc5KpyujU9OqKzy6Kn6Qup6Tm7zdsISR+VpnHRE= +github.com/gofiber/utils v1.2.0 h1:NCaqd+Efg3khhN++eeUUTyBz+byIxAsmIjpl8kKOMIc= +github.com/gofiber/utils v1.2.0/go.mod h1:poZpsnhBykfnY1Mc0KeEa6mSHrS3dV0+oBWyeQmb2e0= +github.com/gofiber/utils/v2 v2.0.2 h1:ShRRssz0F3AhTlAQcuEj54OEDtWF7+HJDwEi/aa6QLI= +github.com/gofiber/utils/v2 v2.0.2/go.mod h1:+9Ub4NqQ+IaJoTliq5LfdmOJAA/Hzwf4pXOxOa3RrJ0= +github.com/golang-jwt/jwt/v5 v5.3.1 h1:kYf81DTWFe7t+1VvL7eS+jKFVWaUnK9cB1qbwn63YCY= +github.com/golang-jwt/jwt/v5 v5.3.1/go.mod h1:fxCRLWMO43lRc8nhHWY6LGqRcf+1gQWArsqaEUEa5bE= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/h2non/bimg v1.1.9 h1:WH20Nxko9l/HFm4kZCA3Phbgu2cbHvYzxwxn9YROEGg= +github.com/h2non/bimg v1.1.9/go.mod h1:R3+UiYwkK4rQl6KVFTOFJHitgLbZXBZNFh2cv3AEbp8= +github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= +github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= +github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 h1:iCEnooe7UlwOQYpKFhBabPMi4aNAfoODPEFNiAnClxo= +github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= +github.com/jackc/pgx/v5 v5.8.0 h1:TYPDoleBBme0xGSAX3/+NujXXtpZn9HBONkQC7IEZSo= +github.com/jackc/pgx/v5 v5.8.0/go.mod h1:QVeDInX2m9VyzvNeiCJVjCkNFqzsNb43204HshNSZKw= +github.com/jackc/puddle/v2 v2.2.2 h1:PR8nw+E/1w0GLuRFSmiioY6UooMp6KJv0/61nB7icHo= +github.com/jackc/puddle/v2 v2.2.2/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= +github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= +github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= +github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= +github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= +github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= +github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= +github.com/klauspost/compress v1.18.4 h1:RPhnKRAQ4Fh8zU2FY/6ZFDwTVTxgJ/EMydqSTzE9a2c= +github.com/klauspost/compress v1.18.4/go.mod h1:R0h/fSBs8DE4ENlcrlib3PsXS61voFxhIs2DeRhCvJ4= +github.com/klauspost/cpuid/v2 v2.0.9 h1:lgaqFMSdTdQYdZ04uHyN2d/eKdOMyi2YLSvlQIBFYa4= +github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= +github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ= +github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI= +github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE= +github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/philhofer/fwd v1.2.0 h1:e6DnBTl7vGY+Gz322/ASL4Gyp1FspeMvx1RNDoToZuM= +github.com/philhofer/fwd v1.2.0/go.mod h1:RqIHx9QI14HlwKwm98g9Re5prTQ6LdeRQn+gXJFxsJM= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/redis/go-redis/v9 v9.18.0 h1:pMkxYPkEbMPwRdenAzUNyFNrDgHx9U+DrBabWNfSRQs= +github.com/redis/go-redis/v9 v9.18.0/go.mod h1:k3ufPphLU5YXwNTUcCRXGxUoF1fqxnhFQmscfkCoDA0= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= +github.com/shamaton/msgpack/v3 v3.1.0 h1:jsk0vEAqVvvS9+fTZ5/EcQ9tz860c9pWxJ4Iwecz8gU= +github.com/shamaton/msgpack/v3 v3.1.0/go.mod h1:DcQG8jrdrQCIxr3HlMYkiXdMhK+KfN2CitkyzsQV4uc= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/swaggo/swag v1.16.6 h1:qBNcx53ZaX+M5dxVyTrgQ0PJ/ACK+NzhwcbieTt+9yI= +github.com/swaggo/swag v1.16.6/go.mod h1:ngP2etMK5a0P3QBizic5MEwpRmluJZPHjXcMoj4Xesg= +github.com/tinylib/msgp v1.6.3 h1:bCSxiTz386UTgyT1i0MSCvdbWjVW+8sG3PjkGsZQt4s= +github.com/tinylib/msgp v1.6.3/go.mod h1:RSp0LW9oSxFut3KzESt5Voq4GVWyS+PSulT77roAqEA= +github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= +github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= +github.com/valyala/fasthttp v1.69.0 h1:fNLLESD2SooWeh2cidsuFtOcrEi4uB4m1mPrkJMZyVI= +github.com/valyala/fasthttp v1.69.0/go.mod h1:4wA4PfAraPlAsJ5jMSqCE2ug5tqUPwKXxVj8oNECGcw= +github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= +github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= +github.com/xyproto/randomstring v1.0.5 h1:YtlWPoRdgMu3NZtP45drfy1GKoojuR7hmRcnhZqKjWU= +github.com/xyproto/randomstring v1.0.5/go.mod h1:rgmS5DeNXLivK7YprL0pY+lTuhNQW3iGxZ18UQApw/E= +github.com/zeebo/xxh3 v1.0.2 h1:xZmwmqxHZA8AI603jOQ0tMqmBr9lPeFwGg6d+xy9DC0= +github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA= +go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= +go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.27.1 h1:08RqriUEv8+ArZRYSTXy1LeBScaMpVSTBhCeaZYfMYc= +go.uber.org/zap v1.27.1/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= +golang.org/x/crypto v0.48.0 h1:/VRzVqiRSggnhY7gNRxPauEQ5Drw9haKdM0jqfcCFts= +golang.org/x/crypto v0.48.0/go.mod h1:r0kV5h3qnFPlQnBSrULhlsRfryS2pmewsg+XfMgkVos= +golang.org/x/mod v0.33.0 h1:tHFzIWbBifEmbwtGz65eaWyGiGZatSrT9prnU8DbVL8= +golang.org/x/mod v0.33.0/go.mod h1:swjeQEj+6r7fODbD2cqrnje9PnziFuw4bmLbBZFrQ5w= +golang.org/x/net v0.50.0 h1:ucWh9eiCGyDR3vtzso0WMQinm2Dnt8cFMuQa9K33J60= +golang.org/x/net v0.50.0/go.mod h1:UgoSli3F/pBgdJBHCTc+tp3gmrU4XswgGRgtnwWTfyM= +golang.org/x/sync v0.19.0 h1:vV+1eWNmZ5geRlYjzm2adRgW2/mcpevXNg50YZtPCE4= +golang.org/x/sync v0.19.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.41.0 h1:Ivj+2Cp/ylzLiEU89QhWblYnOE9zerudt9Ftecq2C6k= +golang.org/x/sys v0.41.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/text v0.34.0 h1:oL/Qq0Kdaqxa1KbNeMKwQq0reLCCaFtqu2eNuSeNHbk= +golang.org/x/text v0.34.0/go.mod h1:homfLqTYRFyVYemLBFl5GgL/DWEiH5wcsQ5gSh1yziA= +golang.org/x/tools v0.42.0 h1:uNgphsn75Tdz5Ji2q36v/nsFSfR/9BRFvqhGBaJGd5k= +golang.org/x/tools v0.42.0/go.mod h1:Ma6lCIwGZvHK6XtgbswSoWroEkhugApmsXyrUmBhfr0= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gorm.io/driver/mysql v1.6.0 h1:eNbLmNTpPpTOVZi8MMxCi2aaIm0ZpInbORNXDwyLGvg= +gorm.io/driver/mysql v1.6.0/go.mod h1:D/oCC2GWK3M/dqoLxnOlaNKmXz8WNTfcS9y5ovaSqKo= +gorm.io/driver/postgres v1.6.0 h1:2dxzU8xJ+ivvqTRph34QX+WrRaJlmfyPqXmoGVjMBa4= +gorm.io/driver/postgres v1.6.0/go.mod h1:vUw0mrGgrTK+uPHEhAdV4sfFELrByKVGnaVRkXDhtWo= +gorm.io/gorm v1.31.1 h1:7CA8FTFz/gRfgqgpeKIBcervUn3xSyPUmr6B2WXJ7kg= +gorm.io/gorm v1.31.1/go.mod h1:XyQVbO2k6YkOis7C2437jSit3SsDK72s7n7rsSHd+Gs= diff --git a/info.log b/info.log new file mode 100644 index 0000000..ac58cb5 --- /dev/null +++ b/info.log @@ -0,0 +1,122 @@ +2026-02-23T21:56:56.830+0300 INFO config/loger.go:38 Logger başlatıldı (konsol + info.log) +2026-02-23T21:56:56.831+0300 INFO config/mysql_db.go:24 Yapılandırmada DB_URL bulundu, veritabanına bağlanılmaya çalışılıyor... +2026-02-23T21:56:56.840+0300 INFO config/mysql_db.go:43 MySQL veritabanı bağlantısı kuruldu. +2026-02-23T21:56:56.840+0300 INFO config/postgres_db.go:24 Yapılandırmada DB_URL_PG bulundu, veritabanına bağlanılmaya çalışılıyor... +2026-02-23T21:56:56.863+0300 INFO config/postgres_db.go:43 Postgres veritabanı bağlantısı kuruldu. +2026-02-23T21:56:56.872+0300 INFO config/redis_db.go:47 Connected to Redis successfully +2026-02-23T21:56:58.231+0300 INFO migrate/migrate.go:40 AutoMigrate Yapıldı. +2026-02-23T21:57:00.289+0300 INFO migrate/migrate.go:73 PG AutoMigrate Yapıldı. +2026-02-23T21:57:00.289+0300 INFO ares/main.go:33 Init Uygulandı !! +2026-02-23T21:57:26.962+0300 INFO middlewares/rate_limit.go:133 [rate-limit][config] loaded from db name=global active=true max=1000 window=60s +2026-02-23T21:57:26.967+0300 INFO middlewares/rate_limit.go:133 [rate-limit][allow] name=global ip=127.0.0.1 count=1 max=1000 window=60s +2026-02-23T21:57:26.971+0300 INFO middlewares/rate_limit.go:133 [rate-limit][config] loaded from db name=login active=true max=10 window=60s +2026-02-23T21:57:26.976+0300 INFO middlewares/rate_limit.go:133 [rate-limit][allow] name=login ip=127.0.0.1 count=1 max=10 window=60s +2026-02-23T21:57:38.055+0300 INFO middlewares/rate_limit.go:133 [rate-limit][allow] name=global ip=127.0.0.1 count=2 max=1000 window=60s +2026-02-23T21:57:38.120+0300 INFO middlewares/rate_limit.go:133 [rate-limit][allow] name=login ip=127.0.0.1 count=2 max=10 window=60s +2026-02-23T21:57:38.197+0300 DEBUG services/jwt_service.go:99 Generated token pair for user=6 email=beyhan@beyhan.dev access_exp=120m refresh_exp=30d +2026-02-23T21:57:38.197+0300 DEBUG services/jwt_service.go:100 access: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjo2LCJlbWFpbCI6ImJleWhhbkBiZXloYW4uZGV2IiwiaXNfYWRtaW4iOnRydWUsImZpcnN0X25hbWUiOiJCZXloYW4iLCJsYXN0X25hbWUiOiJPxJ91ciIsInRva2VuX3R5cGUiOiJhY2Nlc3MiLCJzdWIiOiI2IiwiZXhwIjoxNzcxODgwMjU4LCJpYXQiOjE3NzE4NzMwNTh9.eQn5baJqBZGMc7UH2JIZe3a9iEDxlQWOKqXy0LJGt9o +2026-02-23T21:57:38.197+0300 DEBUG services/jwt_service.go:101 refresh: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjo2LCJlbWFpbCI6ImJleWhhbkBiZXloYW4uZGV2IiwiaXNfYWRtaW4iOnRydWUsImZpcnN0X25hbWUiOiJCZXloYW4iLCJsYXN0X25hbWUiOiJPxJ91ciIsInRva2VuX3R5cGUiOiJyZWZyZXNoIiwic3ViIjoiNiIsImV4cCI6MTc3NDQ2NTA1OCwiaWF0IjoxNzcxODczMDU4fQ.0TKUZEmobCOsM-Cb78ZEu2KT5hi5N7FHLUyIYvIOcKQ +2026-02-23T21:57:50.502+0300 INFO middlewares/rate_limit.go:133 [rate-limit][allow] name=global ip=127.0.0.1 count=3 max=1000 window=60s +2026-02-23T21:57:50.505+0300 INFO middlewares/rate_limit.go:133 [rate-limit][allow] name=login ip=127.0.0.1 count=3 max=10 window=60s +2026-02-23T21:57:50.580+0300 DEBUG services/jwt_service.go:99 Generated token pair for user=6 email=beyhan@beyhan.dev access_exp=120m refresh_exp=30d +2026-02-23T21:57:50.581+0300 DEBUG services/jwt_service.go:100 access: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjo2LCJlbWFpbCI6ImJleWhhbkBiZXloYW4uZGV2IiwiaXNfYWRtaW4iOnRydWUsImZpcnN0X25hbWUiOiJCZXloYW4iLCJsYXN0X25hbWUiOiJPxJ91ciIsInRva2VuX3R5cGUiOiJhY2Nlc3MiLCJzdWIiOiI2IiwiZXhwIjoxNzcxODgwMjcwLCJpYXQiOjE3NzE4NzMwNzB9.7T8ohPWe5Fpz4JQzVBWyQSL1EOfB0OPIkRjdQIhKOHI +2026-02-23T21:57:50.581+0300 DEBUG services/jwt_service.go:101 refresh: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjo2LCJlbWFpbCI6ImJleWhhbkBiZXloYW4uZGV2IiwiaXNfYWRtaW4iOnRydWUsImZpcnN0X25hbWUiOiJCZXloYW4iLCJsYXN0X25hbWUiOiJPxJ91ciIsInRva2VuX3R5cGUiOiJyZWZyZXNoIiwic3ViIjoiNiIsImV4cCI6MTc3NDQ2NTA3MCwiaWF0IjoxNzcxODczMDcwfQ.0CLdSn3MN_FgF0Fd1Hsg2DJ1cOXEGxaYziav56hadJc +2026-02-23T21:58:10.580+0300 INFO middlewares/rate_limit.go:133 [rate-limit][allow] name=global ip=127.0.0.1 count=4 max=1000 window=60s +2026-02-23T21:58:10.583+0300 INFO middlewares/rate_limit.go:133 [rate-limit][allow] name=login ip=127.0.0.1 count=4 max=10 window=60s +2026-02-23T21:58:10.656+0300 DEBUG services/jwt_service.go:99 Generated token pair for user=6 email=beyhan@beyhan.dev access_exp=120m refresh_exp=30d +2026-02-23T21:58:10.656+0300 DEBUG services/jwt_service.go:100 access: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjo2LCJlbWFpbCI6ImJleWhhbkBiZXloYW4uZGV2IiwiaXNfYWRtaW4iOnRydWUsImZpcnN0X25hbWUiOiJCZXloYW4iLCJsYXN0X25hbWUiOiJPxJ91ciIsInRva2VuX3R5cGUiOiJhY2Nlc3MiLCJzdWIiOiI2IiwiZXhwIjoxNzcxODgwMjkwLCJpYXQiOjE3NzE4NzMwOTB9.tDttLqMDK7Hi59vTCPNcuSglYMpVQ0Kv6QeYIG27KT0 +2026-02-23T21:58:10.656+0300 DEBUG services/jwt_service.go:101 refresh: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjo2LCJlbWFpbCI6ImJleWhhbkBiZXloYW4uZGV2IiwiaXNfYWRtaW4iOnRydWUsImZpcnN0X25hbWUiOiJCZXloYW4iLCJsYXN0X25hbWUiOiJPxJ91ciIsInRva2VuX3R5cGUiOiJyZWZyZXNoIiwic3ViIjoiNiIsImV4cCI6MTc3NDQ2NTA5MCwiaWF0IjoxNzcxODczMDkwfQ.usHKEsUl_jjX4DP2Cb2guOaKh2aOyUAOHPFI_lhZtvQ +2026-02-23T21:58:31.767+0300 INFO middlewares/rate_limit.go:133 [rate-limit][config] loaded from db name=global active=true max=1000 window=60s +2026-02-23T21:58:31.772+0300 INFO middlewares/rate_limit.go:133 [rate-limit][allow] name=global ip=127.0.0.1 count=1 max=1000 window=60s +2026-02-23T21:58:31.776+0300 INFO middlewares/rate_limit.go:133 [rate-limit][config] loaded from db name=login active=true max=10 window=60s +2026-02-23T21:58:31.780+0300 INFO middlewares/rate_limit.go:133 [rate-limit][allow] name=login ip=127.0.0.1 count=1 max=10 window=60s +2026-02-23T21:58:31.857+0300 DEBUG services/jwt_service.go:99 Generated token pair for user=6 email=beyhan@beyhan.dev access_exp=120m refresh_exp=30d +2026-02-23T21:58:31.857+0300 DEBUG services/jwt_service.go:100 access: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjo2LCJlbWFpbCI6ImJleWhhbkBiZXloYW4uZGV2IiwiaXNfYWRtaW4iOnRydWUsImZpcnN0X25hbWUiOiJCZXloYW4iLCJsYXN0X25hbWUiOiJPxJ91ciIsInRva2VuX3R5cGUiOiJhY2Nlc3MiLCJzdWIiOiI2IiwiZXhwIjoxNzcxODgwMzExLCJpYXQiOjE3NzE4NzMxMTF9.eaq_jE89NmrRTYmZ2zD1xo2Kf3Y6hSu-uiFxhYZvIlQ +2026-02-23T21:58:31.857+0300 DEBUG services/jwt_service.go:101 refresh: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjo2LCJlbWFpbCI6ImJleWhhbkBiZXloYW4uZGV2IiwiaXNfYWRtaW4iOnRydWUsImZpcnN0X25hbWUiOiJCZXloYW4iLCJsYXN0X25hbWUiOiJPxJ91ciIsInRva2VuX3R5cGUiOiJyZWZyZXNoIiwic3ViIjoiNiIsImV4cCI6MTc3NDQ2NTExMSwiaWF0IjoxNzcxODczMTExfQ.-WPEidNaYdXAPghF9_usm4jHP7k1YvtyHCnuOP6Vzqc +2026-02-23T22:00:27.844+0300 INFO middlewares/rate_limit.go:133 [rate-limit][config] loaded from db name=global active=true max=1000 window=60s +2026-02-23T22:00:27.848+0300 INFO middlewares/rate_limit.go:133 [rate-limit][allow] name=global ip=127.0.0.1 count=1 max=1000 window=60s +2026-02-23T22:00:27.854+0300 DEBUG services/jwt_service.go:99 Generated token pair for user=6 email=beyhan@beyhan.dev access_exp=120m refresh_exp=30d +2026-02-23T22:00:27.854+0300 DEBUG services/jwt_service.go:100 access: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjo2LCJlbWFpbCI6ImJleWhhbkBiZXloYW4uZGV2IiwiaXNfYWRtaW4iOnRydWUsImZpcnN0X25hbWUiOiJCZXloYW4iLCJsYXN0X25hbWUiOiJPxJ91ciIsInRva2VuX3R5cGUiOiJhY2Nlc3MiLCJzdWIiOiI2IiwiZXhwIjoxNzcxODgwNDI3LCJpYXQiOjE3NzE4NzMyMjd9.Igzy4-_1zTOgouNyOFuYB5DNoh7yVWg-BAZzEgUvpto +2026-02-23T22:00:27.854+0300 DEBUG services/jwt_service.go:101 refresh: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjo2LCJlbWFpbCI6ImJleWhhbkBiZXloYW4uZGV2IiwiaXNfYWRtaW4iOnRydWUsImZpcnN0X25hbWUiOiJCZXloYW4iLCJsYXN0X25hbWUiOiJPxJ91ciIsInRva2VuX3R5cGUiOiJyZWZyZXNoIiwic3ViIjoiNiIsImV4cCI6MTc3NDQ2NTIyNywiaWF0IjoxNzcxODczMjI3fQ.d028kzKMmbL8DMFHEsUsBObejKworjD5adaylYW1NLY +2026-02-23T22:00:27.883+0300 INFO middlewares/rate_limit.go:133 [rate-limit][allow] name=global ip=127.0.0.1 count=2 max=1000 window=60s +2026-02-23T22:00:27.894+0300 INFO middlewares/rate_limit.go:133 [rate-limit][allow] name=global ip=127.0.0.1 count=3 max=1000 window=60s +2026-02-23T22:00:27.932+0300 INFO middlewares/rate_limit.go:133 [rate-limit][allow] name=global ip=127.0.0.1 count=4 max=1000 window=60s +2026-02-23T22:00:31.796+0300 INFO middlewares/dynamic_cors.go:148 [cors][cache-miss] key=cors:active:blacklist +2026-02-23T22:00:31.807+0300 INFO middlewares/dynamic_cors.go:148 [cors][cache-miss] key=cors:active:whitelist +2026-02-23T22:00:31.813+0300 INFO middlewares/dynamic_cors.go:148 [cors][allow] origin=http://localhost:3000 path=/api/v1/setting +2026-02-23T22:00:31.816+0300 INFO middlewares/rate_limit.go:133 [rate-limit][allow] name=global ip=127.0.0.1 count=5 max=1000 window=60s +2026-02-23T22:00:31.964+0300 INFO middlewares/dynamic_cors.go:148 [cors][cache-hit] key=cors:active:blacklist +2026-02-23T22:00:31.966+0300 INFO middlewares/dynamic_cors.go:148 [cors][cache-hit] key=cors:active:whitelist +2026-02-23T22:00:31.966+0300 INFO middlewares/dynamic_cors.go:148 [cors][allow] origin=http://localhost:3000 path=/api/v1/hero +2026-02-23T22:00:31.970+0300 INFO middlewares/rate_limit.go:133 [rate-limit][allow] name=global ip=127.0.0.1 count=6 max=1000 window=60s +2026-02-23T22:01:00.816+0300 INFO middlewares/rate_limit.go:133 [rate-limit][allow] name=global ip=127.0.0.1 count=7 max=1000 window=60s +2026-02-23T22:01:00.829+0300 INFO middlewares/rate_limit.go:133 [rate-limit][allow] name=global ip=127.0.0.1 count=8 max=1000 window=60s +2026-02-23T22:01:00.854+0300 INFO middlewares/rate_limit.go:133 [rate-limit][allow] name=global ip=127.0.0.1 count=9 max=1000 window=60s +2026-02-23T22:01:02.781+0300 INFO middlewares/dynamic_cors.go:148 [cors][cache-hit] key=cors:active:blacklist +2026-02-23T22:01:02.783+0300 INFO middlewares/dynamic_cors.go:148 [cors][cache-hit] key=cors:active:whitelist +2026-02-23T22:01:02.783+0300 INFO middlewares/dynamic_cors.go:148 [cors][allow] origin=http://localhost:3000 path=/api/v1/setting +2026-02-23T22:01:02.786+0300 INFO middlewares/rate_limit.go:133 [rate-limit][allow] name=global ip=127.0.0.1 count=10 max=1000 window=60s +2026-02-23T22:01:03.002+0300 INFO middlewares/dynamic_cors.go:148 [cors][cache-hit] key=cors:active:blacklist +2026-02-23T22:01:03.003+0300 INFO middlewares/dynamic_cors.go:148 [cors][cache-hit] key=cors:active:whitelist +2026-02-23T22:01:03.004+0300 INFO middlewares/dynamic_cors.go:148 [cors][allow] origin=http://localhost:3000 path=/api/v1/hero +2026-02-23T22:01:03.006+0300 INFO middlewares/rate_limit.go:133 [rate-limit][allow] name=global ip=127.0.0.1 count=11 max=1000 window=60s +2026-02-23T22:04:27.027+0300 INFO middlewares/rate_limit.go:133 [rate-limit][config] loaded from db name=global active=true max=1000 window=60s +2026-02-23T22:04:27.039+0300 INFO middlewares/rate_limit.go:133 [rate-limit][allow] name=global ip=127.0.0.1 count=1 max=1000 window=60s +2026-02-23T22:04:27.050+0300 INFO middlewares/rate_limit.go:133 [rate-limit][allow] name=global ip=127.0.0.1 count=2 max=1000 window=60s +2026-02-23T22:04:27.064+0300 INFO middlewares/rate_limit.go:133 [rate-limit][allow] name=global ip=127.0.0.1 count=3 max=1000 window=60s +2026-02-23T22:04:29.515+0300 INFO middlewares/dynamic_cors.go:148 [cors][cache-miss] key=cors:active:blacklist +2026-02-23T22:04:29.525+0300 INFO middlewares/dynamic_cors.go:148 [cors][cache-miss] key=cors:active:whitelist +2026-02-23T22:04:29.528+0300 INFO middlewares/dynamic_cors.go:148 [cors][allow] origin=http://localhost:3000 path=/api/v1/setting +2026-02-23T22:04:29.530+0300 INFO middlewares/rate_limit.go:133 [rate-limit][allow] name=global ip=127.0.0.1 count=4 max=1000 window=60s +2026-02-23T22:04:29.804+0300 INFO middlewares/dynamic_cors.go:148 [cors][cache-hit] key=cors:active:blacklist +2026-02-23T22:04:29.814+0300 INFO middlewares/dynamic_cors.go:148 [cors][cache-hit] key=cors:active:whitelist +2026-02-23T22:04:29.814+0300 INFO middlewares/dynamic_cors.go:148 [cors][allow] origin=http://localhost:3000 path=/api/v1/hero +2026-02-23T22:04:29.817+0300 INFO middlewares/rate_limit.go:133 [rate-limit][allow] name=global ip=127.0.0.1 count=5 max=1000 window=60s +2026-02-23T22:04:37.609+0300 INFO middlewares/rate_limit.go:133 [rate-limit][allow] name=global ip=127.0.0.1 count=6 max=1000 window=60s +2026-02-23T22:04:37.626+0300 INFO middlewares/rate_limit.go:133 [rate-limit][allow] name=global ip=127.0.0.1 count=7 max=1000 window=60s +2026-02-23T22:04:37.637+0300 INFO middlewares/rate_limit.go:133 [rate-limit][allow] name=global ip=127.0.0.1 count=8 max=1000 window=60s +2026-02-23T22:04:39.710+0300 INFO middlewares/dynamic_cors.go:148 [cors][cache-hit] key=cors:active:blacklist +2026-02-23T22:04:39.712+0300 INFO middlewares/dynamic_cors.go:148 [cors][cache-hit] key=cors:active:whitelist +2026-02-23T22:04:39.713+0300 INFO middlewares/dynamic_cors.go:148 [cors][allow] origin=http://localhost:3000 path=/api/v1/setting +2026-02-23T22:04:39.715+0300 INFO middlewares/rate_limit.go:133 [rate-limit][allow] name=global ip=127.0.0.1 count=9 max=1000 window=60s +2026-02-23T22:04:39.802+0300 INFO middlewares/dynamic_cors.go:148 [cors][cache-hit] key=cors:active:blacklist +2026-02-23T22:04:39.803+0300 INFO middlewares/dynamic_cors.go:148 [cors][cache-hit] key=cors:active:whitelist +2026-02-23T22:04:39.803+0300 INFO middlewares/dynamic_cors.go:148 [cors][allow] origin=http://localhost:3000 path=/api/v1/hero +2026-02-23T22:04:39.806+0300 INFO middlewares/rate_limit.go:133 [rate-limit][allow] name=global ip=127.0.0.1 count=10 max=1000 window=60s +2026-02-23T22:04:39.894+0300 INFO middlewares/dynamic_cors.go:148 [cors][cache-hit] key=cors:active:blacklist +2026-02-23T22:04:39.899+0300 INFO middlewares/dynamic_cors.go:148 [cors][cache-hit] key=cors:active:whitelist +2026-02-23T22:04:39.899+0300 INFO middlewares/dynamic_cors.go:148 [cors][allow] origin=http://localhost:3000 path=/api/v1/products-tree/ +2026-02-23T22:04:39.916+0300 INFO middlewares/rate_limit.go:133 [rate-limit][allow] name=global ip=127.0.0.1 count=11 max=1000 window=60s +2026-02-23T22:04:59.678+0300 INFO middlewares/rate_limit.go:133 [rate-limit][allow] name=global ip=127.0.0.1 count=12 max=1000 window=60s +2026-02-23T22:04:59.685+0300 INFO middlewares/rate_limit.go:133 [rate-limit][allow] name=global ip=127.0.0.1 count=13 max=1000 window=60s +2026-02-23T22:04:59.705+0300 INFO middlewares/rate_limit.go:133 [rate-limit][allow] name=global ip=127.0.0.1 count=14 max=1000 window=60s +2026-02-23T22:05:02.174+0300 INFO middlewares/dynamic_cors.go:148 [cors][cache-hit] key=cors:active:blacklist +2026-02-23T22:05:02.176+0300 INFO middlewares/dynamic_cors.go:148 [cors][cache-hit] key=cors:active:whitelist +2026-02-23T22:05:02.176+0300 INFO middlewares/dynamic_cors.go:148 [cors][allow] origin=http://localhost:3000 path=/api/v1/setting +2026-02-23T22:05:02.178+0300 INFO middlewares/rate_limit.go:133 [rate-limit][allow] name=global ip=127.0.0.1 count=15 max=1000 window=60s +2026-02-23T22:05:02.382+0300 INFO middlewares/dynamic_cors.go:148 [cors][cache-hit] key=cors:active:blacklist +2026-02-23T22:05:02.384+0300 INFO middlewares/dynamic_cors.go:148 [cors][cache-hit] key=cors:active:whitelist +2026-02-23T22:05:02.384+0300 INFO middlewares/dynamic_cors.go:148 [cors][allow] origin=http://localhost:3000 path=/api/v1/hero +2026-02-23T22:05:02.386+0300 INFO middlewares/rate_limit.go:133 [rate-limit][allow] name=global ip=127.0.0.1 count=16 max=1000 window=60s +2026-02-23T22:05:02.403+0300 INFO middlewares/dynamic_cors.go:148 [cors][cache-hit] key=cors:active:blacklist +2026-02-23T22:05:02.404+0300 INFO middlewares/dynamic_cors.go:148 [cors][cache-hit] key=cors:active:whitelist +2026-02-23T22:05:02.404+0300 INFO middlewares/dynamic_cors.go:148 [cors][allow] origin=http://localhost:3000 path=/api/v1/products-tree/ +2026-02-23T22:05:02.407+0300 INFO middlewares/rate_limit.go:133 [rate-limit][allow] name=global ip=127.0.0.1 count=17 max=1000 window=60s +2026-02-23T22:05:08.132+0300 INFO middlewares/rate_limit.go:133 [rate-limit][allow] name=global ip=127.0.0.1 count=18 max=1000 window=60s +2026-02-23T22:05:08.142+0300 INFO middlewares/rate_limit.go:133 [rate-limit][allow] name=global ip=127.0.0.1 count=19 max=1000 window=60s +2026-02-23T22:05:08.156+0300 INFO middlewares/rate_limit.go:133 [rate-limit][allow] name=global ip=127.0.0.1 count=20 max=1000 window=60s +2026-02-23T22:05:08.281+0300 INFO middlewares/rate_limit.go:133 [rate-limit][allow] name=global ip=127.0.0.1 count=21 max=1000 window=60s +2026-02-23T22:05:08.290+0300 INFO middlewares/rate_limit.go:133 [rate-limit][allow] name=global ip=127.0.0.1 count=22 max=1000 window=60s +2026-02-23T22:05:08.402+0300 INFO middlewares/rate_limit.go:133 [rate-limit][allow] name=global ip=127.0.0.1 count=23 max=1000 window=60s +2026-02-23T22:05:10.082+0300 INFO middlewares/dynamic_cors.go:148 [cors][cache-hit] key=cors:active:blacklist +2026-02-23T22:05:10.084+0300 INFO middlewares/dynamic_cors.go:148 [cors][cache-hit] key=cors:active:whitelist +2026-02-23T22:05:10.084+0300 INFO middlewares/dynamic_cors.go:148 [cors][allow] origin=http://localhost:3000 path=/api/v1/setting +2026-02-23T22:05:10.088+0300 INFO middlewares/rate_limit.go:133 [rate-limit][allow] name=global ip=127.0.0.1 count=24 max=1000 window=60s +2026-02-23T22:05:10.199+0300 INFO middlewares/dynamic_cors.go:148 [cors][cache-hit] key=cors:active:blacklist +2026-02-23T22:05:10.200+0300 INFO middlewares/dynamic_cors.go:148 [cors][cache-hit] key=cors:active:whitelist +2026-02-23T22:05:10.200+0300 INFO middlewares/dynamic_cors.go:148 [cors][allow] origin=http://localhost:3000 path=/api/v1/hero +2026-02-23T22:05:10.205+0300 INFO middlewares/rate_limit.go:133 [rate-limit][allow] name=global ip=127.0.0.1 count=25 max=1000 window=60s +2026-02-23T22:05:10.247+0300 INFO middlewares/dynamic_cors.go:148 [cors][cache-hit] key=cors:active:blacklist +2026-02-23T22:05:10.249+0300 INFO middlewares/dynamic_cors.go:148 [cors][cache-hit] key=cors:active:whitelist +2026-02-23T22:05:10.249+0300 INFO middlewares/dynamic_cors.go:148 [cors][allow] origin=http://localhost:3000 path=/api/v1/products-tree/ +2026-02-23T22:05:10.253+0300 INFO middlewares/rate_limit.go:133 [rate-limit][allow] name=global ip=127.0.0.1 count=26 max=1000 window=60s diff --git a/main.go b/main.go new file mode 100644 index 0000000..55e47cb --- /dev/null +++ b/main.go @@ -0,0 +1,130 @@ +package main + +// Swagger security definition for Bearer token (swaggo) +// @securityDefinitions.apikey BearerAuth +// @in header +// @name Authorization +// @description Enter your bearer token in the format 'Bearer {token}' + +import ( + config "ares/config" + database "ares/database/config" + "ares/database/migrate" + _ "ares/docs" + "ares/routes" + "os" + "time" + + "github.com/gofiber/fiber/v3" + "github.com/gofiber/fiber/v3/middleware/static" + "github.com/gofiber/template/html/v2" + swag "github.com/swaggo/swag" +) + +func init() { + config.LoadConfig() + database.ConnectDB() + database.ConnectDBPg() + database.ConnectRedis() + migrate.Migrate() + migrate.MigratePg() + //seeder.Seed() + if config.Logger != nil { + config.Logger.Info("Init Uygulandı !!") + } + +} +func main() { + // Initialize standard Go html template engine + // Use absolute path for safety + cwd, _ := os.Getwd() + engine := html.New(cwd+"/views", ".html") + + // Add helper function to handle *bool and bool in templates + engine.AddFunc("isTrue", func(val interface{}) bool { + if val == nil { + return false + } + switch v := val.(type) { + case bool: + return v + case *bool: + if v == nil { + return false + } + return *v + default: + return false + } + }) + + engine.Reload(true) // Enable reload for development + + app := fiber.New(fiber.Config{ + AppName: "AreS Fiber API Server", + IdleTimeout: 5 * time.Second, + ReadTimeout: 5 * time.Second, + WriteTimeout: 10 * time.Second, + Concurrency: 256 * 1024, + Views: engine, // Register the views engine + }) + + app.Get("/health", func(c fiber.Ctx) error { + return c.JSON(fiber.Map{ + "status": "ok", + }) + }) + + // Serve uploads folder dynamically so URLs like /uploads/settings/xxx.png are accessible + app.Get("/uploads/*", func(c fiber.Ctx) error { + file := c.Params("*") + return c.SendFile("./uploads/" + file) + }) + + // Serve static files from public directory (CSS, JS, Assets) + app.Use("/", static.New("./public")) + + // Register Routes + // Serve generated swagger.json from registered docs (swag) + app.Get("/swagger/swagger.json", func(c fiber.Ctx) error { + doc, err := swag.ReadDoc("swagger") + if err != nil { + return c.Status(404).JSON(fiber.Map{"error": "swagger doc not found"}) + } + return c.Type("json").SendString(doc) + }) + // Simple Swagger UI page using CDN (points to /swagger/swagger.json) + app.Get("/swagger/*", func(c fiber.Ctx) error { + html := ` + + + + Swagger UI + + + +
+ + + +` + return c.Type("html").SendString(html) + }) + routes.RouterUser(app) + routes.RouterAdmin(app) + // Start the server using port from config + if config.AppConfig != nil && config.AppConfig.Port != "" { + if err := app.Listen(":" + config.AppConfig.Port); err != nil { + config.Logger.Sugar().Fatalf("Server başlatılamadı: %v", err) + } + } else { + if err := app.Listen(":8080"); err != nil { + config.Logger.Sugar().Fatalf("Server başlatılamadı: %v", err) + } + } +} diff --git a/middlewares/auth_middleware.go b/middlewares/auth_middleware.go new file mode 100644 index 0000000..13050aa --- /dev/null +++ b/middlewares/auth_middleware.go @@ -0,0 +1,108 @@ +package middlewares + +import ( + "strings" + + "ares/services" + + "github.com/gofiber/fiber/v3" +) + +const authClaimsKey = "auth_claims" + +func RequireAuth(c fiber.Ctx) error { + // First try Authorization header (Bearer JWT) + authHeader := strings.TrimSpace(c.Get("Authorization")) + if authHeader != "" { + parts := strings.SplitN(authHeader, " ", 2) + if len(parts) != 2 || !strings.EqualFold(parts[0], "Bearer") || strings.TrimSpace(parts[1]) == "" { + // If request originates from browser/HTMX, redirect to login instead of returning JSON + if c.Get("HX-Request") == "true" { + c.Set("HX-Redirect", "/login") + return c.SendStatus(fiber.StatusOK) + } + accept := strings.ToLower(c.Get("Accept")) + if strings.Contains(accept, "text/html") || strings.HasPrefix(c.Path(), "/admin") { + return c.Redirect().To("/login") + } + return c.Status(fiber.StatusUnauthorized).JSON(fiber.Map{"error": "invalid authorization format, expected: Bearer "}) + } + jwtService := services.NewJWTService() + claims, err := jwtService.ValidateToken(strings.TrimSpace(parts[1])) + if err != nil { + if c.Get("HX-Request") == "true" { + c.Set("HX-Redirect", "/login") + return c.SendStatus(fiber.StatusOK) + } + accept := strings.ToLower(c.Get("Accept")) + if strings.Contains(accept, "text/html") || strings.HasPrefix(c.Path(), "/admin") { + return c.Redirect().To("/login") + } + return c.Status(fiber.StatusUnauthorized).JSON(fiber.Map{"error": "invalid token"}) + } + if claims.TokenType != services.TokenTypeAccess { + if c.Get("HX-Request") == "true" { + c.Set("HX-Redirect", "/login") + return c.SendStatus(fiber.StatusOK) + } + accept := strings.ToLower(c.Get("Accept")) + if strings.Contains(accept, "text/html") || strings.HasPrefix(c.Path(), "/admin") { + return c.Redirect().To("/login") + } + return c.Status(fiber.StatusUnauthorized).JSON(fiber.Map{"error": "access token required"}) + } + c.Locals(authClaimsKey, claims) + return c.Next() + } + + // Fallback: check cookie-based admin session (browser login) — expect signed JWT + cookie := c.Cookies("admin_session") + if cookie != "" { + jwtService := services.NewJWTService() + if claims, err := jwtService.ValidateToken(cookie); err == nil { + if claims.TokenType == services.TokenTypeAccess { + c.Locals(authClaimsKey, claims) + return c.Next() + } + } + } + + // Default unauthorized response: redirect to login for browser requests, JSON for API clients + if c.Get("HX-Request") == "true" { + c.Set("HX-Redirect", "/login") + return c.SendStatus(fiber.StatusOK) + } + accept := strings.ToLower(c.Get("Accept")) + if strings.Contains(accept, "text/html") || strings.HasPrefix(c.Path(), "/admin") { + return c.Redirect().To("/login") + } + return c.Status(fiber.StatusUnauthorized).JSON(fiber.Map{"error": "authorization header is required"}) +} + +func RequireAdmin(c fiber.Ctx) error { + claims, ok := GetAuthClaims(c) + if !ok { + return c.Status(fiber.StatusUnauthorized).JSON(fiber.Map{"error": "unauthorized"}) + } + if !claims.IsAdmin { + return c.Status(fiber.StatusForbidden).JSON(fiber.Map{"error": "admin role required"}) + } + return c.Next() +} + +func RequireNormalUser(c fiber.Ctx) error { + claims, ok := GetAuthClaims(c) + if !ok { + return c.Status(fiber.StatusUnauthorized).JSON(fiber.Map{"error": "unauthorized"}) + } + if claims.IsAdmin { + return c.Status(fiber.StatusForbidden).JSON(fiber.Map{"error": "only normal users can access this endpoint"}) + } + return c.Next() +} + +func GetAuthClaims(c fiber.Ctx) (*services.JWTClaim, bool) { + raw := c.Locals(authClaimsKey) + claims, ok := raw.(*services.JWTClaim) + return claims, ok +} diff --git a/middlewares/dynamic_cors.go b/middlewares/dynamic_cors.go new file mode 100644 index 0000000..5efd86c --- /dev/null +++ b/middlewares/dynamic_cors.go @@ -0,0 +1,151 @@ +package middlewares + +import ( + configs "ares/config" + database "ares/database/config" + "ares/database/models" + "encoding/json" + "errors" + "net/http" + "strings" + + "github.com/gofiber/fiber/v3" + "github.com/redis/go-redis/v9" + "go.uber.org/zap" +) + +const ( + corsWhitelistActiveCacheKey = "cors:active:whitelist" + corsBlacklistActiveCacheKey = "cors:active:blacklist" + corsCacheTTLSeconds = 60 +) + +var ( + allowedMethods = "GET,POST,PUT,PATCH,DELETE,OPTIONS" + allowedHeaders = "Authorization,Content-Type,Accept,Origin,X-Requested-With" +) + +// DynamicCORS validates request Origin using DB-backed whitelist/blacklist with Redis caching. +func DynamicCORS() fiber.Handler { + return func(c fiber.Ctx) error { + origin := strings.TrimSpace(c.Get("Origin")) + if origin == "" { + return c.Next() + } + if database.DB == nil { + corsLogf("[cors][skip] database unavailable origin=%s path=%s", origin, c.Path()) + return c.Next() + } + + originKey := strings.ToLower(origin) + // Keep same-origin requests working even if DB entries are missing. + if origin == requestBaseURL(c) { + corsLogf("[cors][allow] same-origin origin=%s path=%s", origin, c.Path()) + setCORSHeaders(c, origin) + if c.Method() == http.MethodOptions { + return c.SendStatus(http.StatusNoContent) + } + return c.Next() + } + + blacklist, err := loadActiveOriginSet(corsBlacklistActiveCacheKey, true) + if err != nil { + return c.Status(http.StatusInternalServerError).JSON(fiber.Map{"error": "cors blacklist lookup failed"}) + } + if blacklist[originKey] { + // use project logger if available + if configs.Logger != nil { + configs.Logger.Warn("cors blocked - blacklist", zapFieldsForCORS(origin, c.Path())...) + } + return c.Status(http.StatusForbidden).JSON(fiber.Map{"error": "origin is blocked by CORS policy"}) + } + + whitelist, err := loadActiveOriginSet(corsWhitelistActiveCacheKey, false) + if err != nil { + return c.Status(http.StatusInternalServerError).JSON(fiber.Map{"error": "cors whitelist lookup failed"}) + } + if !whitelist[originKey] { + if configs.Logger != nil { + configs.Logger.Warn("cors blocked - not whitelisted", zapFieldsForCORS(origin, c.Path())...) + } + return c.Status(http.StatusForbidden).JSON(fiber.Map{"error": "origin is not allowed by CORS policy"}) + } + + corsLogf("[cors][allow] origin=%s path=%s", origin, c.Path()) + setCORSHeaders(c, origin) + if c.Method() == http.MethodOptions { + return c.SendStatus(http.StatusNoContent) + } + return c.Next() + } +} + +func setCORSHeaders(c fiber.Ctx, origin string) { + c.Set("Vary", "Origin") + c.Set("Access-Control-Allow-Origin", origin) + c.Set("Access-Control-Allow-Methods", allowedMethods) + c.Set("Access-Control-Allow-Headers", allowedHeaders) + c.Set("Access-Control-Allow-Credentials", "true") + c.Set("Access-Control-Max-Age", "600") +} + +func requestBaseURL(c fiber.Ctx) string { + return c.Protocol() + "://" + c.Get("Host") +} + +func loadActiveOriginSet(cacheKey string, isBlacklist bool) (map[string]bool, error) { + out := make(map[string]bool) + + if cached, err := database.Get(cacheKey); err == nil { + corsLogf("[cors][cache-hit] key=%s", cacheKey) + var origins []string + if jsonErr := json.Unmarshal([]byte(cached), &origins); jsonErr == nil { + for _, origin := range origins { + out[strings.ToLower(strings.TrimSpace(origin))] = true + } + return out, nil + } + } else if !errors.Is(err, redis.Nil) { + return nil, err + } + corsLogf("[cors][cache-miss] key=%s", cacheKey) + + var origins []string + var dbErr error + if isBlacklist { + dbErr = database.DB.Model(&models.CorsBlacklist{}). + Where("is_active = ?", true). + Pluck("origin", &origins).Error + } else { + dbErr = database.DB.Model(&models.CorsWhitelist{}). + Where("is_active = ?", true). + Pluck("origin", &origins).Error + } + if dbErr != nil { + return nil, dbErr + } + + for _, origin := range origins { + out[strings.ToLower(strings.TrimSpace(origin))] = true + } + + cacheBytes, _ := json.Marshal(origins) + _ = database.SetEx(cacheKey, string(cacheBytes), corsCacheTTLSeconds) + + return out, nil +} + +func zapFieldsForCORS(origin, path string) []zap.Field { + return []zap.Field{ + zap.String("origin", origin), + zap.String("path", path), + } +} + +func corsLogf(format string, args ...interface{}) { + if configs.AppConfig != nil && configs.AppConfig.CorsDebug { + if configs.Logger != nil { + configs.Logger.Sugar().Infof(format, args...) + } + } +} diff --git a/middlewares/rate_limit.go b/middlewares/rate_limit.go new file mode 100644 index 0000000..c928492 --- /dev/null +++ b/middlewares/rate_limit.go @@ -0,0 +1,136 @@ +package middlewares + +import ( + configs "ares/config" + database "ares/database/config" + "ares/database/models" + "context" + "encoding/json" + "errors" + "fmt" + "net/http" + "strconv" + "strings" + "time" + + "github.com/gofiber/fiber/v3" + "github.com/redis/go-redis/v9" + "go.uber.org/zap" + "gorm.io/gorm" +) + +type rateLimitRuntime struct { + Name string `json:"name"` + MaxRequests int64 `json:"max_requests"` + WindowSeconds int `json:"window_seconds"` + IsActive bool `json:"is_active"` +} + +// RequireRateLimit applies Redis-backed per-IP rate limiting by setting name. +func RequireRateLimit(name string, fallbackMax int64, fallbackWindowSeconds int) fiber.Handler { + return func(c fiber.Ctx) error { + if database.DB == nil { + return c.Next() + } + + setting, err := loadRateLimitRuntime(name, fallbackMax, fallbackWindowSeconds) + if err != nil { + return c.Status(http.StatusInternalServerError).JSON(fiber.Map{"error": "rate limit configuration error"}) + } + if !setting.IsActive { + return c.Next() + } + if database.RedisClient == nil { + rateLimitLogf("[rate-limit][warn] redis unavailable, skipping enforcement name=%s", setting.Name) + return c.Next() + } + + ip := strings.TrimSpace(c.IP()) + if ip == "" { + ip = "unknown" + } + + counterKey := fmt.Sprintf("ratelimit:%s:%s", setting.Name, ip) + count, err := database.RedisClient.Incr(context.Background(), counterKey).Result() + if err != nil { + return c.Status(http.StatusInternalServerError).JSON(fiber.Map{"error": "rate limit check failed"}) + } + if count == 1 { + _ = database.RedisClient.Expire(context.Background(), counterKey, time.Duration(setting.WindowSeconds)*time.Second).Err() + } + + if count > setting.MaxRequests { + ttl, _ := database.RedisClient.TTL(context.Background(), counterKey).Result() + retryAfter := int(ttl.Seconds()) + if retryAfter < 1 { + retryAfter = setting.WindowSeconds + } + c.Set("Retry-After", strconv.Itoa(retryAfter)) + if configs.Logger != nil { + configs.Logger.Warn("rate-limit blocked", zapFieldsForRateLimit(setting.Name, ip, count, setting.MaxRequests, setting.WindowSeconds)...) + } + return c.Status(http.StatusTooManyRequests).JSON(fiber.Map{ + "error": "too many requests", + "retry_after": retryAfter, + }) + } + + rateLimitLogf("[rate-limit][allow] name=%s ip=%s count=%d max=%d window=%ds", setting.Name, ip, count, setting.MaxRequests, setting.WindowSeconds) + return c.Next() + } +} + +func loadRateLimitRuntime(name string, fallbackMax int64, fallbackWindowSeconds int) (*rateLimitRuntime, error) { + cacheKey := "ratelimit:setting:" + name + if cached, err := database.Get(cacheKey); err == nil { + var s rateLimitRuntime + if jsonErr := json.Unmarshal([]byte(cached), &s); jsonErr == nil { + return &s, nil + } + } else if !errors.Is(err, redis.Nil) { + return nil, err + } + + setting := &rateLimitRuntime{ + Name: name, + MaxRequests: fallbackMax, + WindowSeconds: fallbackWindowSeconds, + IsActive: true, + } + + var dbSetting models.RateLimitSetting + if err := database.DB.Where("name = ?", name).First(&dbSetting).Error; err != nil { + if !errors.Is(err, gorm.ErrRecordNotFound) { + return nil, err + } + rateLimitLogf("[rate-limit][config] setting=%s not found, using fallback max=%d window=%ds", name, fallbackMax, fallbackWindowSeconds) + } else { + setting.MaxRequests = dbSetting.MaxRequests + setting.WindowSeconds = dbSetting.WindowSeconds + setting.IsActive = dbSetting.IsActive + rateLimitLogf("[rate-limit][config] loaded from db name=%s active=%t max=%d window=%ds", name, setting.IsActive, setting.MaxRequests, setting.WindowSeconds) + } + + cacheJSON, _ := json.Marshal(setting) + _ = database.SetEx(cacheKey, string(cacheJSON), 60) + + return setting, nil +} + +func zapFieldsForRateLimit(name, ip string, count, max int64, window int) []zap.Field { + return []zap.Field{ + zap.String("name", name), + zap.String("ip", ip), + zap.Int64("count", count), + zap.Int64("max", max), + zap.Int("window_seconds", window), + } +} + +func rateLimitLogf(format string, args ...interface{}) { + if configs.AppConfig != nil && configs.AppConfig.CorsDebug { + if configs.Logger != nil { + configs.Logger.Sugar().Infof(format, args...) + } + } +} diff --git a/middlewares/reject_all_middleware.go b/middlewares/reject_all_middleware.go new file mode 100644 index 0000000..c0403f9 --- /dev/null +++ b/middlewares/reject_all_middleware.go @@ -0,0 +1,12 @@ +package middlewares + +import ( + "github.com/gofiber/fiber/v3" +) + +// RejectAll middleware tüm gelen istekleri reddeder ve HTTP 500 döner. +func RejectAll() fiber.Handler { + return func(c fiber.Ctx) error { + return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": "internal server error"}) + } +} diff --git a/pkg/utis/slug.go b/pkg/utis/slug.go new file mode 100644 index 0000000..ddf2378 --- /dev/null +++ b/pkg/utis/slug.go @@ -0,0 +1,48 @@ +package utils + +import ( + "regexp" + "strings" + "unicode" +) + +// Slugify converts a string to a URL-friendly slug, replacing Turkish characters +// with ASCII equivalents and ensuring lowercase, hyphen-separated result. +func Slugify(s string) string { + if s == "" { + return "" + } + + // Map Turkish characters to ASCII + replacer := strings.NewReplacer( + "ç", "c", "Ç", "c", + "ğ", "g", "Ğ", "g", + "ı", "i", "İ", "i", + "ö", "o", "Ö", "o", + "ş", "s", "Ş", "s", + "ü", "u", "Ü", "u", + "’", "", "'", "", + ) + s = replacer.Replace(s) + + // Normalize: keep letters, numbers, and spaces + var b strings.Builder + for _, r := range strings.TrimSpace(s) { + if unicode.IsLetter(r) || unicode.IsDigit(r) || unicode.IsSpace(r) { + b.WriteRune(r) + } else { + // convert other punctuation to space + b.WriteRune(' ') + } + } + + out := strings.ToLower(b.String()) + + // replace spaces with hyphens and collapse multiple hyphens + out = strings.TrimSpace(out) + // replace any sequence of non-alnum with hyphen + re := regexp.MustCompile(`[^a-z0-9]+`) + out = re.ReplaceAllString(out, "-") + out = strings.Trim(out, "-") + return out +} diff --git a/pkg/utis/token.go b/pkg/utis/token.go new file mode 100644 index 0000000..724f383 --- /dev/null +++ b/pkg/utis/token.go @@ -0,0 +1,15 @@ +package utils + +import ( + "crypto/rand" + "encoding/hex" +) + +// GenerateSecureToken returns a cryptographically random hex string (e.g. for email verification). +func GenerateSecureToken(byteLength int) (string, error) { + b := make([]byte, byteLength) + if _, err := rand.Read(b); err != nil { + return "", err + } + return hex.EncodeToString(b), nil +} diff --git a/public/admin/css/theme.css b/public/admin/css/theme.css new file mode 100644 index 0000000..5b6cefd --- /dev/null +++ b/public/admin/css/theme.css @@ -0,0 +1,146 @@ +/* Admin Panel Theme CSS */ + +:root { + --sidebar-width: 250px; + --header-height: 60px; + --transition-speed: 0.3s; +} + +[data-bs-theme="light"] { + --bg-body: #f8f9fa; + --bg-sidebar: #ffffff; + --text-sidebar: #333333; + --border-color: #e9ecef; + --accent-color: #0d6efd; + --accent-color-rgb: 13,110,253; +} + +[data-bs-theme="dark"] { + --bg-body: #212529; + --bg-sidebar: #1a1d20; + --text-sidebar: #e9ecef; + --border-color: #343a40; + --accent-color: #ffc107; /* Şeftali tonu veya sarımsı */ + --accent-color-rgb: 255,193,7; +} + +body { + background-color: var(--bg-body); + transition: background-color var(--transition-speed); +} + +/* Sidebar Styles */ +#sidebar { + width: var(--sidebar-width); + height: 100vh; + position: fixed; + top: 0; + left: 0; + background-color: var(--bg-sidebar); + color: var(--text-sidebar); + border-right: 1px solid var(--border-color); + transition: transform var(--transition-speed); + z-index: 1040; + overflow-y: auto; +} + +.sidebar-header { + height: var(--header-height); + display: flex; + align-items: center; + padding: 0 1.5rem; + border-bottom: 1px solid var(--border-color); +} + +.sidebar-nav .nav-link { + color: var(--text-sidebar); + padding: 0.75rem 1.5rem; + border-left: 3px solid transparent; +} + +.sidebar-nav .nav-link:hover, +.sidebar-nav .nav-link.active { + background-color: rgba(var(--accent-color-rgb), 0.1); + border-left-color: var(--accent-color); + color: var(--accent-color); +} + +/* Header Styles */ +#main-header { + height: var(--header-height); + position: fixed; + top: 0; + left: var(--sidebar-width); + right: 0; + background-color: var(--bg-sidebar); + border-bottom: 1px solid var(--border-color); + z-index: 1030; + transition: left var(--transition-speed); + display: flex; + align-items: center; + padding: 0 1.5rem; +} + +/* Main Content Area */ +#main-content-wrapper { + margin-left: var(--sidebar-width); + padding-top: var(--header-height); + transition: margin-left var(--transition-speed); + min-height: 100vh; +} + +/* Mobile Sidebar Behavior */ +@media (max-width: 991.98px) { + #sidebar { + transform: translateX(-100%); + } + + #sidebar.show { + transform: translateX(0); + } + + #main-header { + left: 0; + } + + #main-content-wrapper { + margin-left: 0; + } +} + +/* Utilities */ +.fade-in { + animation: fadeIn 0.3s ease-in-out; +} + +@keyframes fadeIn { + from { opacity: 0; } + to { opacity: 1; } +} + +/* Turnstile Widget Placeholder Style */ +.cf-turnstile { + margin: 1rem 0; + min-height: 65px; +} + +/* Logo preview helpers: force preview backgrounds for white/black logos */ +.logo-preview { + display: inline-block; + padding: 0.5rem; + border-radius: 0.25rem; +} + +.logo-preview-dark { + /* stronger, always-visible dark preview (for white logos) */ + background-color: rgba(0, 0, 0, 0.6) !important; + border: 1px solid rgba(255, 255, 255, 0.06); + box-shadow: 0 1px 2px rgba(0,0,0,0.5); +} + +.logo-preview-light { + /* white preview for dark/black logos */ + background-color: #ffffff !important; + border: 1px solid rgba(0,0,0,0.08); + box-shadow: 0 1px 2px rgba(0,0,0,0.06); +} diff --git a/public/admin/js/main.js b/public/admin/js/main.js new file mode 100644 index 0000000..85b4bcb --- /dev/null +++ b/public/admin/js/main.js @@ -0,0 +1,63 @@ +document.addEventListener('alpine:init', () => { + Alpine.store('theme', { + mode: localStorage.getItem('theme') || 'light', + + toggle() { + this.mode = this.mode === 'light' ? 'dark' : 'light'; + localStorage.setItem('theme', this.mode); + this.apply(); + }, + + apply() { + document.documentElement.setAttribute('data-bs-theme', this.mode); + } + }); + + // Apply theme on init + Alpine.store('theme').apply(); + + Alpine.store('sidebar', { + open: false, + + toggle() { + this.open = !this.open; + const sidebar = document.getElementById('sidebar'); + if (this.open) { + sidebar.classList.add('show'); + } else { + sidebar.classList.remove('show'); + } + }, + + close() { + this.open = false; + document.getElementById('sidebar').classList.remove('show'); + } + }); +}); + +// HTMX Configuration +document.addEventListener('htmx:configRequest', (event) => { + // Add CSRF token if available (implementation dependent) + // event.detail.headers['X-CSRF-Token'] = getCsrfToken(); +}); + +document.addEventListener('htmx:beforeSwap', (event) => { + // Handle 401 Unauthorized by redirecting to login + if (event.detail.xhr.status === 401) { + window.location.href = '/login'; + } +}); + +// Mobile helper: Close sidebar on outside click (simple implementation) +document.addEventListener('click', (e) => { + const sidebar = document.getElementById('sidebar'); + const toggleBtn = document.querySelector('[data-bs-target="#sidebar"]'); // Adjust selector as needed + + // Only on mobile + if (window.innerWidth < 992 && Alpine.store('sidebar').open) { + if (!sidebar.contains(e.target) && !toggleBtn.contains(e.target)) { + Alpine.store('sidebar').close(); + } + } +}); diff --git a/public/assets/.package-lock.json b/public/assets/.package-lock.json new file mode 100644 index 0000000..a98b5fa --- /dev/null +++ b/public/assets/.package-lock.json @@ -0,0 +1,77 @@ +{ + "name": "scripts", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "node_modules/@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "license": "MIT", + "peer": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@vue/reactivity": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.1.5.tgz", + "integrity": "sha512-1tdfLmNjWG6t/CsPldh+foumYFo3cpyCHgBYQ34ylaMsJ+SNHQ1kApMIa8jN+i593zQuaw3AdWH0nJTARzCFhg==", + "license": "MIT", + "dependencies": { + "@vue/shared": "3.1.5" + } + }, + "node_modules/@vue/shared": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.1.5.tgz", + "integrity": "sha512-oJ4F3TnvpXaQwZJNF3ZK+kLPHKarDmJjJ6jyzVNDKH9md1dptjC7lWR//jrGuLdek/U6iltWxqAnYOu8gCiOvA==", + "license": "MIT" + }, + "node_modules/alpinejs": { + "version": "3.15.8", + "resolved": "https://registry.npmjs.org/alpinejs/-/alpinejs-3.15.8.tgz", + "integrity": "sha512-zxIfCRTBGvF1CCLIOMQOxAyBuqibxSEwS6Jm1a3HGA9rgrJVcjEWlwLcQTVGAWGS8YhAsTRLVrtQ5a5QT9bSSQ==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "~3.1.1" + } + }, + "node_modules/bootstrap": { + "version": "5.3.8", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.8.tgz", + "integrity": "sha512-HP1SZDqaLDPwsNiqRqi5NcP0SSXciX2s9E+RyqJIIqGo+vJeN5AJVM98CXmW/Wux0nQ5L7jeWUdplCEf0Ee+tg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/twbs" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/bootstrap" + } + ], + "license": "MIT", + "peerDependencies": { + "@popperjs/core": "^2.11.8" + } + }, + "node_modules/htmx": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/htmx/-/htmx-0.0.2.tgz", + "integrity": "sha512-FfUo3ynRYr6Ra4vqmS4Nq9g47607FSmvHYCOuU8bvbW8s4kPMhAmCbMBjuW2cEZI6DauaFNZKinfgV91cc9Feg==", + "license": "MIT", + "bin": { + "htmx": "htmx.js" + } + }, + "node_modules/jquery": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-4.0.0.tgz", + "integrity": "sha512-TXCHVR3Lb6TZdtw1l3RTLf8RBWVGexdxL6AC8/e0xZKEpBflBsjh9/8LXw+dkNFuOyW9B7iB3O1sP7hS0Kiacg==", + "license": "MIT" + } + } +} diff --git a/public/assets/@popperjs/core/LICENSE.md b/public/assets/@popperjs/core/LICENSE.md new file mode 100644 index 0000000..0370c45 --- /dev/null +++ b/public/assets/@popperjs/core/LICENSE.md @@ -0,0 +1,20 @@ +The MIT License (MIT) + +Copyright (c) 2019 Federico Zivolo + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/public/assets/@popperjs/core/README.md b/public/assets/@popperjs/core/README.md new file mode 100644 index 0000000..53be7b9 --- /dev/null +++ b/public/assets/@popperjs/core/README.md @@ -0,0 +1,376 @@ + +

+ Popper +

+ +
+

Tooltip & Popover Positioning Engine

+
+ +

+ + npm version + + + npm downloads per month (popper.js + @popperjs/core) + + + Rolling Versions + +

+ +
+ + +**Positioning tooltips and popovers is difficult. Popper is here to help!** + +Given an element, such as a button, and a tooltip element describing it, Popper +will automatically put the tooltip in the right place near the button. + +It will position _any_ UI element that "pops out" from the flow of your document +and floats near a target element. The most common example is a tooltip, but it +also includes popovers, drop-downs, and more. All of these can be generically +described as a "popper" element. + +## Demo + +[![Popper visualized](https://i.imgur.com/F7qWsmV.jpg)](https://popper.js.org) + +## Docs + +- [v2.x (latest)](https://popper.js.org/docs/v2/) +- [v1.x](https://popper.js.org/docs/v1/) + +We've created a +[Migration Guide](https://popper.js.org/docs/v2/migration-guide/) to help you +migrate from Popper 1 to Popper 2. + +To contribute to the Popper website and documentation, please visit the +[dedicated repository](https://github.com/popperjs/website). + +## Why not use pure CSS? + +- **Clipping and overflow issues**: Pure CSS poppers will not be prevented from + overflowing clipping boundaries, such as the viewport. It will get partially + cut off or overflows if it's near the edge since there is no dynamic + positioning logic. When using Popper, your popper will always be positioned in + the right place without needing manual adjustments. +- **No flipping**: CSS poppers will not flip to a different placement to fit + better in view if necessary. While you can manually adjust for the main axis + overflow, this feature cannot be achieved via CSS alone. Popper automatically + flips the tooltip to make it fit in view as best as possible for the user. +- **No virtual positioning**: CSS poppers cannot follow the mouse cursor or be + used as a context menu. Popper allows you to position your tooltip relative to + any coordinates you desire. +- **Slower development cycle**: When pure CSS is used to position popper + elements, the lack of dynamic positioning means they must be carefully placed + to consider overflow on all screen sizes. In reusable component libraries, + this means a developer can't just add the component anywhere on the page, + because these issues need to be considered and adjusted for every time. With + Popper, you can place your elements anywhere and they will be positioned + correctly, without needing to consider different screen sizes, layouts, etc. + This massively speeds up development time because this work is automatically + offloaded to Popper. +- **Lack of extensibility**: CSS poppers cannot be easily extended to fit any + arbitrary use case you may need to adjust for. Popper is built with + extensibility in mind. + +## Why Popper? + +With the CSS drawbacks out of the way, we now move on to Popper in the +JavaScript space itself. + +Naive JavaScript tooltip implementations usually have the following problems: + +- **Scrolling containers**: They don't ensure the tooltip stays with the + reference element while scrolling when inside any number of scrolling + containers. +- **DOM context**: They often require the tooltip move outside of its original + DOM context because they don't handle `offsetParent` contexts. +- **Compatibility**: Popper handles an incredible number of edge cases regarding + different browsers and environments (mobile viewports, RTL, scrollbars enabled + or disabled, etc.). Popper is a popular and well-maintained library, so you + can be confident positioning will work for your users on any device. +- **Configurability**: They often lack advanced configurability to suit any + possible use case. +- **Size**: They are usually relatively large in size, or require an ancient + jQuery dependency. +- **Performance**: They often have runtime performance issues and update the + tooltip position too slowly. + +**Popper solves all of these key problems in an elegant, performant manner.** It +is a lightweight ~3 kB library that aims to provide a reliable and extensible +positioning engine you can use to ensure all your popper elements are positioned +in the right place. + +When you start writing your own popper implementation, you'll quickly run into +all of the problems mentioned above. These widgets are incredibly common in our +UIs; we've done the hard work figuring this out so you don't need to spend hours +fixing and handling numerous edge cases that we already ran into while building +the library! + +Popper is used in popular libraries like Bootstrap, Foundation, Material UI, and +more. It's likely you've already used popper elements on the web positioned by +Popper at some point in the past few years. + +Since we write UIs using powerful abstraction libraries such as React or Angular +nowadays, you'll also be glad to know Popper can fully integrate with them and +be a good citizen together with your other components. Check out `react-popper` +for the official Popper wrapper for React. + +## Installation + +### 1. Package Manager + +```bash +# With npm +npm i @popperjs/core + +# With Yarn +yarn add @popperjs/core +``` + +### 2. CDN + +```html + + + + + +``` + +### 3. Direct Download? + +Managing dependencies by "directly downloading" them and placing them into your +source code is not recommended for a variety of reasons, including missing out +on feat/fix updates easily. Please use a versioning management system like a CDN +or npm/Yarn. + +## Usage + +The most straightforward way to get started is to import Popper from the `unpkg` +CDN, which includes all of its features. You can call the `Popper.createPopper` +constructor to create new popper instances. + +Here is a complete example: + +```html + +Popper example + + + + + + + + +``` + +Visit the [tutorial](https://popper.js.org/docs/v2/tutorial/) for an example of +how to build your own tooltip from scratch using Popper. + +### Module bundlers + +You can import the `createPopper` constructor from the fully-featured file: + +```js +import { createPopper } from '@popperjs/core'; + +const button = document.querySelector('#button'); +const tooltip = document.querySelector('#tooltip'); + +// Pass the button, the tooltip, and some options, and Popper will do the +// magic positioning for you: +createPopper(button, tooltip, { + placement: 'right', +}); +``` + +All the modifiers listed in the docs menu will be enabled and "just work", so +you don't need to think about setting Popper up. The size of Popper including +all of its features is about 5 kB minzipped, but it may grow a bit in the +future. + +#### Popper Lite (tree-shaking) + +If bundle size is important, you'll want to take advantage of tree-shaking. The +library is built in a modular way to allow to import only the parts you really +need. + +```js +import { createPopperLite as createPopper } from '@popperjs/core'; +``` + +The Lite version includes the most necessary modifiers that will compute the +offsets of the popper, compute and add the positioning styles, and add event +listeners. This is close in bundle size to pure CSS tooltip libraries, and +behaves somewhat similarly. + +However, this does not include the features that makes Popper truly useful. + +The two most useful modifiers not included in Lite are `preventOverflow` and +`flip`: + +```js +import { + createPopperLite as createPopper, + preventOverflow, + flip, +} from '@popperjs/core'; + +const button = document.querySelector('#button'); +const tooltip = document.querySelector('#tooltip'); + +createPopper(button, tooltip, { + modifiers: [preventOverflow, flip], +}); +``` + +As you make more poppers, you may be finding yourself needing other modifiers +provided by the library. + +See [tree-shaking](https://popper.js.org/docs/v2/performance/#tree-shaking) for more +information. + +## Distribution targets + +Popper is distributed in 3 different versions, in 3 different file formats. + +The 3 file formats are: + +- `esm` (works with `import` syntax — **recommended**) +- `umd` (works with ` +``` + +or, to use the jQuery ECMAScript module: + +```html + +``` + +or: + +```html + +``` + +All jQuery modules export named `$` & `jQuery` tokens; the further examples will just show `$`. The default import also works: + +```html + +``` + +However, named imports provide better interoperability across tooling and are therefore recommended. + +Sometimes you don’t need AJAX, or you prefer to use one of the many standalone libraries that focus on AJAX requests. And often it is simpler to use a combination of CSS, class manipulation or the Web Animations API. Similarly, many projects opt into relying on native browser promises instead of jQuery Deferreds. Along with the regular version of jQuery that includes the `ajax`, `callbacks`, `deferred`, `effects` & `queue` modules, we’ve released a “slim” version that excludes these modules. You can load it as a regular script: + +```html + +``` + +or as a module: + +```html + +``` + +#### Import maps + +To avoid repeating long import paths that change on each jQuery release, you can use import maps - they are now supported in every modern browser. Put the following script tag before any ` +``` + +Now, the following will work to get the full version: + +```html + +``` + +and the following to get the slim one: + +```html + +``` + +The advantage of these specific mappings is they match the ones embedded in the jQuery npm package, providing better interoperability between the environments. + +You can also use jQuery from npm even in the browser setup. Read along for more details. + +### Using jQuery from npm + +There are several ways to use jQuery from npm. One is to use a build tool like [Webpack](https://webpack.js.org/), [Browserify](https://browserify.org/) or [Babel](https://babeljs.io/). For more information on using these tools, please refer to the corresponding project's documentation. + +Another way is to use jQuery directly in Node.js. See the [Node.js pre-requisites](#nodejs-pre-requisites) section for more details on the Node.js-specific part of this. + +To install the jQuery npm package, invoke: + +```sh +npm install jquery +``` + +In the script, including jQuery will usually look like this: + +```js +import { $ } from "jquery"; +``` + +If you need to use jQuery in a file that's not an ECMAScript module, you can use the CommonJS syntax: + +```js +const $ = require( "jquery" ); +``` + +The CommonJS module _does not_ expose named `$` & `jQuery` exports. + +#### Individual modules + +jQuery is authored in ECMAScript modules; it's also possible to use them directly. They are contained in the `src/` folder; inspect the package contents to see what's there. Full file names are required, including the `.js` extension. + +Be aware that this is an advanced & low-level interface, and we don't consider it stable, even between minor or patch releases - this is especially the case for modules in subdirectories or `src/`. If you rely on it, verify your setup before updating jQuery. + +All top-level modules, i.e. files directly in the `src/` directory export jQuery. Importing multiple modules will all attach to the same jQuery instance. + +Remember that some modules have other dependencies (e.g. the `event` module depends on the `selector` one) so in some cases you may get more than you expect. + +Example usage: + +```js +import { $ } from "jquery/src/css.js"; // adds the `.css()` method +import "jquery/src/event.js"; // adds the `.on()` method; pulls "selector" as a dependency +$( ".toggle" ).on( "click", function() { + $( this ).css( "color", "red" ); +} ); +``` + +### AMD (Asynchronous Module Definition) + +AMD is a module format built for the browser. For more information, we recommend [require.js' documentation](https://requirejs.org/docs/whyamd.html). + +```js +define( [ "jquery" ], function( $ ) { + +} ); +``` + +Node.js doesn't understand AMD natively so this method is mostly used in a browser setup. + +### Node.js pre-requisites + +For jQuery to work in Node, a `window` with a `document` is required. Since no such window exists natively in Node, one can be mocked by tools such as [jsdom](https://github.com/jsdom/jsdom). This can be useful for testing purposes. + +For Node-based environments that don't have a global `window`, jQuery exposes a dedicated `jquery/factory` entry point. + +To `import` jQuery using this factory, use the following: + +```js +import { JSDOM } from "jsdom"; +const { window } = new JSDOM( "" ); +import { jQueryFactory } from "jquery/factory"; +const $ = jQueryFactory( window ); +``` + +or, if you use `require`: + +```js +const { JSDOM } = require( "jsdom" ); +const { window } = new JSDOM( "" ); +const { jQueryFactory } = require( "jquery/factory" ); +const $ = jQueryFactory( window ); +``` + +#### Slim build in Node.js + +To use the slim build of jQuery in Node.js, use `"jquery/slim"` instead of `"jquery"` in both `require` or `import` calls above. To use the slim build in Node.js with factory mode, use `jquery/factory-slim` instead of `jquery/factory`. diff --git a/public/assets/jquery/bower.json b/public/assets/jquery/bower.json new file mode 100644 index 0000000..95798d5 --- /dev/null +++ b/public/assets/jquery/bower.json @@ -0,0 +1,14 @@ +{ + "name": "jquery", + "main": "dist/jquery.js", + "license": "MIT", + "ignore": [ + "package.json" + ], + "keywords": [ + "jquery", + "javascript", + "browser", + "library" + ] +} \ No newline at end of file diff --git a/public/assets/jquery/changelog.md b/public/assets/jquery/changelog.md new file mode 100644 index 0000000..0e6b3e0 --- /dev/null +++ b/public/assets/jquery/changelog.md @@ -0,0 +1,7 @@ +# Changelog + +https://blog.jquery.com/2026/01/17/jquery-4-0-0/ + +## Release + +- remove dist files from main branch ([c838cfb5](https://github.com/jquery/jquery/commit/c838cfb5bb0c6cd17cfaa1dd83aca8d20589de99)) diff --git a/public/assets/jquery/dist-module/jquery.factory.module.js b/public/assets/jquery/dist-module/jquery.factory.module.js new file mode 100644 index 0000000..e88dd86 --- /dev/null +++ b/public/assets/jquery/dist-module/jquery.factory.module.js @@ -0,0 +1,9675 @@ +/*! + * jQuery JavaScript Library v4.0.0 + * https://jquery.com/ + * + * Copyright OpenJS Foundation and other contributors + * Released under the MIT license + * https://jquery.com/license/ + * + * Date: 2026-01-18T00:20Z + */ +// Expose a factory as `jQueryFactory`. Aimed at environments without +// a real `window` where an emulated window needs to be constructed. Example: +// +// import { jQueryFactory } from "jquery/factory"; +// const jQuery = jQueryFactory( window ); +// +// See ticket trac-14549 for more info. +function jQueryFactoryWrapper( window, noGlobal ) { + +if ( !window.document ) { + throw new Error( "jQuery requires a window with a document" ); +} + +var arr = []; + +var getProto = Object.getPrototypeOf; + +var slice = arr.slice; + +// Support: IE 11+ +// IE doesn't have Array#flat; provide a fallback. +var flat = arr.flat ? function( array ) { + return arr.flat.call( array ); +} : function( array ) { + return arr.concat.apply( [], array ); +}; + +var push = arr.push; + +var indexOf = arr.indexOf; + +// [[Class]] -> type pairs +var class2type = {}; + +var toString = class2type.toString; + +var hasOwn = class2type.hasOwnProperty; + +var fnToString = hasOwn.toString; + +var ObjectFunctionString = fnToString.call( Object ); + +// All support tests are defined in their respective modules. +var support = {}; + +function toType( obj ) { + if ( obj == null ) { + return obj + ""; + } + + return typeof obj === "object" ? + class2type[ toString.call( obj ) ] || "object" : + typeof obj; +} + +function isWindow( obj ) { + return obj != null && obj === obj.window; +} + +function isArrayLike( obj ) { + + var length = !!obj && obj.length, + type = toType( obj ); + + if ( typeof obj === "function" || isWindow( obj ) ) { + return false; + } + + return type === "array" || length === 0 || + typeof length === "number" && length > 0 && ( length - 1 ) in obj; +} + +var document$1 = window.document; + +var preservedScriptAttributes = { + type: true, + src: true, + nonce: true, + noModule: true +}; + +function DOMEval( code, node, doc ) { + doc = doc || document$1; + + var i, + script = doc.createElement( "script" ); + + script.text = code; + for ( i in preservedScriptAttributes ) { + if ( node && node[ i ] ) { + script[ i ] = node[ i ]; + } + } + + if ( doc.head.appendChild( script ).parentNode ) { + script.parentNode.removeChild( script ); + } +} + +var version = "4.0.0", + + rhtmlSuffix = /HTML$/i, + + // Define a local copy of jQuery + jQuery = function( selector, context ) { + + // The jQuery object is actually just the init constructor 'enhanced' + // Need init if jQuery is called (just allow error to be thrown if not included) + return new jQuery.fn.init( selector, context ); + }; + +jQuery.fn = jQuery.prototype = { + + // The current version of jQuery being used + jquery: version, + + constructor: jQuery, + + // The default length of a jQuery object is 0 + length: 0, + + toArray: function() { + return slice.call( this ); + }, + + // Get the Nth element in the matched element set OR + // Get the whole matched element set as a clean array + get: function( num ) { + + // Return all the elements in a clean array + if ( num == null ) { + return slice.call( this ); + } + + // Return just the one element from the set + return num < 0 ? this[ num + this.length ] : this[ num ]; + }, + + // Take an array of elements and push it onto the stack + // (returning the new matched element set) + pushStack: function( elems ) { + + // Build a new jQuery matched element set + var ret = jQuery.merge( this.constructor(), elems ); + + // Add the old object onto the stack (as a reference) + ret.prevObject = this; + + // Return the newly-formed element set + return ret; + }, + + // Execute a callback for every element in the matched set. + each: function( callback ) { + return jQuery.each( this, callback ); + }, + + map: function( callback ) { + return this.pushStack( jQuery.map( this, function( elem, i ) { + return callback.call( elem, i, elem ); + } ) ); + }, + + slice: function() { + return this.pushStack( slice.apply( this, arguments ) ); + }, + + first: function() { + return this.eq( 0 ); + }, + + last: function() { + return this.eq( -1 ); + }, + + even: function() { + return this.pushStack( jQuery.grep( this, function( _elem, i ) { + return ( i + 1 ) % 2; + } ) ); + }, + + odd: function() { + return this.pushStack( jQuery.grep( this, function( _elem, i ) { + return i % 2; + } ) ); + }, + + eq: function( i ) { + var len = this.length, + j = +i + ( i < 0 ? len : 0 ); + return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] ); + }, + + end: function() { + return this.prevObject || this.constructor(); + } +}; + +jQuery.extend = jQuery.fn.extend = function() { + var options, name, src, copy, copyIsArray, clone, + target = arguments[ 0 ] || {}, + i = 1, + length = arguments.length, + deep = false; + + // Handle a deep copy situation + if ( typeof target === "boolean" ) { + deep = target; + + // Skip the boolean and the target + target = arguments[ i ] || {}; + i++; + } + + // Handle case when target is a string or something (possible in deep copy) + if ( typeof target !== "object" && typeof target !== "function" ) { + target = {}; + } + + // Extend jQuery itself if only one argument is passed + if ( i === length ) { + target = this; + i--; + } + + for ( ; i < length; i++ ) { + + // Only deal with non-null/undefined values + if ( ( options = arguments[ i ] ) != null ) { + + // Extend the base object + for ( name in options ) { + copy = options[ name ]; + + // Prevent Object.prototype pollution + // Prevent never-ending loop + if ( name === "__proto__" || target === copy ) { + continue; + } + + // Recurse if we're merging plain objects or arrays + if ( deep && copy && ( jQuery.isPlainObject( copy ) || + ( copyIsArray = Array.isArray( copy ) ) ) ) { + src = target[ name ]; + + // Ensure proper type for the source value + if ( copyIsArray && !Array.isArray( src ) ) { + clone = []; + } else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) { + clone = {}; + } else { + clone = src; + } + copyIsArray = false; + + // Never move original objects, clone them + target[ name ] = jQuery.extend( deep, clone, copy ); + + // Don't bring in undefined values + } else if ( copy !== undefined ) { + target[ name ] = copy; + } + } + } + } + + // Return the modified object + return target; +}; + +jQuery.extend( { + + // Unique for each copy of jQuery on the page + expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), + + // Assume jQuery is ready without the ready module + isReady: true, + + error: function( msg ) { + throw new Error( msg ); + }, + + noop: function() {}, + + isPlainObject: function( obj ) { + var proto, Ctor; + + // Detect obvious negatives + // Use toString instead of jQuery.type to catch host objects + if ( !obj || toString.call( obj ) !== "[object Object]" ) { + return false; + } + + proto = getProto( obj ); + + // Objects with no prototype (e.g., `Object.create( null )`) are plain + if ( !proto ) { + return true; + } + + // Objects with prototype are plain iff they were constructed by a global Object function + Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor; + return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString; + }, + + isEmptyObject: function( obj ) { + var name; + + for ( name in obj ) { + return false; + } + return true; + }, + + // Evaluates a script in a provided context; falls back to the global one + // if not specified. + globalEval: function( code, options, doc ) { + DOMEval( code, { nonce: options && options.nonce }, doc ); + }, + + each: function( obj, callback ) { + var length, i = 0; + + if ( isArrayLike( obj ) ) { + length = obj.length; + for ( ; i < length; i++ ) { + if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { + break; + } + } + } else { + for ( i in obj ) { + if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { + break; + } + } + } + + return obj; + }, + + + // Retrieve the text value of an array of DOM nodes + text: function( elem ) { + var node, + ret = "", + i = 0, + nodeType = elem.nodeType; + + if ( !nodeType ) { + + // If no nodeType, this is expected to be an array + while ( ( node = elem[ i++ ] ) ) { + + // Do not traverse comment nodes + ret += jQuery.text( node ); + } + } + if ( nodeType === 1 || nodeType === 11 ) { + return elem.textContent; + } + if ( nodeType === 9 ) { + return elem.documentElement.textContent; + } + if ( nodeType === 3 || nodeType === 4 ) { + return elem.nodeValue; + } + + // Do not include comment or processing instruction nodes + + return ret; + }, + + + // results is for internal usage only + makeArray: function( arr, results ) { + var ret = results || []; + + if ( arr != null ) { + if ( isArrayLike( Object( arr ) ) ) { + jQuery.merge( ret, + typeof arr === "string" ? + [ arr ] : arr + ); + } else { + push.call( ret, arr ); + } + } + + return ret; + }, + + inArray: function( elem, arr, i ) { + return arr == null ? -1 : indexOf.call( arr, elem, i ); + }, + + isXMLDoc: function( elem ) { + var namespace = elem && elem.namespaceURI, + docElem = elem && ( elem.ownerDocument || elem ).documentElement; + + // Assume HTML when documentElement doesn't yet exist, such as inside + // document fragments. + return !rhtmlSuffix.test( namespace || docElem && docElem.nodeName || "HTML" ); + }, + + // Note: an element does not contain itself + contains: function( a, b ) { + var bup = b && b.parentNode; + + return a === bup || !!( bup && bup.nodeType === 1 && ( + + // Support: IE 9 - 11+ + // IE doesn't have `contains` on SVG. + a.contains ? + a.contains( bup ) : + a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 + ) ); + }, + + merge: function( first, second ) { + var len = +second.length, + j = 0, + i = first.length; + + for ( ; j < len; j++ ) { + first[ i++ ] = second[ j ]; + } + + first.length = i; + + return first; + }, + + grep: function( elems, callback, invert ) { + var callbackInverse, + matches = [], + i = 0, + length = elems.length, + callbackExpect = !invert; + + // Go through the array, only saving the items + // that pass the validator function + for ( ; i < length; i++ ) { + callbackInverse = !callback( elems[ i ], i ); + if ( callbackInverse !== callbackExpect ) { + matches.push( elems[ i ] ); + } + } + + return matches; + }, + + // arg is for internal usage only + map: function( elems, callback, arg ) { + var length, value, + i = 0, + ret = []; + + // Go through the array, translating each of the items to their new values + if ( isArrayLike( elems ) ) { + length = elems.length; + for ( ; i < length; i++ ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + + // Go through every key on the object, + } else { + for ( i in elems ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + } + + // Flatten any nested arrays + return flat( ret ); + }, + + // A global GUID counter for objects + guid: 1, + + // jQuery.support is not used in Core but other projects attach their + // properties to it so it needs to exist. + support: support +} ); + +if ( typeof Symbol === "function" ) { + jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ]; +} + +// Populate the class2type map +jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), + function( _i, name ) { + class2type[ "[object " + name + "]" ] = name.toLowerCase(); + } ); + +function nodeName( elem, name ) { + return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); +} + +var pop = arr.pop; + +// https://www.w3.org/TR/css3-selectors/#whitespace +var whitespace = "[\\x20\\t\\r\\n\\f]"; + +var isIE = document$1.documentMode; + +var rbuggyQSA = isIE && new RegExp( + + // Support: IE 9 - 11+ + // IE's :disabled selector does not pick up the children of disabled fieldsets + ":enabled|:disabled|" + + + // Support: IE 11+ + // IE 11 doesn't find elements on a `[name='']` query in some cases. + // Adding a temporary attribute to the document before the selection works + // around the issue. + "\\[" + whitespace + "*name" + whitespace + "*=" + + whitespace + "*(?:''|\"\")" + +); + +var rtrimCSS = new RegExp( + "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", + "g" +); + +// https://www.w3.org/TR/css-syntax-3/#ident-token-diagram +var identifier = "(?:\\\\[\\da-fA-F]{1,6}" + whitespace + + "?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+"; + +var rleadingCombinator = new RegExp( "^" + whitespace + "*([>+~]|" + + whitespace + ")" + whitespace + "*" ); + +var rdescend = new RegExp( whitespace + "|>" ); + +var rsibling = /[+~]/; + +var documentElement$1 = document$1.documentElement; + +// Support: IE 9 - 11+ +// IE requires a prefix. +var matches = documentElement$1.matches || documentElement$1.msMatchesSelector; + +/** + * Create key-value caches of limited size + * @returns {function(string, object)} Returns the Object data after storing it on itself with + * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) + * deleting the oldest entry + */ +function createCache() { + var keys = []; + + function cache( key, value ) { + + // Use (key + " ") to avoid collision with native prototype properties + // (see https://github.com/jquery/sizzle/issues/157) + if ( keys.push( key + " " ) > jQuery.expr.cacheLength ) { + + // Only keep the most recent entries + delete cache[ keys.shift() ]; + } + return ( cache[ key + " " ] = value ); + } + return cache; +} + +/** + * Checks a node for validity as a jQuery selector context + * @param {Element|Object=} context + * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value + */ +function testContext( context ) { + return context && typeof context.getElementsByTagName !== "undefined" && context; +} + +// Attribute selectors: https://www.w3.org/TR/selectors/#attribute-selectors +var attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + + + // Operator (capture 2) + "*([*^$|!~]?=)" + whitespace + + + // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]" + "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + + whitespace + "*\\]"; + +var pseudos = ":(" + identifier + ")(?:\\((" + + + // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: + // 1. quoted (capture 3; capture 4 or capture 5) + "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + + + // 2. simple (capture 6) + "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + + + // 3. anything else (capture 2) + ".*" + + ")\\)|)"; + +var filterMatchExpr = { + ID: new RegExp( "^#(" + identifier + ")" ), + CLASS: new RegExp( "^\\.(" + identifier + ")" ), + TAG: new RegExp( "^(" + identifier + "|[*])" ), + ATTR: new RegExp( "^" + attributes ), + PSEUDO: new RegExp( "^" + pseudos ), + CHILD: new RegExp( + "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + + whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + + whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ) +}; + +var rpseudo = new RegExp( pseudos ); + +// CSS escapes +// https://www.w3.org/TR/CSS21/syndata.html#escaped-characters + +var runescape = new RegExp( "\\\\[\\da-fA-F]{1,6}" + whitespace + + "?|\\\\([^\\r\\n\\f])", "g" ), + funescape = function( escape, nonHex ) { + var high = "0x" + escape.slice( 1 ) - 0x10000; + + if ( nonHex ) { + + // Strip the backslash prefix from a non-hex escape sequence + return nonHex; + } + + // Replace a hexadecimal escape sequence with the encoded Unicode code point + // Support: IE <=11+ + // For values outside the Basic Multilingual Plane (BMP), manually construct a + // surrogate pair + return high < 0 ? + String.fromCharCode( high + 0x10000 ) : + String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); + }; + +function unescapeSelector( sel ) { + return sel.replace( runescape, funescape ); +} + +function selectorError( msg ) { + jQuery.error( "Syntax error, unrecognized expression: " + msg ); +} + +var rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ); + +var tokenCache = createCache(); + +function tokenize( selector, parseOnly ) { + var matched, match, tokens, type, + soFar, groups, preFilters, + cached = tokenCache[ selector + " " ]; + + if ( cached ) { + return parseOnly ? 0 : cached.slice( 0 ); + } + + soFar = selector; + groups = []; + preFilters = jQuery.expr.preFilter; + + while ( soFar ) { + + // Comma and first run + if ( !matched || ( match = rcomma.exec( soFar ) ) ) { + if ( match ) { + + // Don't consume trailing commas as valid + soFar = soFar.slice( match[ 0 ].length ) || soFar; + } + groups.push( ( tokens = [] ) ); + } + + matched = false; + + // Combinators + if ( ( match = rleadingCombinator.exec( soFar ) ) ) { + matched = match.shift(); + tokens.push( { + value: matched, + + // Cast descendant combinators to space + type: match[ 0 ].replace( rtrimCSS, " " ) + } ); + soFar = soFar.slice( matched.length ); + } + + // Filters + for ( type in filterMatchExpr ) { + if ( ( match = jQuery.expr.match[ type ].exec( soFar ) ) && ( !preFilters[ type ] || + ( match = preFilters[ type ]( match ) ) ) ) { + matched = match.shift(); + tokens.push( { + value: matched, + type: type, + matches: match + } ); + soFar = soFar.slice( matched.length ); + } + } + + if ( !matched ) { + break; + } + } + + // Return the length of the invalid excess + // if we're just parsing + // Otherwise, throw an error or return tokens + if ( parseOnly ) { + return soFar.length; + } + + return soFar ? + selectorError( selector ) : + + // Cache the tokens + tokenCache( selector, groups ).slice( 0 ); +} + +var preFilter = { + ATTR: function( match ) { + match[ 1 ] = unescapeSelector( match[ 1 ] ); + + // Move the given value to match[3] whether quoted or unquoted + match[ 3 ] = unescapeSelector( match[ 3 ] || match[ 4 ] || match[ 5 ] || "" ); + + if ( match[ 2 ] === "~=" ) { + match[ 3 ] = " " + match[ 3 ] + " "; + } + + return match.slice( 0, 4 ); + }, + + CHILD: function( match ) { + + /* matches from filterMatchExpr["CHILD"] + 1 type (only|nth|...) + 2 what (child|of-type) + 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) + 4 xn-component of xn+y argument ([+-]?\d*n|) + 5 sign of xn-component + 6 x of xn-component + 7 sign of y-component + 8 y of y-component + */ + match[ 1 ] = match[ 1 ].toLowerCase(); + + if ( match[ 1 ].slice( 0, 3 ) === "nth" ) { + + // nth-* requires argument + if ( !match[ 3 ] ) { + selectorError( match[ 0 ] ); + } + + // numeric x and y parameters for jQuery.expr.filter.CHILD + // remember that false/true cast respectively to 0/1 + match[ 4 ] = +( match[ 4 ] ? + match[ 5 ] + ( match[ 6 ] || 1 ) : + 2 * ( match[ 3 ] === "even" || match[ 3 ] === "odd" ) + ); + match[ 5 ] = +( ( match[ 7 ] + match[ 8 ] ) || match[ 3 ] === "odd" ); + + // other types prohibit arguments + } else if ( match[ 3 ] ) { + selectorError( match[ 0 ] ); + } + + return match; + }, + + PSEUDO: function( match ) { + var excess, + unquoted = !match[ 6 ] && match[ 2 ]; + + if ( filterMatchExpr.CHILD.test( match[ 0 ] ) ) { + return null; + } + + // Accept quoted arguments as-is + if ( match[ 3 ] ) { + match[ 2 ] = match[ 4 ] || match[ 5 ] || ""; + + // Strip excess characters from unquoted arguments + } else if ( unquoted && rpseudo.test( unquoted ) && + + // Get excess from tokenize (recursively) + ( excess = tokenize( unquoted, true ) ) && + + // advance to the next closing parenthesis + ( excess = unquoted.indexOf( ")", unquoted.length - excess ) - + unquoted.length ) ) { + + // excess is a negative index + match[ 0 ] = match[ 0 ].slice( 0, excess ); + match[ 2 ] = unquoted.slice( 0, excess ); + } + + // Return only captures needed by the pseudo filter method (type and argument) + return match.slice( 0, 3 ); + } +}; + +function toSelector( tokens ) { + var i = 0, + len = tokens.length, + selector = ""; + for ( ; i < len; i++ ) { + selector += tokens[ i ].value; + } + return selector; +} + +// Multifunctional method to get and set values of a collection +// The value/s can optionally be executed if it's a function +function access( elems, fn, key, value, chainable, emptyGet, raw ) { + var i = 0, + len = elems.length, + bulk = key == null; + + // Sets many values + if ( toType( key ) === "object" ) { + chainable = true; + for ( i in key ) { + access( elems, fn, i, key[ i ], true, emptyGet, raw ); + } + + // Sets one value + } else if ( value !== undefined ) { + chainable = true; + + if ( typeof value !== "function" ) { + raw = true; + } + + if ( bulk ) { + + // Bulk operations run against the entire set + if ( raw ) { + fn.call( elems, value ); + fn = null; + + // ...except when executing function values + } else { + bulk = fn; + fn = function( elem, _key, value ) { + return bulk.call( jQuery( elem ), value ); + }; + } + } + + if ( fn ) { + for ( ; i < len; i++ ) { + fn( + elems[ i ], key, raw ? + value : + value.call( elems[ i ], i, fn( elems[ i ], key ) ) + ); + } + } + } + + if ( chainable ) { + return elems; + } + + // Gets + if ( bulk ) { + return fn.call( elems ); + } + + return len ? fn( elems[ 0 ], key ) : emptyGet; +} + +// Only count HTML whitespace +// Other whitespace should count in values +// https://infra.spec.whatwg.org/#ascii-whitespace +var rnothtmlwhite = /[^\x20\t\r\n\f]+/g; + +jQuery.fn.extend( { + attr: function( name, value ) { + return access( this, jQuery.attr, name, value, arguments.length > 1 ); + }, + + removeAttr: function( name ) { + return this.each( function() { + jQuery.removeAttr( this, name ); + } ); + } +} ); + +jQuery.extend( { + attr: function( elem, name, value ) { + var ret, hooks, + nType = elem.nodeType; + + // Don't get/set attributes on text, comment and attribute nodes + if ( nType === 3 || nType === 8 || nType === 2 ) { + return; + } + + // Fallback to prop when attributes are not supported + if ( typeof elem.getAttribute === "undefined" ) { + return jQuery.prop( elem, name, value ); + } + + // Attribute hooks are determined by the lowercase version + // Grab necessary hook if one is defined + if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { + hooks = jQuery.attrHooks[ name.toLowerCase() ]; + } + + if ( value !== undefined ) { + if ( value === null || + + // For compat with previous handling of boolean attributes, + // remove when `false` passed. For ARIA attributes - + // many of which recognize a `"false"` value - continue to + // set the `"false"` value as jQuery <4 did. + ( value === false && name.toLowerCase().indexOf( "aria-" ) !== 0 ) ) { + + jQuery.removeAttr( elem, name ); + return; + } + + if ( hooks && "set" in hooks && + ( ret = hooks.set( elem, value, name ) ) !== undefined ) { + return ret; + } + + elem.setAttribute( name, value ); + return value; + } + + if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { + return ret; + } + + ret = elem.getAttribute( name ); + + // Non-existent attributes return null, we normalize to undefined + return ret == null ? undefined : ret; + }, + + attrHooks: {}, + + removeAttr: function( elem, value ) { + var name, + i = 0, + + // Attribute names can contain non-HTML whitespace characters + // https://html.spec.whatwg.org/multipage/syntax.html#attributes-2 + attrNames = value && value.match( rnothtmlwhite ); + + if ( attrNames && elem.nodeType === 1 ) { + while ( ( name = attrNames[ i++ ] ) ) { + elem.removeAttribute( name ); + } + } + } +} ); + +// Support: IE <=11+ +// An input loses its value after becoming a radio +if ( isIE ) { + jQuery.attrHooks.type = { + set: function( elem, value ) { + if ( value === "radio" && nodeName( elem, "input" ) ) { + var val = elem.value; + elem.setAttribute( "type", value ); + if ( val ) { + elem.value = val; + } + return value; + } + } + }; +} + +// CSS string/identifier serialization +// https://drafts.csswg.org/cssom/#common-serializing-idioms +var rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g; + +function fcssescape( ch, asCodePoint ) { + if ( asCodePoint ) { + + // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER + if ( ch === "\0" ) { + return "\uFFFD"; + } + + // Control characters and (dependent upon position) numbers get escaped as code points + return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " "; + } + + // Other potentially-special ASCII characters get backslash-escaped + return "\\" + ch; +} + +jQuery.escapeSelector = function( sel ) { + return ( sel + "" ).replace( rcssescape, fcssescape ); +}; + +var sort = arr.sort; + +var splice = arr.splice; + +var hasDuplicate; + +// Document order sorting +function sortOrder( a, b ) { + + // Flag for duplicate removal + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + // Sort on method existence if only one input has compareDocumentPosition + var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; + if ( compare ) { + return compare; + } + + // Calculate position if both inputs belong to the same document + // Support: IE 11+ + // IE sometimes throws a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + compare = ( a.ownerDocument || a ) == ( b.ownerDocument || b ) ? + a.compareDocumentPosition( b ) : + + // Otherwise we know they are disconnected + 1; + + // Disconnected nodes + if ( compare & 1 ) { + + // Choose the first element that is related to the document + // Support: IE 11+ + // IE sometimes throws a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( a == document$1 || a.ownerDocument == document$1 && + jQuery.contains( document$1, a ) ) { + return -1; + } + + // Support: IE 11+ + // IE sometimes throws a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( b == document$1 || b.ownerDocument == document$1 && + jQuery.contains( document$1, b ) ) { + return 1; + } + + // Maintain original order + return 0; + } + + return compare & 4 ? -1 : 1; +} + +/** + * Document sorting and removing duplicates + * @param {ArrayLike} results + */ +jQuery.uniqueSort = function( results ) { + var elem, + duplicates = [], + j = 0, + i = 0; + + hasDuplicate = false; + + sort.call( results, sortOrder ); + + if ( hasDuplicate ) { + while ( ( elem = results[ i++ ] ) ) { + if ( elem === results[ i ] ) { + j = duplicates.push( i ); + } + } + while ( j-- ) { + splice.call( results, duplicates[ j ], 1 ); + } + } + + return results; +}; + +jQuery.fn.uniqueSort = function() { + return this.pushStack( jQuery.uniqueSort( slice.apply( this ) ) ); +}; + +var i, + outermostContext, + + // Local document vars + document, + documentElement, + documentIsHTML, + + // Instance-specific data + dirruns = 0, + done = 0, + classCache = createCache(), + compilerCache = createCache(), + nonnativeSelectorCache = createCache(), + + // Regular expressions + + // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter + rwhitespace = new RegExp( whitespace + "+", "g" ), + + ridentifier = new RegExp( "^" + identifier + "$" ), + + matchExpr = jQuery.extend( { + + // For use in libraries implementing .is() + // We use this for POS matching in `select` + needsContext: new RegExp( "^" + whitespace + + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace + + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) + }, filterMatchExpr ), + + rinputs = /^(?:input|select|textarea|button)$/i, + rheader = /^h\d$/i, + + // Easily-parseable/retrievable ID or TAG or CLASS selectors + rquickExpr$1 = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, + + // Used for iframes; see `setDocument`. + // Support: IE 9 - 11+ + // Removing the function wrapper causes a "Permission Denied" + // error in IE. + unloadHandler = function() { + setDocument(); + }, + + inDisabledFieldset = addCombinator( + function( elem ) { + return elem.disabled === true && nodeName( elem, "fieldset" ); + }, + { dir: "parentNode", next: "legend" } + ); + +function find( selector, context, results, seed ) { + var m, i, elem, nid, match, groups, newSelector, + newContext = context && context.ownerDocument, + + // nodeType defaults to 9, since context defaults to document + nodeType = context ? context.nodeType : 9; + + results = results || []; + + // Return early from calls with invalid selector or context + if ( typeof selector !== "string" || !selector || + nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { + + return results; + } + + // Try to shortcut find operations (as opposed to filters) in HTML documents + if ( !seed ) { + setDocument( context ); + context = context || document; + + if ( documentIsHTML ) { + + // If the selector is sufficiently simple, try using a "get*By*" DOM method + // (excepting DocumentFragment context, where the methods don't exist) + if ( nodeType !== 11 && ( match = rquickExpr$1.exec( selector ) ) ) { + + // ID selector + if ( ( m = match[ 1 ] ) ) { + + // Document context + if ( nodeType === 9 ) { + if ( ( elem = context.getElementById( m ) ) ) { + push.call( results, elem ); + } + return results; + + // Element context + } else { + if ( newContext && ( elem = newContext.getElementById( m ) ) && + jQuery.contains( context, elem ) ) { + + push.call( results, elem ); + return results; + } + } + + // Type selector + } else if ( match[ 2 ] ) { + push.apply( results, context.getElementsByTagName( selector ) ); + return results; + + // Class selector + } else if ( ( m = match[ 3 ] ) && context.getElementsByClassName ) { + push.apply( results, context.getElementsByClassName( m ) ); + return results; + } + } + + // Take advantage of querySelectorAll + if ( !nonnativeSelectorCache[ selector + " " ] && + ( !rbuggyQSA || !rbuggyQSA.test( selector ) ) ) { + + newSelector = selector; + newContext = context; + + // qSA considers elements outside a scoping root when evaluating child or + // descendant combinators, which is not what we want. + // In such cases, we work around the behavior by prefixing every selector in the + // list with an ID selector referencing the scope context. + // The technique has to be used as well when a leading combinator is used + // as such selectors are not recognized by querySelectorAll. + // Thanks to Andrew Dupont for this technique. + if ( nodeType === 1 && + ( rdescend.test( selector ) || rleadingCombinator.test( selector ) ) ) { + + // Expand context for sibling selectors + newContext = rsibling.test( selector ) && + testContext( context.parentNode ) || + context; + + // Outside of IE, if we're not changing the context we can + // use :scope instead of an ID. + // Support: IE 11+ + // IE sometimes throws a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( newContext != context || isIE ) { + + // Capture the context ID, setting it first if necessary + if ( ( nid = context.getAttribute( "id" ) ) ) { + nid = jQuery.escapeSelector( nid ); + } else { + context.setAttribute( "id", ( nid = jQuery.expando ) ); + } + } + + // Prefix every selector in the list + groups = tokenize( selector ); + i = groups.length; + while ( i-- ) { + groups[ i ] = ( nid ? "#" + nid : ":scope" ) + " " + + toSelector( groups[ i ] ); + } + newSelector = groups.join( "," ); + } + + try { + push.apply( results, + newContext.querySelectorAll( newSelector ) + ); + return results; + } catch ( qsaError ) { + nonnativeSelectorCache( selector, true ); + } finally { + if ( nid === jQuery.expando ) { + context.removeAttribute( "id" ); + } + } + } + } + } + + // All others + return select( selector.replace( rtrimCSS, "$1" ), context, results, seed ); +} + +/** + * Mark a function for special use by jQuery selector module + * @param {Function} fn The function to mark + */ +function markFunction( fn ) { + fn[ jQuery.expando ] = true; + return fn; +} + +/** + * Returns a function to use in pseudos for input types + * @param {String} type + */ +function createInputPseudo( type ) { + return function( elem ) { + return nodeName( elem, "input" ) && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for buttons + * @param {String} type + */ +function createButtonPseudo( type ) { + return function( elem ) { + return ( nodeName( elem, "input" ) || nodeName( elem, "button" ) ) && + elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for :enabled/:disabled + * @param {Boolean} disabled true for :disabled; false for :enabled + */ +function createDisabledPseudo( disabled ) { + + // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable + return function( elem ) { + + // Only certain elements can match :enabled or :disabled + // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled + // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled + if ( "form" in elem ) { + + // Check for inherited disabledness on relevant non-disabled elements: + // * listed form-associated elements in a disabled fieldset + // https://html.spec.whatwg.org/multipage/forms.html#category-listed + // https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled + // * option elements in a disabled optgroup + // https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled + // All such elements have a "form" property. + if ( elem.parentNode && elem.disabled === false ) { + + // Option elements defer to a parent optgroup if present + if ( "label" in elem ) { + if ( "label" in elem.parentNode ) { + return elem.parentNode.disabled === disabled; + } else { + return elem.disabled === disabled; + } + } + + // Support: IE 6 - 11+ + // Use the isDisabled shortcut property to check for disabled fieldset ancestors + return elem.isDisabled === disabled || + + // Where there is no isDisabled, check manually + elem.isDisabled !== !disabled && + inDisabledFieldset( elem ) === disabled; + } + + return elem.disabled === disabled; + + // Try to winnow out elements that can't be disabled before trusting the disabled property. + // Some victims get caught in our net (label, legend, menu, track), but it shouldn't + // even exist on them, let alone have a boolean value. + } else if ( "label" in elem ) { + return elem.disabled === disabled; + } + + // Remaining elements are neither :enabled nor :disabled + return false; + }; +} + +/** + * Returns a function to use in pseudos for positionals + * @param {Function} fn + */ +function createPositionalPseudo( fn ) { + return markFunction( function( argument ) { + argument = +argument; + return markFunction( function( seed, matches ) { + var j, + matchIndexes = fn( [], seed.length, argument ), + i = matchIndexes.length; + + // Match elements found at the specified indexes + while ( i-- ) { + if ( seed[ ( j = matchIndexes[ i ] ) ] ) { + seed[ j ] = !( matches[ j ] = seed[ j ] ); + } + } + } ); + } ); +} + +/** + * Sets document-related variables once based on the current document + * @param {Element|Object} [node] An element or document object to use to set the document + */ +function setDocument( node ) { + var subWindow, + doc = node ? node.ownerDocument || node : document$1; + + // Return early if doc is invalid or already selected + // Support: IE 11+ + // IE sometimes throws a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( doc == document || doc.nodeType !== 9 ) { + return; + } + + // Update global variables + document = doc; + documentElement = document.documentElement; + documentIsHTML = !jQuery.isXMLDoc( document ); + + // Support: IE 9 - 11+ + // Accessing iframe documents after unload throws "permission denied" errors (see trac-13936) + // Support: IE 11+ + // IE sometimes throws a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( isIE && document$1 != document && + ( subWindow = document.defaultView ) && subWindow.top !== subWindow ) { + subWindow.addEventListener( "unload", unloadHandler ); + } +} + +find.matches = function( expr, elements ) { + return find( expr, null, null, elements ); +}; + +find.matchesSelector = function( elem, expr ) { + setDocument( elem ); + + if ( documentIsHTML && + !nonnativeSelectorCache[ expr + " " ] && + ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { + + try { + return matches.call( elem, expr ); + } catch ( e ) { + nonnativeSelectorCache( expr, true ); + } + } + + return find( expr, document, null, [ elem ] ).length > 0; +}; + +jQuery.expr = { + + // Can be adjusted by the user + cacheLength: 50, + + createPseudo: markFunction, + + match: matchExpr, + + find: { + ID: function( id, context ) { + if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { + var elem = context.getElementById( id ); + return elem ? [ elem ] : []; + } + }, + + TAG: function( tag, context ) { + if ( typeof context.getElementsByTagName !== "undefined" ) { + return context.getElementsByTagName( tag ); + + // DocumentFragment nodes don't have gEBTN + } else { + return context.querySelectorAll( tag ); + } + }, + + CLASS: function( className, context ) { + if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) { + return context.getElementsByClassName( className ); + } + } + }, + + relative: { + ">": { dir: "parentNode", first: true }, + " ": { dir: "parentNode" }, + "+": { dir: "previousSibling", first: true }, + "~": { dir: "previousSibling" } + }, + + preFilter: preFilter, + + filter: { + ID: function( id ) { + var attrId = unescapeSelector( id ); + return function( elem ) { + return elem.getAttribute( "id" ) === attrId; + }; + }, + + TAG: function( nodeNameSelector ) { + var expectedNodeName = unescapeSelector( nodeNameSelector ).toLowerCase(); + return nodeNameSelector === "*" ? + + function() { + return true; + } : + + function( elem ) { + return nodeName( elem, expectedNodeName ); + }; + }, + + CLASS: function( className ) { + var pattern = classCache[ className + " " ]; + + return pattern || + ( pattern = new RegExp( "(^|" + whitespace + ")" + className + + "(" + whitespace + "|$)" ) ) && + classCache( className, function( elem ) { + return pattern.test( + typeof elem.className === "string" && elem.className || + typeof elem.getAttribute !== "undefined" && + elem.getAttribute( "class" ) || + "" + ); + } ); + }, + + ATTR: function( name, operator, check ) { + return function( elem ) { + var result = jQuery.attr( elem, name ); + + if ( result == null ) { + return operator === "!="; + } + if ( !operator ) { + return true; + } + + result += ""; + + if ( operator === "=" ) { + return result === check; + } + if ( operator === "!=" ) { + return result !== check; + } + if ( operator === "^=" ) { + return check && result.indexOf( check ) === 0; + } + if ( operator === "*=" ) { + return check && result.indexOf( check ) > -1; + } + if ( operator === "$=" ) { + return check && result.slice( -check.length ) === check; + } + if ( operator === "~=" ) { + return ( " " + result.replace( rwhitespace, " " ) + " " ) + .indexOf( check ) > -1; + } + if ( operator === "|=" ) { + return result === check || result.slice( 0, check.length + 1 ) === check + "-"; + } + + return false; + }; + }, + + CHILD: function( type, what, _argument, first, last ) { + var simple = type.slice( 0, 3 ) !== "nth", + forward = type.slice( -4 ) !== "last", + ofType = what === "of-type"; + + return first === 1 && last === 0 ? + + // Shortcut for :nth-*(n) + function( elem ) { + return !!elem.parentNode; + } : + + function( elem, _context, xml ) { + var cache, outerCache, node, nodeIndex, start, + dir = simple !== forward ? "nextSibling" : "previousSibling", + parent = elem.parentNode, + name = ofType && elem.nodeName.toLowerCase(), + useCache = !xml && !ofType, + diff = false; + + if ( parent ) { + + // :(first|last|only)-(child|of-type) + if ( simple ) { + while ( dir ) { + node = elem; + while ( ( node = node[ dir ] ) ) { + if ( ofType ? + nodeName( node, name ) : + node.nodeType === 1 ) { + + return false; + } + } + + // Reverse direction for :only-* (if we haven't yet done so) + start = dir = type === "only" && !start && "nextSibling"; + } + return true; + } + + start = [ forward ? parent.firstChild : parent.lastChild ]; + + // non-xml :nth-child(...) stores cache data on `parent` + if ( forward && useCache ) { + + // Seek `elem` from a previously-cached index + outerCache = parent[ jQuery.expando ] || + ( parent[ jQuery.expando ] = {} ); + cache = outerCache[ type ] || []; + nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; + diff = nodeIndex && cache[ 2 ]; + node = nodeIndex && parent.childNodes[ nodeIndex ]; + + while ( ( node = ++nodeIndex && node && node[ dir ] || + + // Fallback to seeking `elem` from the start + ( diff = nodeIndex = 0 ) || start.pop() ) ) { + + // When found, cache indexes on `parent` and break + if ( node.nodeType === 1 && ++diff && node === elem ) { + outerCache[ type ] = [ dirruns, nodeIndex, diff ]; + break; + } + } + + } else { + + // Use previously-cached element index if available + if ( useCache ) { + outerCache = elem[ jQuery.expando ] || + ( elem[ jQuery.expando ] = {} ); + cache = outerCache[ type ] || []; + nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; + diff = nodeIndex; + } + + // xml :nth-child(...) + // or :nth-last-child(...) or :nth(-last)?-of-type(...) + if ( diff === false ) { + + // Use the same loop as above to seek `elem` from the start + while ( ( node = ++nodeIndex && node && node[ dir ] || + ( diff = nodeIndex = 0 ) || start.pop() ) ) { + + if ( ( ofType ? + nodeName( node, name ) : + node.nodeType === 1 ) && + ++diff ) { + + // Cache the index of each encountered element + if ( useCache ) { + outerCache = node[ jQuery.expando ] || + ( node[ jQuery.expando ] = {} ); + outerCache[ type ] = [ dirruns, diff ]; + } + + if ( node === elem ) { + break; + } + } + } + } + } + + // Incorporate the offset, then check against cycle size + diff -= last; + return diff === first || ( diff % first === 0 && diff / first >= 0 ); + } + }; + }, + + PSEUDO: function( pseudo, argument ) { + + // pseudo-class names are case-insensitive + // https://www.w3.org/TR/selectors/#pseudo-classes + // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters + // Remember that setFilters inherits from pseudos + var fn = jQuery.expr.pseudos[ pseudo ] || + jQuery.expr.setFilters[ pseudo.toLowerCase() ] || + selectorError( "unsupported pseudo: " + pseudo ); + + // The user may use createPseudo to indicate that + // arguments are needed to create the filter function + // just as jQuery does + if ( fn[ jQuery.expando ] ) { + return fn( argument ); + } + + return fn; + } + }, + + pseudos: { + + // Potentially complex pseudos + not: markFunction( function( selector ) { + + // Trim the selector passed to compile + // to avoid treating leading and trailing + // spaces as combinators + var input = [], + results = [], + matcher = compile( selector.replace( rtrimCSS, "$1" ) ); + + return matcher[ jQuery.expando ] ? + markFunction( function( seed, matches, _context, xml ) { + var elem, + unmatched = matcher( seed, null, xml, [] ), + i = seed.length; + + // Match elements unmatched by `matcher` + while ( i-- ) { + if ( ( elem = unmatched[ i ] ) ) { + seed[ i ] = !( matches[ i ] = elem ); + } + } + } ) : + function( elem, _context, xml ) { + input[ 0 ] = elem; + matcher( input, null, xml, results ); + + // Don't keep the element + // (see https://github.com/jquery/sizzle/issues/299) + input[ 0 ] = null; + return !results.pop(); + }; + } ), + + has: markFunction( function( selector ) { + return function( elem ) { + return find( selector, elem ).length > 0; + }; + } ), + + contains: markFunction( function( text ) { + text = unescapeSelector( text ); + return function( elem ) { + return ( elem.textContent || jQuery.text( elem ) ).indexOf( text ) > -1; + }; + } ), + + // "Whether an element is represented by a :lang() selector + // is based solely on the element's language value + // being equal to the identifier C, + // or beginning with the identifier C immediately followed by "-". + // The matching of C against the element's language value is performed case-insensitively. + // The identifier C does not have to be a valid language name." + // https://www.w3.org/TR/selectors/#lang-pseudo + lang: markFunction( function( lang ) { + + // lang value must be a valid identifier + if ( !ridentifier.test( lang || "" ) ) { + selectorError( "unsupported lang: " + lang ); + } + lang = unescapeSelector( lang ).toLowerCase(); + return function( elem ) { + var elemLang; + do { + if ( ( elemLang = documentIsHTML ? + elem.lang : + elem.getAttribute( "xml:lang" ) || elem.getAttribute( "lang" ) ) ) { + + elemLang = elemLang.toLowerCase(); + return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; + } + } while ( ( elem = elem.parentNode ) && elem.nodeType === 1 ); + return false; + }; + } ), + + // Miscellaneous + target: function( elem ) { + var hash = window.location && window.location.hash; + return hash && hash.slice( 1 ) === elem.id; + }, + + root: function( elem ) { + return elem === documentElement; + }, + + focus: function( elem ) { + return elem === document.activeElement && + document.hasFocus() && + !!( elem.type || elem.href || ~elem.tabIndex ); + }, + + // Boolean properties + enabled: createDisabledPseudo( false ), + disabled: createDisabledPseudo( true ), + + checked: function( elem ) { + + // In CSS3, :checked should return both checked and selected elements + // https://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + return ( nodeName( elem, "input" ) && !!elem.checked ) || + ( nodeName( elem, "option" ) && !!elem.selected ); + }, + + selected: function( elem ) { + + // Support: IE <=11+ + // Accessing the selectedIndex property + // forces the browser to treat the default option as + // selected when in an optgroup. + if ( isIE && elem.parentNode ) { + // eslint-disable-next-line no-unused-expressions + elem.parentNode.selectedIndex; + } + + return elem.selected === true; + }, + + // Contents + empty: function( elem ) { + + // https://www.w3.org/TR/selectors/#empty-pseudo + // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), + // but not by others (comment: 8; processing instruction: 7; etc.) + // nodeType < 6 works because attributes (2) do not appear as children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + if ( elem.nodeType < 6 ) { + return false; + } + } + return true; + }, + + parent: function( elem ) { + return !jQuery.expr.pseudos.empty( elem ); + }, + + // Element/input types + header: function( elem ) { + return rheader.test( elem.nodeName ); + }, + + input: function( elem ) { + return rinputs.test( elem.nodeName ); + }, + + button: function( elem ) { + return nodeName( elem, "input" ) && elem.type === "button" || + nodeName( elem, "button" ); + }, + + text: function( elem ) { + return nodeName( elem, "input" ) && elem.type === "text"; + }, + + // Position-in-collection + first: createPositionalPseudo( function() { + return [ 0 ]; + } ), + + last: createPositionalPseudo( function( _matchIndexes, length ) { + return [ length - 1 ]; + } ), + + eq: createPositionalPseudo( function( _matchIndexes, length, argument ) { + return [ argument < 0 ? argument + length : argument ]; + } ), + + even: createPositionalPseudo( function( matchIndexes, length ) { + var i = 0; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + } ), + + odd: createPositionalPseudo( function( matchIndexes, length ) { + var i = 1; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + } ), + + lt: createPositionalPseudo( function( matchIndexes, length, argument ) { + var i; + + if ( argument < 0 ) { + i = argument + length; + } else if ( argument > length ) { + i = length; + } else { + i = argument; + } + + for ( ; --i >= 0; ) { + matchIndexes.push( i ); + } + return matchIndexes; + } ), + + gt: createPositionalPseudo( function( matchIndexes, length, argument ) { + var i = argument < 0 ? argument + length : argument; + for ( ; ++i < length; ) { + matchIndexes.push( i ); + } + return matchIndexes; + } ) + } +}; + +jQuery.expr.pseudos.nth = jQuery.expr.pseudos.eq; + +// Add button/input type pseudos +for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { + jQuery.expr.pseudos[ i ] = createInputPseudo( i ); +} +for ( i in { submit: true, reset: true } ) { + jQuery.expr.pseudos[ i ] = createButtonPseudo( i ); +} + +// Easy API for creating new setFilters +function setFilters() {} +setFilters.prototype = jQuery.expr.pseudos; +jQuery.expr.setFilters = new setFilters(); + +function addCombinator( matcher, combinator, base ) { + var dir = combinator.dir, + skip = combinator.next, + key = skip || dir, + checkNonElements = base && key === "parentNode", + doneName = done++; + + return combinator.first ? + + // Check against closest ancestor/preceding element + function( elem, context, xml ) { + while ( ( elem = elem[ dir ] ) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + return matcher( elem, context, xml ); + } + } + return false; + } : + + // Check against all ancestor/preceding elements + function( elem, context, xml ) { + var oldCache, outerCache, + newCache = [ dirruns, doneName ]; + + // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching + if ( xml ) { + while ( ( elem = elem[ dir ] ) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + if ( matcher( elem, context, xml ) ) { + return true; + } + } + } + } else { + while ( ( elem = elem[ dir ] ) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + outerCache = elem[ jQuery.expando ] || ( elem[ jQuery.expando ] = {} ); + + if ( skip && nodeName( elem, skip ) ) { + elem = elem[ dir ] || elem; + } else if ( ( oldCache = outerCache[ key ] ) && + oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { + + // Assign to newCache so results back-propagate to previous elements + return ( newCache[ 2 ] = oldCache[ 2 ] ); + } else { + + // Reuse newcache so results back-propagate to previous elements + outerCache[ key ] = newCache; + + // A match means we're done; a fail means we have to keep checking + if ( ( newCache[ 2 ] = matcher( elem, context, xml ) ) ) { + return true; + } + } + } + } + } + return false; + }; +} + +function elementMatcher( matchers ) { + return matchers.length > 1 ? + function( elem, context, xml ) { + var i = matchers.length; + while ( i-- ) { + if ( !matchers[ i ]( elem, context, xml ) ) { + return false; + } + } + return true; + } : + matchers[ 0 ]; +} + +function multipleContexts( selector, contexts, results ) { + var i = 0, + len = contexts.length; + for ( ; i < len; i++ ) { + find( selector, contexts[ i ], results ); + } + return results; +} + +function condense( unmatched, map, filter, context, xml ) { + var elem, + newUnmatched = [], + i = 0, + len = unmatched.length, + mapped = map != null; + + for ( ; i < len; i++ ) { + if ( ( elem = unmatched[ i ] ) ) { + if ( !filter || filter( elem, context, xml ) ) { + newUnmatched.push( elem ); + if ( mapped ) { + map.push( i ); + } + } + } + } + + return newUnmatched; +} + +function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { + if ( postFilter && !postFilter[ jQuery.expando ] ) { + postFilter = setMatcher( postFilter ); + } + if ( postFinder && !postFinder[ jQuery.expando ] ) { + postFinder = setMatcher( postFinder, postSelector ); + } + return markFunction( function( seed, results, context, xml ) { + var temp, i, elem, matcherOut, + preMap = [], + postMap = [], + preexisting = results.length, + + // Get initial elements from seed or context + elems = seed || + multipleContexts( selector || "*", + context.nodeType ? [ context ] : context, [] ), + + // Prefilter to get matcher input, preserving a map for seed-results synchronization + matcherIn = preFilter && ( seed || !selector ) ? + condense( elems, preMap, preFilter, context, xml ) : + elems; + + if ( matcher ) { + + // If we have a postFinder, or filtered seed, or non-seed postFilter + // or preexisting results, + matcherOut = postFinder || ( seed ? preFilter : preexisting || postFilter ) ? + + // ...intermediate processing is necessary + [] : + + // ...otherwise use results directly + results; + + // Find primary matches + matcher( matcherIn, matcherOut, context, xml ); + } else { + matcherOut = matcherIn; + } + + // Apply postFilter + if ( postFilter ) { + temp = condense( matcherOut, postMap ); + postFilter( temp, [], context, xml ); + + // Un-match failing elements by moving them back to matcherIn + i = temp.length; + while ( i-- ) { + if ( ( elem = temp[ i ] ) ) { + matcherOut[ postMap[ i ] ] = !( matcherIn[ postMap[ i ] ] = elem ); + } + } + } + + if ( seed ) { + if ( postFinder || preFilter ) { + if ( postFinder ) { + + // Get the final matcherOut by condensing this intermediate into postFinder contexts + temp = []; + i = matcherOut.length; + while ( i-- ) { + if ( ( elem = matcherOut[ i ] ) ) { + + // Restore matcherIn since elem is not yet a final match + temp.push( ( matcherIn[ i ] = elem ) ); + } + } + postFinder( null, ( matcherOut = [] ), temp, xml ); + } + + // Move matched elements from seed to results to keep them synchronized + i = matcherOut.length; + while ( i-- ) { + if ( ( elem = matcherOut[ i ] ) && + ( temp = postFinder ? indexOf.call( seed, elem ) : preMap[ i ] ) > -1 ) { + + seed[ temp ] = !( results[ temp ] = elem ); + } + } + } + + // Add elements to results, through postFinder if defined + } else { + matcherOut = condense( + matcherOut === results ? + matcherOut.splice( preexisting, matcherOut.length ) : + matcherOut + ); + if ( postFinder ) { + postFinder( null, results, matcherOut, xml ); + } else { + push.apply( results, matcherOut ); + } + } + } ); +} + +function matcherFromTokens( tokens ) { + var checkContext, matcher, j, + len = tokens.length, + leadingRelative = jQuery.expr.relative[ tokens[ 0 ].type ], + implicitRelative = leadingRelative || jQuery.expr.relative[ " " ], + i = leadingRelative ? 1 : 0, + + // The foundational matcher ensures that elements are reachable from top-level context(s) + matchContext = addCombinator( function( elem ) { + return elem === checkContext; + }, implicitRelative, true ), + matchAnyContext = addCombinator( function( elem ) { + return indexOf.call( checkContext, elem ) > -1; + }, implicitRelative, true ), + matchers = [ function( elem, context, xml ) { + + // Support: IE 11+ + // IE sometimes throws a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + var ret = ( !leadingRelative && ( xml || context != outermostContext ) ) || ( + ( checkContext = context ).nodeType ? + matchContext( elem, context, xml ) : + matchAnyContext( elem, context, xml ) ); + + // Avoid hanging onto element + // (see https://github.com/jquery/sizzle/issues/299) + checkContext = null; + return ret; + } ]; + + for ( ; i < len; i++ ) { + if ( ( matcher = jQuery.expr.relative[ tokens[ i ].type ] ) ) { + matchers = [ addCombinator( elementMatcher( matchers ), matcher ) ]; + } else { + matcher = jQuery.expr.filter[ tokens[ i ].type ].apply( null, tokens[ i ].matches ); + + // Return special upon seeing a positional matcher + if ( matcher[ jQuery.expando ] ) { + + // Find the next relative operator (if any) for proper handling + j = ++i; + for ( ; j < len; j++ ) { + if ( jQuery.expr.relative[ tokens[ j ].type ] ) { + break; + } + } + return setMatcher( + i > 1 && elementMatcher( matchers ), + i > 1 && toSelector( + + // If the preceding token was a descendant combinator, insert an implicit any-element `*` + tokens.slice( 0, i - 1 ) + .concat( { value: tokens[ i - 2 ].type === " " ? "*" : "" } ) + ).replace( rtrimCSS, "$1" ), + matcher, + i < j && matcherFromTokens( tokens.slice( i, j ) ), + j < len && matcherFromTokens( ( tokens = tokens.slice( j ) ) ), + j < len && toSelector( tokens ) + ); + } + matchers.push( matcher ); + } + } + + return elementMatcher( matchers ); +} + +function matcherFromGroupMatchers( elementMatchers, setMatchers ) { + var bySet = setMatchers.length > 0, + byElement = elementMatchers.length > 0, + superMatcher = function( seed, context, xml, results, outermost ) { + var elem, j, matcher, + matchedCount = 0, + i = "0", + unmatched = seed && [], + setMatched = [], + contextBackup = outermostContext, + + // We must always have either seed elements or outermost context + elems = seed || byElement && jQuery.expr.find.TAG( "*", outermost ), + + // Use integer dirruns iff this is the outermost matcher + dirrunsUnique = ( dirruns += contextBackup == null ? 1 : Math.random() || 0.1 ); + + if ( outermost ) { + + // Support: IE 11+ + // IE sometimes throws a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + outermostContext = context == document || context || outermost; + } + + // Add elements passing elementMatchers directly to results + for ( ; ( elem = elems[ i ] ) != null; i++ ) { + if ( byElement && elem ) { + j = 0; + + // Support: IE 11+ + // IE sometimes throws a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( !context && elem.ownerDocument != document ) { + setDocument( elem ); + xml = !documentIsHTML; + } + while ( ( matcher = elementMatchers[ j++ ] ) ) { + if ( matcher( elem, context || document, xml ) ) { + push.call( results, elem ); + break; + } + } + if ( outermost ) { + dirruns = dirrunsUnique; + } + } + + // Track unmatched elements for set filters + if ( bySet ) { + + // They will have gone through all possible matchers + if ( ( elem = !matcher && elem ) ) { + matchedCount--; + } + + // Lengthen the array for every element, matched or not + if ( seed ) { + unmatched.push( elem ); + } + } + } + + // `i` is now the count of elements visited above, and adding it to `matchedCount` + // makes the latter nonnegative. + matchedCount += i; + + // Apply set filters to unmatched elements + // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount` + // equals `i`), unless we didn't visit _any_ elements in the above loop because we have + // no element matchers and no seed. + // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that + // case, which will result in a "00" `matchedCount` that differs from `i` but is also + // numerically zero. + if ( bySet && i !== matchedCount ) { + j = 0; + while ( ( matcher = setMatchers[ j++ ] ) ) { + matcher( unmatched, setMatched, context, xml ); + } + + if ( seed ) { + + // Reintegrate element matches to eliminate the need for sorting + if ( matchedCount > 0 ) { + while ( i-- ) { + if ( !( unmatched[ i ] || setMatched[ i ] ) ) { + setMatched[ i ] = pop.call( results ); + } + } + } + + // Discard index placeholder values to get only actual matches + setMatched = condense( setMatched ); + } + + // Add matches to results + push.apply( results, setMatched ); + + // Seedless set matches succeeding multiple successful matchers stipulate sorting + if ( outermost && !seed && setMatched.length > 0 && + ( matchedCount + setMatchers.length ) > 1 ) { + + jQuery.uniqueSort( results ); + } + } + + // Override manipulation of globals by nested matchers + if ( outermost ) { + dirruns = dirrunsUnique; + outermostContext = contextBackup; + } + + return unmatched; + }; + + return bySet ? + markFunction( superMatcher ) : + superMatcher; +} + +function compile( selector, match /* Internal Use Only */ ) { + var i, + setMatchers = [], + elementMatchers = [], + cached = compilerCache[ selector + " " ]; + + if ( !cached ) { + + // Generate a function of recursive functions that can be used to check each element + if ( !match ) { + match = tokenize( selector ); + } + i = match.length; + while ( i-- ) { + cached = matcherFromTokens( match[ i ] ); + if ( cached[ jQuery.expando ] ) { + setMatchers.push( cached ); + } else { + elementMatchers.push( cached ); + } + } + + // Cache the compiled function + cached = compilerCache( selector, + matcherFromGroupMatchers( elementMatchers, setMatchers ) ); + + // Save selector and tokenization + cached.selector = selector; + } + return cached; +} + +/** + * A low-level selection function that works with jQuery's compiled + * selector functions + * @param {String|Function} selector A selector or a pre-compiled + * selector function built with jQuery selector compile + * @param {Element} context + * @param {Array} [results] + * @param {Array} [seed] A set of elements to match against + */ +function select( selector, context, results, seed ) { + var i, tokens, token, type, find, + compiled = typeof selector === "function" && selector, + match = !seed && tokenize( ( selector = compiled.selector || selector ) ); + + results = results || []; + + // Try to minimize operations if there is only one selector in the list and no seed + // (the latter of which guarantees us context) + if ( match.length === 1 ) { + + // Reduce context if the leading compound selector is an ID + tokens = match[ 0 ] = match[ 0 ].slice( 0 ); + if ( tokens.length > 2 && ( token = tokens[ 0 ] ).type === "ID" && + context.nodeType === 9 && documentIsHTML && + jQuery.expr.relative[ tokens[ 1 ].type ] ) { + + context = ( jQuery.expr.find.ID( + unescapeSelector( token.matches[ 0 ] ), + context + ) || [] )[ 0 ]; + if ( !context ) { + return results; + + // Precompiled matchers will still verify ancestry, so step up a level + } else if ( compiled ) { + context = context.parentNode; + } + + selector = selector.slice( tokens.shift().value.length ); + } + + // Fetch a seed set for right-to-left matching + i = matchExpr.needsContext.test( selector ) ? 0 : tokens.length; + while ( i-- ) { + token = tokens[ i ]; + + // Abort if we hit a combinator + if ( jQuery.expr.relative[ ( type = token.type ) ] ) { + break; + } + if ( ( find = jQuery.expr.find[ type ] ) ) { + + // Search, expanding context for leading sibling combinators + if ( ( seed = find( + unescapeSelector( token.matches[ 0 ] ), + rsibling.test( tokens[ 0 ].type ) && + testContext( context.parentNode ) || context + ) ) ) { + + // If seed is empty or no tokens remain, we can return early + tokens.splice( i, 1 ); + selector = seed.length && toSelector( tokens ); + if ( !selector ) { + push.apply( results, seed ); + return results; + } + + break; + } + } + } + } + + // Compile and execute a filtering function if one is not provided + // Provide `match` to avoid retokenization if we modified the selector above + ( compiled || compile( selector, match ) )( + seed, + context, + !documentIsHTML, + results, + !context || rsibling.test( selector ) && testContext( context.parentNode ) || context + ); + return results; +} + +// Initialize against the default document +setDocument(); + +jQuery.find = find; + +// These have always been private, but they used to be documented as part of +// Sizzle so let's maintain them for now for backwards compatibility purposes. +find.compile = compile; +find.select = select; +find.setDocument = setDocument; +find.tokenize = tokenize; + +function dir( elem, dir, until ) { + var matched = [], + truncate = until !== undefined; + + while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) { + if ( elem.nodeType === 1 ) { + if ( truncate && jQuery( elem ).is( until ) ) { + break; + } + matched.push( elem ); + } + } + return matched; +} + +function siblings( n, elem ) { + var matched = []; + + for ( ; n; n = n.nextSibling ) { + if ( n.nodeType === 1 && n !== elem ) { + matched.push( n ); + } + } + + return matched; +} + +var rneedsContext = jQuery.expr.match.needsContext; + +// rsingleTag matches a string consisting of a single HTML element with no attributes +// and captures the element's name +var rsingleTag = /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i; + +function isObviousHtml( input ) { + return input[ 0 ] === "<" && + input[ input.length - 1 ] === ">" && + input.length >= 3; +} + +// Implement the identical functionality for filter and not +function winnow( elements, qualifier, not ) { + if ( typeof qualifier === "function" ) { + return jQuery.grep( elements, function( elem, i ) { + return !!qualifier.call( elem, i, elem ) !== not; + } ); + } + + // Single element + if ( qualifier.nodeType ) { + return jQuery.grep( elements, function( elem ) { + return ( elem === qualifier ) !== not; + } ); + } + + // Arraylike of elements (jQuery, arguments, Array) + if ( typeof qualifier !== "string" ) { + return jQuery.grep( elements, function( elem ) { + return ( indexOf.call( qualifier, elem ) > -1 ) !== not; + } ); + } + + // Filtered directly for both simple and complex selectors + return jQuery.filter( qualifier, elements, not ); +} + +jQuery.filter = function( expr, elems, not ) { + var elem = elems[ 0 ]; + + if ( not ) { + expr = ":not(" + expr + ")"; + } + + if ( elems.length === 1 && elem.nodeType === 1 ) { + return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : []; + } + + return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { + return elem.nodeType === 1; + } ) ); +}; + +jQuery.fn.extend( { + find: function( selector ) { + var i, ret, + len = this.length, + self = this; + + if ( typeof selector !== "string" ) { + return this.pushStack( jQuery( selector ).filter( function() { + for ( i = 0; i < len; i++ ) { + if ( jQuery.contains( self[ i ], this ) ) { + return true; + } + } + } ) ); + } + + ret = this.pushStack( [] ); + + for ( i = 0; i < len; i++ ) { + jQuery.find( selector, self[ i ], ret ); + } + + return len > 1 ? jQuery.uniqueSort( ret ) : ret; + }, + filter: function( selector ) { + return this.pushStack( winnow( this, selector || [], false ) ); + }, + not: function( selector ) { + return this.pushStack( winnow( this, selector || [], true ) ); + }, + is: function( selector ) { + return !!winnow( + this, + + // If this is a positional/relative selector, check membership in the returned set + // so $("p:first").is("p:last") won't return true for a doc with two "p". + typeof selector === "string" && rneedsContext.test( selector ) ? + jQuery( selector ) : + selector || [], + false + ).length; + } +} ); + +// Initialize a jQuery object + +// A central reference to the root jQuery(document) +var rootjQuery, + + // A simple way to check for HTML strings + // Prioritize #id over to avoid XSS via location.hash (trac-9521) + // Strict HTML recognition (trac-11290: must start with <) + // Shortcut simple #id case for speed + rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/, + + init = jQuery.fn.init = function( selector, context ) { + var match, elem; + + // HANDLE: $(""), $(null), $(undefined), $(false) + if ( !selector ) { + return this; + } + + // HANDLE: $(DOMElement) + if ( selector.nodeType ) { + this[ 0 ] = selector; + this.length = 1; + return this; + + // HANDLE: $(function) + // Shortcut for document ready + } else if ( typeof selector === "function" ) { + return rootjQuery.ready !== undefined ? + rootjQuery.ready( selector ) : + + // Execute immediately if ready is not present + selector( jQuery ); + + } else { + + // Handle obvious HTML strings + match = selector + ""; + if ( isObviousHtml( match ) ) { + + // Assume that strings that start and end with <> are HTML and skip + // the regex check. This also handles browser-supported HTML wrappers + // like TrustedHTML. + match = [ null, selector, null ]; + + // Handle HTML strings or selectors + } else if ( typeof selector === "string" ) { + match = rquickExpr.exec( selector ); + } else { + return jQuery.makeArray( selector, this ); + } + + // Match html or make sure no context is specified for #id + // Note: match[1] may be a string or a TrustedHTML wrapper + if ( match && ( match[ 1 ] || !context ) ) { + + // HANDLE: $(html) -> $(array) + if ( match[ 1 ] ) { + context = context instanceof jQuery ? context[ 0 ] : context; + + // Option to run scripts is true for back-compat + // Intentionally let the error be thrown if parseHTML is not present + jQuery.merge( this, jQuery.parseHTML( + match[ 1 ], + context && context.nodeType ? context.ownerDocument || context : document$1, + true + ) ); + + // HANDLE: $(html, props) + if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) { + for ( match in context ) { + + // Properties of context are called as methods if possible + if ( typeof this[ match ] === "function" ) { + this[ match ]( context[ match ] ); + + // ...and otherwise set as attributes + } else { + this.attr( match, context[ match ] ); + } + } + } + + return this; + + // HANDLE: $(#id) + } else { + elem = document$1.getElementById( match[ 2 ] ); + + if ( elem ) { + + // Inject the element directly into the jQuery object + this[ 0 ] = elem; + this.length = 1; + } + return this; + } + + // HANDLE: $(expr) & $(expr, $(...)) + } else if ( !context || context.jquery ) { + return ( context || rootjQuery ).find( selector ); + + // HANDLE: $(expr, context) + // (which is just equivalent to: $(context).find(expr) + } else { + return this.constructor( context ).find( selector ); + } + } + + }; + +// Give the init function the jQuery prototype for later instantiation +init.prototype = jQuery.fn; + +// Initialize central reference +rootjQuery = jQuery( document$1 ); + +var rparentsprev = /^(?:parents|prev(?:Until|All))/, + + // Methods guaranteed to produce a unique set when starting from a unique set + guaranteedUnique = { + children: true, + contents: true, + next: true, + prev: true + }; + +jQuery.fn.extend( { + has: function( target ) { + var targets = jQuery( target, this ), + l = targets.length; + + return this.filter( function() { + var i = 0; + for ( ; i < l; i++ ) { + if ( jQuery.contains( this, targets[ i ] ) ) { + return true; + } + } + } ); + }, + + closest: function( selectors, context ) { + var cur, + i = 0, + l = this.length, + matched = [], + targets = typeof selectors !== "string" && jQuery( selectors ); + + // Positional selectors never match, since there's no _selection_ context + if ( !rneedsContext.test( selectors ) ) { + for ( ; i < l; i++ ) { + for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) { + + // Always skip document fragments + if ( cur.nodeType < 11 && ( targets ? + targets.index( cur ) > -1 : + + // Don't pass non-elements to jQuery#find + cur.nodeType === 1 && + jQuery.find.matchesSelector( cur, selectors ) ) ) { + + matched.push( cur ); + break; + } + } + } + } + + return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched ); + }, + + // Determine the position of an element within the set + index: function( elem ) { + + // No argument, return index in parent + if ( !elem ) { + return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; + } + + // Index in selector + if ( typeof elem === "string" ) { + return indexOf.call( jQuery( elem ), this[ 0 ] ); + } + + // Locate the position of the desired element + return indexOf.call( this, + + // If it receives a jQuery object, the first element is used + elem.jquery ? elem[ 0 ] : elem + ); + }, + + add: function( selector, context ) { + return this.pushStack( + jQuery.uniqueSort( + jQuery.merge( this.get(), jQuery( selector, context ) ) + ) + ); + }, + + addBack: function( selector ) { + return this.add( selector == null ? + this.prevObject : this.prevObject.filter( selector ) + ); + } +} ); + +function sibling( cur, dir ) { + while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {} + return cur; +} + +jQuery.each( { + parent: function( elem ) { + var parent = elem.parentNode; + return parent && parent.nodeType !== 11 ? parent : null; + }, + parents: function( elem ) { + return dir( elem, "parentNode" ); + }, + parentsUntil: function( elem, _i, until ) { + return dir( elem, "parentNode", until ); + }, + next: function( elem ) { + return sibling( elem, "nextSibling" ); + }, + prev: function( elem ) { + return sibling( elem, "previousSibling" ); + }, + nextAll: function( elem ) { + return dir( elem, "nextSibling" ); + }, + prevAll: function( elem ) { + return dir( elem, "previousSibling" ); + }, + nextUntil: function( elem, _i, until ) { + return dir( elem, "nextSibling", until ); + }, + prevUntil: function( elem, _i, until ) { + return dir( elem, "previousSibling", until ); + }, + siblings: function( elem ) { + return siblings( ( elem.parentNode || {} ).firstChild, elem ); + }, + children: function( elem ) { + return siblings( elem.firstChild ); + }, + contents: function( elem ) { + if ( elem.contentDocument != null && + + // Support: IE 11+ + // elements with no `data` attribute has an object + // `contentDocument` with a `null` prototype. + getProto( elem.contentDocument ) ) { + + return elem.contentDocument; + } + + // Support: IE 9 - 11+ + // Treat the template element as a regular one in browsers that + // don't support it. + if ( nodeName( elem, "template" ) ) { + elem = elem.content || elem; + } + + return jQuery.merge( [], elem.childNodes ); + } +}, function( name, fn ) { + jQuery.fn[ name ] = function( until, selector ) { + var matched = jQuery.map( this, fn, until ); + + if ( name.slice( -5 ) !== "Until" ) { + selector = until; + } + + if ( selector && typeof selector === "string" ) { + matched = jQuery.filter( selector, matched ); + } + + if ( this.length > 1 ) { + + // Remove duplicates + if ( !guaranteedUnique[ name ] ) { + jQuery.uniqueSort( matched ); + } + + // Reverse order for parents* and prev-derivatives + if ( rparentsprev.test( name ) ) { + matched.reverse(); + } + } + + return this.pushStack( matched ); + }; +} ); + +// Convert String-formatted options into Object-formatted ones +function createOptions( options ) { + var object = {}; + jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) { + object[ flag ] = true; + } ); + return object; +} + +/* + * Create a callback list using the following parameters: + * + * options: an optional list of space-separated options that will change how + * the callback list behaves or a more traditional option object + * + * By default a callback list will act like an event callback list and can be + * "fired" multiple times. + * + * Possible options: + * + * once: will ensure the callback list can only be fired once (like a Deferred) + * + * memory: will keep track of previous values and will call any callback added + * after the list has been fired right away with the latest "memorized" + * values (like a Deferred) + * + * unique: will ensure a callback can only be added once (no duplicate in the list) + * + * stopOnFalse: interrupt callings when a callback returns false + * + */ +jQuery.Callbacks = function( options ) { + + // Convert options from String-formatted to Object-formatted if needed + // (we check in cache first) + options = typeof options === "string" ? + createOptions( options ) : + jQuery.extend( {}, options ); + + var // Flag to know if list is currently firing + firing, + + // Last fire value for non-forgettable lists + memory, + + // Flag to know if list was already fired + fired, + + // Flag to prevent firing + locked, + + // Actual callback list + list = [], + + // Queue of execution data for repeatable lists + queue = [], + + // Index of currently firing callback (modified by add/remove as needed) + firingIndex = -1, + + // Fire callbacks + fire = function() { + + // Enforce single-firing + locked = locked || options.once; + + // Execute callbacks for all pending executions, + // respecting firingIndex overrides and runtime changes + fired = firing = true; + for ( ; queue.length; firingIndex = -1 ) { + memory = queue.shift(); + while ( ++firingIndex < list.length ) { + + // Run callback and check for early termination + if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false && + options.stopOnFalse ) { + + // Jump to end and forget the data so .add doesn't re-fire + firingIndex = list.length; + memory = false; + } + } + } + + // Forget the data if we're done with it + if ( !options.memory ) { + memory = false; + } + + firing = false; + + // Clean up if we're done firing for good + if ( locked ) { + + // Keep an empty list if we have data for future add calls + if ( memory ) { + list = []; + + // Otherwise, this object is spent + } else { + list = ""; + } + } + }, + + // Actual Callbacks object + self = { + + // Add a callback or a collection of callbacks to the list + add: function() { + if ( list ) { + + // If we have memory from a past run, we should fire after adding + if ( memory && !firing ) { + firingIndex = list.length - 1; + queue.push( memory ); + } + + ( function add( args ) { + jQuery.each( args, function( _, arg ) { + if ( typeof arg === "function" ) { + if ( !options.unique || !self.has( arg ) ) { + list.push( arg ); + } + } else if ( arg && arg.length && toType( arg ) !== "string" ) { + + // Inspect recursively + add( arg ); + } + } ); + } )( arguments ); + + if ( memory && !firing ) { + fire(); + } + } + return this; + }, + + // Remove a callback from the list + remove: function() { + jQuery.each( arguments, function( _, arg ) { + var index; + while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { + list.splice( index, 1 ); + + // Handle firing indexes + if ( index <= firingIndex ) { + firingIndex--; + } + } + } ); + return this; + }, + + // Check if a given callback is in the list. + // If no argument is given, return whether or not list has callbacks attached. + has: function( fn ) { + return fn ? + jQuery.inArray( fn, list ) > -1 : + list.length > 0; + }, + + // Remove all callbacks from the list + empty: function() { + if ( list ) { + list = []; + } + return this; + }, + + // Disable .fire and .add + // Abort any current/pending executions + // Clear all callbacks and values + disable: function() { + locked = queue = []; + list = memory = ""; + return this; + }, + disabled: function() { + return !list; + }, + + // Disable .fire + // Also disable .add unless we have memory (since it would have no effect) + // Abort any pending executions + lock: function() { + locked = queue = []; + if ( !memory && !firing ) { + list = memory = ""; + } + return this; + }, + locked: function() { + return !!locked; + }, + + // Call all callbacks with the given context and arguments + fireWith: function( context, args ) { + if ( !locked ) { + args = args || []; + args = [ context, args.slice ? args.slice() : args ]; + queue.push( args ); + if ( !firing ) { + fire(); + } + } + return this; + }, + + // Call all the callbacks with the given arguments + fire: function() { + self.fireWith( this, arguments ); + return this; + }, + + // To know if the callbacks have already been called at least once + fired: function() { + return !!fired; + } + }; + + return self; +}; + +function Identity( v ) { + return v; +} +function Thrower( ex ) { + throw ex; +} + +function adoptValue( value, resolve, reject, noValue ) { + var method; + + try { + + // Check for promise aspect first to privilege synchronous behavior + if ( value && typeof( method = value.promise ) === "function" ) { + method.call( value ).done( resolve ).fail( reject ); + + // Other thenables + } else if ( value && typeof( method = value.then ) === "function" ) { + method.call( value, resolve, reject ); + + // Other non-thenables + } else { + + // Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer: + // * false: [ value ].slice( 0 ) => resolve( value ) + // * true: [ value ].slice( 1 ) => resolve() + resolve.apply( undefined, [ value ].slice( noValue ) ); + } + + // For Promises/A+, convert exceptions into rejections + // Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in + // Deferred#then to conditionally suppress rejection. + } catch ( value ) { + reject( value ); + } +} + +jQuery.extend( { + + Deferred: function( func ) { + var tuples = [ + + // action, add listener, callbacks, + // ... .then handlers, argument index, [final state] + [ "notify", "progress", jQuery.Callbacks( "memory" ), + jQuery.Callbacks( "memory" ), 2 ], + [ "resolve", "done", jQuery.Callbacks( "once memory" ), + jQuery.Callbacks( "once memory" ), 0, "resolved" ], + [ "reject", "fail", jQuery.Callbacks( "once memory" ), + jQuery.Callbacks( "once memory" ), 1, "rejected" ] + ], + state = "pending", + promise = { + state: function() { + return state; + }, + always: function() { + deferred.done( arguments ).fail( arguments ); + return this; + }, + catch: function( fn ) { + return promise.then( null, fn ); + }, + + // Keep pipe for back-compat + pipe: function( /* fnDone, fnFail, fnProgress */ ) { + var fns = arguments; + + return jQuery.Deferred( function( newDefer ) { + jQuery.each( tuples, function( _i, tuple ) { + + // Map tuples (progress, done, fail) to arguments (done, fail, progress) + var fn = typeof fns[ tuple[ 4 ] ] === "function" && + fns[ tuple[ 4 ] ]; + + // deferred.progress(function() { bind to newDefer or newDefer.notify }) + // deferred.done(function() { bind to newDefer or newDefer.resolve }) + // deferred.fail(function() { bind to newDefer or newDefer.reject }) + deferred[ tuple[ 1 ] ]( function() { + var returned = fn && fn.apply( this, arguments ); + if ( returned && typeof returned.promise === "function" ) { + returned.promise() + .progress( newDefer.notify ) + .done( newDefer.resolve ) + .fail( newDefer.reject ); + } else { + newDefer[ tuple[ 0 ] + "With" ]( + this, + fn ? [ returned ] : arguments + ); + } + } ); + } ); + fns = null; + } ).promise(); + }, + then: function( onFulfilled, onRejected, onProgress ) { + var maxDepth = 0; + function resolve( depth, deferred, handler, special ) { + return function() { + var that = this, + args = arguments, + mightThrow = function() { + var returned, then; + + // Support: Promises/A+ section 2.3.3.3.3 + // https://promisesaplus.com/#point-59 + // Ignore double-resolution attempts + if ( depth < maxDepth ) { + return; + } + + returned = handler.apply( that, args ); + + // Support: Promises/A+ section 2.3.1 + // https://promisesaplus.com/#point-48 + if ( returned === deferred.promise() ) { + throw new TypeError( "Thenable self-resolution" ); + } + + // Support: Promises/A+ sections 2.3.3.1, 3.5 + // https://promisesaplus.com/#point-54 + // https://promisesaplus.com/#point-75 + // Retrieve `then` only once + then = returned && + + // Support: Promises/A+ section 2.3.4 + // https://promisesaplus.com/#point-64 + // Only check objects and functions for thenability + ( typeof returned === "object" || + typeof returned === "function" ) && + returned.then; + + // Handle a returned thenable + if ( typeof then === "function" ) { + + // Special processors (notify) just wait for resolution + if ( special ) { + then.call( + returned, + resolve( maxDepth, deferred, Identity, special ), + resolve( maxDepth, deferred, Thrower, special ) + ); + + // Normal processors (resolve) also hook into progress + } else { + + // ...and disregard older resolution values + maxDepth++; + + then.call( + returned, + resolve( maxDepth, deferred, Identity, special ), + resolve( maxDepth, deferred, Thrower, special ), + resolve( maxDepth, deferred, Identity, + deferred.notifyWith ) + ); + } + + // Handle all other returned values + } else { + + // Only substitute handlers pass on context + // and multiple values (non-spec behavior) + if ( handler !== Identity ) { + that = undefined; + args = [ returned ]; + } + + // Process the value(s) + // Default process is resolve + ( special || deferred.resolveWith )( that, args ); + } + }, + + // Only normal processors (resolve) catch and reject exceptions + process = special ? + mightThrow : + function() { + try { + mightThrow(); + } catch ( e ) { + + if ( jQuery.Deferred.exceptionHook ) { + jQuery.Deferred.exceptionHook( e, + process.error ); + } + + // Support: Promises/A+ section 2.3.3.3.4.1 + // https://promisesaplus.com/#point-61 + // Ignore post-resolution exceptions + if ( depth + 1 >= maxDepth ) { + + // Only substitute handlers pass on context + // and multiple values (non-spec behavior) + if ( handler !== Thrower ) { + that = undefined; + args = [ e ]; + } + + deferred.rejectWith( that, args ); + } + } + }; + + // Support: Promises/A+ section 2.3.3.3.1 + // https://promisesaplus.com/#point-57 + // Re-resolve promises immediately to dodge false rejection from + // subsequent errors + if ( depth ) { + process(); + } else { + + // Call an optional hook to record the error, in case of exception + // since it's otherwise lost when execution goes async + if ( jQuery.Deferred.getErrorHook ) { + process.error = jQuery.Deferred.getErrorHook(); + } + window.setTimeout( process ); + } + }; + } + + return jQuery.Deferred( function( newDefer ) { + + // progress_handlers.add( ... ) + tuples[ 0 ][ 3 ].add( + resolve( + 0, + newDefer, + typeof onProgress === "function" ? + onProgress : + Identity, + newDefer.notifyWith + ) + ); + + // fulfilled_handlers.add( ... ) + tuples[ 1 ][ 3 ].add( + resolve( + 0, + newDefer, + typeof onFulfilled === "function" ? + onFulfilled : + Identity + ) + ); + + // rejected_handlers.add( ... ) + tuples[ 2 ][ 3 ].add( + resolve( + 0, + newDefer, + typeof onRejected === "function" ? + onRejected : + Thrower + ) + ); + } ).promise(); + }, + + // Get a promise for this deferred + // If obj is provided, the promise aspect is added to the object + promise: function( obj ) { + return obj != null ? jQuery.extend( obj, promise ) : promise; + } + }, + deferred = {}; + + // Add list-specific methods + jQuery.each( tuples, function( i, tuple ) { + var list = tuple[ 2 ], + stateString = tuple[ 5 ]; + + // promise.progress = list.add + // promise.done = list.add + // promise.fail = list.add + promise[ tuple[ 1 ] ] = list.add; + + // Handle state + if ( stateString ) { + list.add( + function() { + + // state = "resolved" (i.e., fulfilled) + // state = "rejected" + state = stateString; + }, + + // rejected_callbacks.disable + // fulfilled_callbacks.disable + tuples[ 3 - i ][ 2 ].disable, + + // rejected_handlers.disable + // fulfilled_handlers.disable + tuples[ 3 - i ][ 3 ].disable, + + // progress_callbacks.lock + tuples[ 0 ][ 2 ].lock, + + // progress_handlers.lock + tuples[ 0 ][ 3 ].lock + ); + } + + // progress_handlers.fire + // fulfilled_handlers.fire + // rejected_handlers.fire + list.add( tuple[ 3 ].fire ); + + // deferred.notify = function() { deferred.notifyWith(...) } + // deferred.resolve = function() { deferred.resolveWith(...) } + // deferred.reject = function() { deferred.rejectWith(...) } + deferred[ tuple[ 0 ] ] = function() { + deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments ); + return this; + }; + + // deferred.notifyWith = list.fireWith + // deferred.resolveWith = list.fireWith + // deferred.rejectWith = list.fireWith + deferred[ tuple[ 0 ] + "With" ] = list.fireWith; + } ); + + // Make the deferred a promise + promise.promise( deferred ); + + // Call given func if any + if ( func ) { + func.call( deferred, deferred ); + } + + // All done! + return deferred; + }, + + // Deferred helper + when: function( singleValue ) { + var + + // count of uncompleted subordinates + remaining = arguments.length, + + // count of unprocessed arguments + i = remaining, + + // subordinate fulfillment data + resolveContexts = Array( i ), + resolveValues = slice.call( arguments ), + + // the primary Deferred + primary = jQuery.Deferred(), + + // subordinate callback factory + updateFunc = function( i ) { + return function( value ) { + resolveContexts[ i ] = this; + resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; + if ( !( --remaining ) ) { + primary.resolveWith( resolveContexts, resolveValues ); + } + }; + }; + + // Single- and empty arguments are adopted like Promise.resolve + if ( remaining <= 1 ) { + adoptValue( singleValue, primary.done( updateFunc( i ) ).resolve, primary.reject, + !remaining ); + + // Use .then() to unwrap secondary thenables (cf. gh-3000) + if ( primary.state() === "pending" || + typeof( resolveValues[ i ] && resolveValues[ i ].then ) === "function" ) { + + return primary.then(); + } + } + + // Multiple arguments are aggregated like Promise.all array elements + while ( i-- ) { + adoptValue( resolveValues[ i ], updateFunc( i ), primary.reject ); + } + + return primary.promise(); + } +} ); + +// These usually indicate a programmer mistake during development, +// warn about them ASAP rather than swallowing them by default. +var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/; + +// If `jQuery.Deferred.getErrorHook` is defined, `asyncError` is an error +// captured before the async barrier to get the original error cause +// which may otherwise be hidden. +jQuery.Deferred.exceptionHook = function( error, asyncError ) { + + if ( error && rerrorNames.test( error.name ) ) { + window.console.warn( + "jQuery.Deferred exception", + error, + asyncError + ); + } +}; + +jQuery.readyException = function( error ) { + window.setTimeout( function() { + throw error; + } ); +}; + +// The deferred used on DOM ready +var readyList = jQuery.Deferred(); + +jQuery.fn.ready = function( fn ) { + + readyList + .then( fn ) + + // Wrap jQuery.readyException in a function so that the lookup + // happens at the time of error handling instead of callback + // registration. + .catch( function( error ) { + jQuery.readyException( error ); + } ); + + return this; +}; + +jQuery.extend( { + + // Is the DOM ready to be used? Set to true once it occurs. + isReady: false, + + // A counter to track how many items to wait for before + // the ready event fires. See trac-6781 + readyWait: 1, + + // Handle when the DOM is ready + ready: function( wait ) { + + // Abort if there are pending holds or we're already ready + if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { + return; + } + + // Remember that the DOM is ready + jQuery.isReady = true; + + // If a normal DOM Ready event fired, decrement, and wait if need be + if ( wait !== true && --jQuery.readyWait > 0 ) { + return; + } + + // If there are functions bound, to execute + readyList.resolveWith( document$1, [ jQuery ] ); + } +} ); + +jQuery.ready.then = readyList.then; + +// The ready event handler and self cleanup method +function completed() { + document$1.removeEventListener( "DOMContentLoaded", completed ); + window.removeEventListener( "load", completed ); + jQuery.ready(); +} + +// Catch cases where $(document).ready() is called +// after the browser event has already occurred. +if ( document$1.readyState !== "loading" ) { + + // Handle it asynchronously to allow scripts the opportunity to delay ready + window.setTimeout( jQuery.ready ); + +} else { + + // Use the handy event callback + document$1.addEventListener( "DOMContentLoaded", completed ); + + // A fallback to window.onload, that will always work + window.addEventListener( "load", completed ); +} + +// Matches dashed string for camelizing +var rdashAlpha = /-([a-z])/g; + +// Used by camelCase as callback to replace() +function fcamelCase( _all, letter ) { + return letter.toUpperCase(); +} + +// Convert dashed to camelCase +function camelCase( string ) { + return string.replace( rdashAlpha, fcamelCase ); +} + +/** + * Determines whether an object can have data + */ +function acceptData( owner ) { + + // Accepts only: + // - Node + // - Node.ELEMENT_NODE + // - Node.DOCUMENT_NODE + // - Object + // - Any + return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType ); +} + +function Data() { + this.expando = jQuery.expando + Data.uid++; +} + +Data.uid = 1; + +Data.prototype = { + + cache: function( owner ) { + + // Check if the owner object already has a cache + var value = owner[ this.expando ]; + + // If not, create one + if ( !value ) { + value = Object.create( null ); + + // We can accept data for non-element nodes in modern browsers, + // but we should not, see trac-8335. + // Always return an empty object. + if ( acceptData( owner ) ) { + + // If it is a node unlikely to be stringify-ed or looped over + // use plain assignment + if ( owner.nodeType ) { + owner[ this.expando ] = value; + + // Otherwise secure it in a non-enumerable property + // configurable must be true to allow the property to be + // deleted when data is removed + } else { + Object.defineProperty( owner, this.expando, { + value: value, + configurable: true + } ); + } + } + } + + return value; + }, + set: function( owner, data, value ) { + var prop, + cache = this.cache( owner ); + + // Handle: [ owner, key, value ] args + // Always use camelCase key (gh-2257) + if ( typeof data === "string" ) { + cache[ camelCase( data ) ] = value; + + // Handle: [ owner, { properties } ] args + } else { + + // Copy the properties one-by-one to the cache object + for ( prop in data ) { + cache[ camelCase( prop ) ] = data[ prop ]; + } + } + return value; + }, + get: function( owner, key ) { + return key === undefined ? + this.cache( owner ) : + + // Always use camelCase key (gh-2257) + owner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ]; + }, + access: function( owner, key, value ) { + + // In cases where either: + // + // 1. No key was specified + // 2. A string key was specified, but no value provided + // + // Take the "read" path and allow the get method to determine + // which value to return, respectively either: + // + // 1. The entire cache object + // 2. The data stored at the key + // + if ( key === undefined || + ( ( key && typeof key === "string" ) && value === undefined ) ) { + + return this.get( owner, key ); + } + + // When the key is not a string, or both a key and value + // are specified, set or extend (existing objects) with either: + // + // 1. An object of properties + // 2. A key and value + // + this.set( owner, key, value ); + + // Since the "set" path can have two possible entry points + // return the expected data based on which path was taken[*] + return value !== undefined ? value : key; + }, + remove: function( owner, key ) { + var i, + cache = owner[ this.expando ]; + + if ( cache === undefined ) { + return; + } + + if ( key !== undefined ) { + + // Support array or space separated string of keys + if ( Array.isArray( key ) ) { + + // If key is an array of keys... + // We always set camelCase keys, so remove that. + key = key.map( camelCase ); + } else { + key = camelCase( key ); + + // If a key with the spaces exists, use it. + // Otherwise, create an array by matching non-whitespace + key = key in cache ? + [ key ] : + ( key.match( rnothtmlwhite ) || [] ); + } + + i = key.length; + + while ( i-- ) { + delete cache[ key[ i ] ]; + } + } + + // Remove the expando if there's no more data + if ( key === undefined || jQuery.isEmptyObject( cache ) ) { + + // Support: Chrome <=35 - 45+ + // Webkit & Blink performance suffers when deleting properties + // from DOM nodes, so set to undefined instead + // https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted) + if ( owner.nodeType ) { + owner[ this.expando ] = undefined; + } else { + delete owner[ this.expando ]; + } + } + }, + hasData: function( owner ) { + var cache = owner[ this.expando ]; + return cache !== undefined && !jQuery.isEmptyObject( cache ); + } +}; + +var dataPriv = new Data(); + +var dataUser = new Data(); + +// Implementation Summary +// +// 1. Enforce API surface and semantic compatibility with 1.9.x branch +// 2. Improve the module's maintainability by reducing the storage +// paths to a single mechanism. +// 3. Use the same single mechanism to support "private" and "user" data. +// 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData) +// 5. Avoid exposing implementation details on user objects (eg. expando properties) +// 6. Provide a clear path for implementation upgrade to WeakMap in 2014 + +var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, + rmultiDash = /[A-Z]/g; + +function getData( data ) { + if ( data === "true" ) { + return true; + } + + if ( data === "false" ) { + return false; + } + + if ( data === "null" ) { + return null; + } + + // Only convert to a number if it doesn't change the string + if ( data === +data + "" ) { + return +data; + } + + if ( rbrace.test( data ) ) { + return JSON.parse( data ); + } + + return data; +} + +function dataAttr( elem, key, data ) { + var name; + + // If nothing was found internally, try to fetch any + // data from the HTML5 data-* attribute + if ( data === undefined && elem.nodeType === 1 ) { + name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase(); + data = elem.getAttribute( name ); + + if ( typeof data === "string" ) { + try { + data = getData( data ); + } catch ( e ) {} + + // Make sure we set the data so it isn't changed later + dataUser.set( elem, key, data ); + } else { + data = undefined; + } + } + return data; +} + +jQuery.extend( { + hasData: function( elem ) { + return dataUser.hasData( elem ) || dataPriv.hasData( elem ); + }, + + data: function( elem, name, data ) { + return dataUser.access( elem, name, data ); + }, + + removeData: function( elem, name ) { + dataUser.remove( elem, name ); + }, + + // TODO: Now that all calls to _data and _removeData have been replaced + // with direct calls to dataPriv methods, these can be deprecated. + _data: function( elem, name, data ) { + return dataPriv.access( elem, name, data ); + }, + + _removeData: function( elem, name ) { + dataPriv.remove( elem, name ); + } +} ); + +jQuery.fn.extend( { + data: function( key, value ) { + var i, name, data, + elem = this[ 0 ], + attrs = elem && elem.attributes; + + // Gets all values + if ( key === undefined ) { + if ( this.length ) { + data = dataUser.get( elem ); + + if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) { + i = attrs.length; + while ( i-- ) { + + // Support: IE 11+ + // The attrs elements can be null (trac-14894) + if ( attrs[ i ] ) { + name = attrs[ i ].name; + if ( name.indexOf( "data-" ) === 0 ) { + name = camelCase( name.slice( 5 ) ); + dataAttr( elem, name, data[ name ] ); + } + } + } + dataPriv.set( elem, "hasDataAttrs", true ); + } + } + + return data; + } + + // Sets multiple values + if ( typeof key === "object" ) { + return this.each( function() { + dataUser.set( this, key ); + } ); + } + + return access( this, function( value ) { + var data; + + // The calling jQuery object (element matches) is not empty + // (and therefore has an element appears at this[ 0 ]) and the + // `value` parameter was not undefined. An empty jQuery object + // will result in `undefined` for elem = this[ 0 ] which will + // throw an exception if an attempt to read a data cache is made. + if ( elem && value === undefined ) { + + // Attempt to get data from the cache + // The key will always be camelCased in Data + data = dataUser.get( elem, key ); + if ( data !== undefined ) { + return data; + } + + // Attempt to "discover" the data in + // HTML5 custom data-* attrs + data = dataAttr( elem, key ); + if ( data !== undefined ) { + return data; + } + + // We tried really hard, but the data doesn't exist. + return; + } + + // Set the data... + this.each( function() { + + // We always store the camelCased key + dataUser.set( this, key, value ); + } ); + }, null, value, arguments.length > 1, null, true ); + }, + + removeData: function( key ) { + return this.each( function() { + dataUser.remove( this, key ); + } ); + } +} ); + +jQuery.extend( { + queue: function( elem, type, data ) { + var queue; + + if ( elem ) { + type = ( type || "fx" ) + "queue"; + queue = dataPriv.get( elem, type ); + + // Speed up dequeue by getting out quickly if this is just a lookup + if ( data ) { + if ( !queue || Array.isArray( data ) ) { + queue = dataPriv.set( elem, type, jQuery.makeArray( data ) ); + } else { + queue.push( data ); + } + } + return queue || []; + } + }, + + dequeue: function( elem, type ) { + type = type || "fx"; + + var queue = jQuery.queue( elem, type ), + startLength = queue.length, + fn = queue.shift(), + hooks = jQuery._queueHooks( elem, type ), + next = function() { + jQuery.dequeue( elem, type ); + }; + + // If the fx queue is dequeued, always remove the progress sentinel + if ( fn === "inprogress" ) { + fn = queue.shift(); + startLength--; + } + + if ( fn ) { + + // Add a progress sentinel to prevent the fx queue from being + // automatically dequeued + if ( type === "fx" ) { + queue.unshift( "inprogress" ); + } + + // Clear up the last queue stop function + delete hooks.stop; + fn.call( elem, next, hooks ); + } + + if ( !startLength && hooks ) { + hooks.empty.fire(); + } + }, + + // Not public - generate a queueHooks object, or return the current one + _queueHooks: function( elem, type ) { + var key = type + "queueHooks"; + return dataPriv.get( elem, key ) || dataPriv.set( elem, key, { + empty: jQuery.Callbacks( "once memory" ).add( function() { + dataPriv.remove( elem, [ type + "queue", key ] ); + } ) + } ); + } +} ); + +jQuery.fn.extend( { + queue: function( type, data ) { + var setter = 2; + + if ( typeof type !== "string" ) { + data = type; + type = "fx"; + setter--; + } + + if ( arguments.length < setter ) { + return jQuery.queue( this[ 0 ], type ); + } + + return data === undefined ? + this : + this.each( function() { + var queue = jQuery.queue( this, type, data ); + + // Ensure a hooks for this queue + jQuery._queueHooks( this, type ); + + if ( type === "fx" && queue[ 0 ] !== "inprogress" ) { + jQuery.dequeue( this, type ); + } + } ); + }, + dequeue: function( type ) { + return this.each( function() { + jQuery.dequeue( this, type ); + } ); + }, + clearQueue: function( type ) { + return this.queue( type || "fx", [] ); + }, + + // Get a promise resolved when queues of a certain type + // are emptied (fx is the type by default) + promise: function( type, obj ) { + var tmp, + count = 1, + defer = jQuery.Deferred(), + elements = this, + i = this.length, + resolve = function() { + if ( !( --count ) ) { + defer.resolveWith( elements, [ elements ] ); + } + }; + + if ( typeof type !== "string" ) { + obj = type; + type = undefined; + } + type = type || "fx"; + + while ( i-- ) { + tmp = dataPriv.get( elements[ i ], type + "queueHooks" ); + if ( tmp && tmp.empty ) { + count++; + tmp.empty.add( resolve ); + } + } + resolve(); + return defer.promise( obj ); + } +} ); + +var pnum = /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source; + +var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ); + +var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; + +// isHiddenWithinTree reports if an element has a non-"none" display style (inline and/or +// through the CSS cascade), which is useful in deciding whether or not to make it visible. +// It differs from the :hidden selector (jQuery.expr.pseudos.hidden) in two important ways: +// * A hidden ancestor does not force an element to be classified as hidden. +// * Being disconnected from the document does not force an element to be classified as hidden. +// These differences improve the behavior of .toggle() et al. when applied to elements that are +// detached or contained within hidden ancestors (gh-2404, gh-2863). +function isHiddenWithinTree( elem, el ) { + + // isHiddenWithinTree might be called from jQuery#filter function; + // in that case, element will be second argument + elem = el || elem; + + // Inline style trumps all + return elem.style.display === "none" || + elem.style.display === "" && + jQuery.css( elem, "display" ) === "none"; +} + +var ralphaStart = /^[a-z]/, + + // The regex visualized: + // + // /----------\ + // | | /-------\ + // | / Top \ | | | + // /--- Border ---+-| Right |-+---+- Width -+---\ + // | | Bottom | | + // | \ Left / | + // | | + // | /----------\ | + // | /-------------\ | | |- END + // | | | | / Top \ | | + // | | / Margin \ | | | Right | | | + // |---------+-| |-+---+-| Bottom |-+----| + // | \ Padding / \ Left / | + // BEGIN -| | + // | /---------\ | + // | | | | + // | | / Min \ | / Width \ | + // \--------------+-| |-+---| |---/ + // \ Max / \ Height / + rautoPx = /^(?:Border(?:Top|Right|Bottom|Left)?(?:Width|)|(?:Margin|Padding)?(?:Top|Right|Bottom|Left)?|(?:Min|Max)?(?:Width|Height))$/; + +function isAutoPx( prop ) { + + // The first test is used to ensure that: + // 1. The prop starts with a lowercase letter (as we uppercase it for the second regex). + // 2. The prop is not empty. + return ralphaStart.test( prop ) && + rautoPx.test( prop[ 0 ].toUpperCase() + prop.slice( 1 ) ); +} + +function adjustCSS( elem, prop, valueParts, tween ) { + var adjusted, scale, + maxIterations = 20, + currentValue = tween ? + function() { + return tween.cur(); + } : + function() { + return jQuery.css( elem, prop, "" ); + }, + initial = currentValue(), + unit = valueParts && valueParts[ 3 ] || ( isAutoPx( prop ) ? "px" : "" ), + + // Starting value computation is required for potential unit mismatches + initialInUnit = elem.nodeType && + ( !isAutoPx( prop ) || unit !== "px" && +initial ) && + rcssNum.exec( jQuery.css( elem, prop ) ); + + if ( initialInUnit && initialInUnit[ 3 ] !== unit ) { + + // Support: Firefox <=54 - 66+ + // Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144) + initial = initial / 2; + + // Trust units reported by jQuery.css + unit = unit || initialInUnit[ 3 ]; + + // Iteratively approximate from a nonzero starting point + initialInUnit = +initial || 1; + + while ( maxIterations-- ) { + + // Evaluate and update our best guess (doubling guesses that zero out). + // Finish if the scale equals or crosses 1 (making the old*new product non-positive). + jQuery.style( elem, prop, initialInUnit + unit ); + if ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) { + maxIterations = 0; + } + initialInUnit = initialInUnit / scale; + + } + + initialInUnit = initialInUnit * 2; + jQuery.style( elem, prop, initialInUnit + unit ); + + // Make sure we update the tween properties later on + valueParts = valueParts || []; + } + + if ( valueParts ) { + initialInUnit = +initialInUnit || +initial || 0; + + // Apply relative offset (+=/-=) if specified + adjusted = valueParts[ 1 ] ? + initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] : + +valueParts[ 2 ]; + if ( tween ) { + tween.unit = unit; + tween.start = initialInUnit; + tween.end = adjusted; + } + } + return adjusted; +} + +// Matches dashed string for camelizing +var rmsPrefix = /^-ms-/; + +// Convert dashed to camelCase, handle vendor prefixes. +// Used by the css & effects modules. +// Support: IE <=9 - 11+ +// Microsoft forgot to hump their vendor prefix (trac-9572) +function cssCamelCase( string ) { + return camelCase( string.replace( rmsPrefix, "ms-" ) ); +} + +var defaultDisplayMap = {}; + +function getDefaultDisplay( elem ) { + var temp, + doc = elem.ownerDocument, + nodeName = elem.nodeName, + display = defaultDisplayMap[ nodeName ]; + + if ( display ) { + return display; + } + + temp = doc.body.appendChild( doc.createElement( nodeName ) ); + display = jQuery.css( temp, "display" ); + + temp.parentNode.removeChild( temp ); + + if ( display === "none" ) { + display = "block"; + } + defaultDisplayMap[ nodeName ] = display; + + return display; +} + +function showHide( elements, show ) { + var display, elem, + values = [], + index = 0, + length = elements.length; + + // Determine new display value for elements that need to change + for ( ; index < length; index++ ) { + elem = elements[ index ]; + if ( !elem.style ) { + continue; + } + + display = elem.style.display; + if ( show ) { + + // Since we force visibility upon cascade-hidden elements, an immediate (and slow) + // check is required in this first loop unless we have a nonempty display value (either + // inline or about-to-be-restored) + if ( display === "none" ) { + values[ index ] = dataPriv.get( elem, "display" ) || null; + if ( !values[ index ] ) { + elem.style.display = ""; + } + } + if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) { + values[ index ] = getDefaultDisplay( elem ); + } + } else { + if ( display !== "none" ) { + values[ index ] = "none"; + + // Remember what we're overwriting + dataPriv.set( elem, "display", display ); + } + } + } + + // Set the display of the elements in a second loop to avoid constant reflow + for ( index = 0; index < length; index++ ) { + if ( values[ index ] != null ) { + elements[ index ].style.display = values[ index ]; + } + } + + return elements; +} + +jQuery.fn.extend( { + show: function() { + return showHide( this, true ); + }, + hide: function() { + return showHide( this ); + }, + toggle: function( state ) { + if ( typeof state === "boolean" ) { + return state ? this.show() : this.hide(); + } + + return this.each( function() { + if ( isHiddenWithinTree( this ) ) { + jQuery( this ).show(); + } else { + jQuery( this ).hide(); + } + } ); + } +} ); + +var isAttached = function( elem ) { + return jQuery.contains( elem.ownerDocument, elem ) || + elem.getRootNode( composed ) === elem.ownerDocument; + }, + composed = { composed: true }; + +// Support: IE 9 - 11+ +// Check attachment across shadow DOM boundaries when possible (gh-3504). +// Provide a fallback for browsers without Shadow DOM v1 support. +if ( !documentElement$1.getRootNode ) { + isAttached = function( elem ) { + return jQuery.contains( elem.ownerDocument, elem ); + }; +} + +// rtagName captures the name from the first start tag in a string of HTML +// https://html.spec.whatwg.org/multipage/syntax.html#tag-open-state +// https://html.spec.whatwg.org/multipage/syntax.html#tag-name-state +var rtagName = /<([a-z][^\/\0>\x20\t\r\n\f]*)/i; + +var wrapMap = { + + // Table parts need to be wrapped with `` or they're + // stripped to their contents when put in a div. + // XHTML parsers do not magically insert elements in the + // same way that tag soup parsers do, so we cannot shorten + // this by omitting or other required elements. + thead: [ "table" ], + col: [ "colgroup", "table" ], + tr: [ "tbody", "table" ], + td: [ "tr", "tbody", "table" ] +}; + +wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; +wrapMap.th = wrapMap.td; + +function getAll( context, tag ) { + + // Support: IE <=9 - 11+ + // Use typeof to avoid zero-argument method invocation on host objects (trac-15151) + var ret; + + if ( typeof context.getElementsByTagName !== "undefined" ) { + + // Use slice to snapshot the live collection from gEBTN + ret = arr.slice.call( context.getElementsByTagName( tag || "*" ) ); + + } else if ( typeof context.querySelectorAll !== "undefined" ) { + ret = context.querySelectorAll( tag || "*" ); + + } else { + ret = []; + } + + if ( tag === undefined || tag && nodeName( context, tag ) ) { + return jQuery.merge( [ context ], ret ); + } + + return ret; +} + +var rscriptType = /^$|^module$|\/(?:java|ecma)script/i; + +// Mark scripts as having already been evaluated +function setGlobalEval( elems, refElements ) { + var i = 0, + l = elems.length; + + for ( ; i < l; i++ ) { + dataPriv.set( + elems[ i ], + "globalEval", + !refElements || dataPriv.get( refElements[ i ], "globalEval" ) + ); + } +} + +var rhtml = /<|&#?\w+;/; + +function buildFragment( elems, context, scripts, selection, ignored ) { + var elem, tmp, tag, wrap, attached, j, + fragment = context.createDocumentFragment(), + nodes = [], + i = 0, + l = elems.length; + + for ( ; i < l; i++ ) { + elem = elems[ i ]; + + if ( elem || elem === 0 ) { + + // Add nodes directly + if ( toType( elem ) === "object" && ( elem.nodeType || isArrayLike( elem ) ) ) { + jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); + + // Convert non-html into a text node + } else if ( !rhtml.test( elem ) ) { + nodes.push( context.createTextNode( elem ) ); + + // Convert html into DOM nodes + } else { + tmp = tmp || fragment.appendChild( context.createElement( "div" ) ); + + // Deserialize a standard representation + tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase(); + wrap = wrapMap[ tag ] || arr; + + // Create wrappers & descend into them. + j = wrap.length; + while ( --j > -1 ) { + tmp = tmp.appendChild( context.createElement( wrap[ j ] ) ); + } + + tmp.innerHTML = jQuery.htmlPrefilter( elem ); + + jQuery.merge( nodes, tmp.childNodes ); + + // Remember the top-level container + tmp = fragment.firstChild; + + // Ensure the created nodes are orphaned (trac-12392) + tmp.textContent = ""; + } + } + } + + // Remove wrapper from fragment + fragment.textContent = ""; + + i = 0; + while ( ( elem = nodes[ i++ ] ) ) { + + // Skip elements already in the context collection (trac-4087) + if ( selection && jQuery.inArray( elem, selection ) > -1 ) { + if ( ignored ) { + ignored.push( elem ); + } + continue; + } + + attached = isAttached( elem ); + + // Append to fragment + tmp = getAll( fragment.appendChild( elem ), "script" ); + + // Preserve script evaluation history + if ( attached ) { + setGlobalEval( tmp ); + } + + // Capture executables + if ( scripts ) { + j = 0; + while ( ( elem = tmp[ j++ ] ) ) { + if ( rscriptType.test( elem.type || "" ) ) { + scripts.push( elem ); + } + } + } + } + + return fragment; +} + +// Replace/restore the type attribute of script elements for safe DOM manipulation +function disableScript( elem ) { + elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type; + return elem; +} +function restoreScript( elem ) { + if ( ( elem.type || "" ).slice( 0, 5 ) === "true/" ) { + elem.type = elem.type.slice( 5 ); + } else { + elem.removeAttribute( "type" ); + } + + return elem; +} + +function domManip( collection, args, callback, ignored ) { + + // Flatten any nested arrays + args = flat( args ); + + var fragment, first, scripts, hasScripts, node, doc, + i = 0, + l = collection.length, + iNoClone = l - 1, + value = args[ 0 ], + valueIsFunction = typeof value === "function"; + + if ( valueIsFunction ) { + return collection.each( function( index ) { + var self = collection.eq( index ); + args[ 0 ] = value.call( this, index, self.html() ); + domManip( self, args, callback, ignored ); + } ); + } + + if ( l ) { + fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored ); + first = fragment.firstChild; + + if ( fragment.childNodes.length === 1 ) { + fragment = first; + } + + // Require either new content or an interest in ignored elements to invoke the callback + if ( first || ignored ) { + scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); + hasScripts = scripts.length; + + // Use the original fragment for the last item + // instead of the first because it can end up + // being emptied incorrectly in certain situations (trac-8070). + for ( ; i < l; i++ ) { + node = fragment; + + if ( i !== iNoClone ) { + node = jQuery.clone( node, true, true ); + + // Keep references to cloned scripts for later restoration + if ( hasScripts ) { + jQuery.merge( scripts, getAll( node, "script" ) ); + } + } + + callback.call( collection[ i ], node, i ); + } + + if ( hasScripts ) { + doc = scripts[ scripts.length - 1 ].ownerDocument; + + // Re-enable scripts + jQuery.map( scripts, restoreScript ); + + // Evaluate executable scripts on first document insertion + for ( i = 0; i < hasScripts; i++ ) { + node = scripts[ i ]; + if ( rscriptType.test( node.type || "" ) && + !dataPriv.get( node, "globalEval" ) && + jQuery.contains( doc, node ) ) { + + if ( node.src && ( node.type || "" ).toLowerCase() !== "module" ) { + + // Optional AJAX dependency, but won't run scripts if not present + if ( jQuery._evalUrl && !node.noModule ) { + jQuery._evalUrl( node.src, { + nonce: node.nonce, + crossOrigin: node.crossOrigin + }, doc ); + } + } else { + DOMEval( node.textContent, node, doc ); + } + } + } + } + } + } + + return collection; +} + +var rcheckableType = /^(?:checkbox|radio)$/i; + +var rtypenamespace = /^([^.]*)(?:\.(.+)|)/; + +function returnTrue() { + return true; +} + +function returnFalse() { + return false; +} + +function on( elem, types, selector, data, fn, one ) { + var origFn, type; + + // Types can be a map of types/handlers + if ( typeof types === "object" ) { + + // ( types-Object, selector, data ) + if ( typeof selector !== "string" ) { + + // ( types-Object, data ) + data = data || selector; + selector = undefined; + } + for ( type in types ) { + on( elem, type, selector, data, types[ type ], one ); + } + return elem; + } + + if ( data == null && fn == null ) { + + // ( types, fn ) + fn = selector; + data = selector = undefined; + } else if ( fn == null ) { + if ( typeof selector === "string" ) { + + // ( types, selector, fn ) + fn = data; + data = undefined; + } else { + + // ( types, data, fn ) + fn = data; + data = selector; + selector = undefined; + } + } + if ( fn === false ) { + fn = returnFalse; + } else if ( !fn ) { + return elem; + } + + if ( one === 1 ) { + origFn = fn; + fn = function( event ) { + + // Can use an empty set, since event contains the info + jQuery().off( event ); + return origFn.apply( this, arguments ); + }; + + // Use same guid so caller can remove using origFn + fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); + } + return elem.each( function() { + jQuery.event.add( this, types, fn, data, selector ); + } ); +} + +/* + * Helper functions for managing events -- not part of the public interface. + * Props to Dean Edwards' addEvent library for many of the ideas. + */ +jQuery.event = { + + add: function( elem, types, handler, data, selector ) { + + var handleObjIn, eventHandle, tmp, + events, t, handleObj, + special, handlers, type, namespaces, origType, + elemData = dataPriv.get( elem ); + + // Only attach events to objects that accept data + if ( !acceptData( elem ) ) { + return; + } + + // Caller can pass in an object of custom data in lieu of the handler + if ( handler.handler ) { + handleObjIn = handler; + handler = handleObjIn.handler; + selector = handleObjIn.selector; + } + + // Ensure that invalid selectors throw exceptions at attach time + // Evaluate against documentElement in case elem is a non-element node (e.g., document) + if ( selector ) { + jQuery.find.matchesSelector( documentElement$1, selector ); + } + + // Make sure that the handler has a unique ID, used to find/remove it later + if ( !handler.guid ) { + handler.guid = jQuery.guid++; + } + + // Init the element's event structure and main handler, if this is the first + if ( !( events = elemData.events ) ) { + events = elemData.events = Object.create( null ); + } + if ( !( eventHandle = elemData.handle ) ) { + eventHandle = elemData.handle = function( e ) { + + // Discard the second event of a jQuery.event.trigger() and + // when an event is called after a page has unloaded + return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ? + jQuery.event.dispatch.apply( elem, arguments ) : undefined; + }; + } + + // Handle multiple events separated by a space + types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[ t ] ) || []; + type = origType = tmp[ 1 ]; + namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); + + // There *must* be a type, no attaching namespace-only handlers + if ( !type ) { + continue; + } + + // If event changes its type, use the special event handlers for the changed type + special = jQuery.event.special[ type ] || {}; + + // If selector defined, determine special event api type, otherwise given type + type = ( selector ? special.delegateType : special.bindType ) || type; + + // Update special based on newly reset type + special = jQuery.event.special[ type ] || {}; + + // handleObj is passed to all event handlers + handleObj = jQuery.extend( { + type: type, + origType: origType, + data: data, + handler: handler, + guid: handler.guid, + selector: selector, + needsContext: selector && jQuery.expr.match.needsContext.test( selector ), + namespace: namespaces.join( "." ) + }, handleObjIn ); + + // Init the event handler queue if we're the first + if ( !( handlers = events[ type ] ) ) { + handlers = events[ type ] = []; + handlers.delegateCount = 0; + + // Only use addEventListener if the special events handler returns false + if ( !special.setup || + special.setup.call( elem, data, namespaces, eventHandle ) === false ) { + + if ( elem.addEventListener ) { + elem.addEventListener( type, eventHandle ); + } + } + } + + if ( special.add ) { + special.add.call( elem, handleObj ); + + if ( !handleObj.handler.guid ) { + handleObj.handler.guid = handler.guid; + } + } + + // Add to the element's handler list, delegates in front + if ( selector ) { + handlers.splice( handlers.delegateCount++, 0, handleObj ); + } else { + handlers.push( handleObj ); + } + } + + }, + + // Detach an event or set of events from an element + remove: function( elem, types, handler, selector, mappedTypes ) { + + var j, origCount, tmp, + events, t, handleObj, + special, handlers, type, namespaces, origType, + elemData = dataPriv.hasData( elem ) && dataPriv.get( elem ); + + if ( !elemData || !( events = elemData.events ) ) { + return; + } + + // Once for each type.namespace in types; type may be omitted + types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[ t ] ) || []; + type = origType = tmp[ 1 ]; + namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); + + // Unbind all events (on this namespace, if provided) for the element + if ( !type ) { + for ( type in events ) { + jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); + } + continue; + } + + special = jQuery.event.special[ type ] || {}; + type = ( selector ? special.delegateType : special.bindType ) || type; + handlers = events[ type ] || []; + tmp = tmp[ 2 ] && + new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ); + + // Remove matching events + origCount = j = handlers.length; + while ( j-- ) { + handleObj = handlers[ j ]; + + if ( ( mappedTypes || origType === handleObj.origType ) && + ( !handler || handler.guid === handleObj.guid ) && + ( !tmp || tmp.test( handleObj.namespace ) ) && + ( !selector || selector === handleObj.selector || + selector === "**" && handleObj.selector ) ) { + handlers.splice( j, 1 ); + + if ( handleObj.selector ) { + handlers.delegateCount--; + } + if ( special.remove ) { + special.remove.call( elem, handleObj ); + } + } + } + + // Remove generic event handler if we removed something and no more handlers exist + // (avoids potential for endless recursion during removal of special event handlers) + if ( origCount && !handlers.length ) { + if ( !special.teardown || + special.teardown.call( elem, namespaces, elemData.handle ) === false ) { + + jQuery.removeEvent( elem, type, elemData.handle ); + } + + delete events[ type ]; + } + } + + // Remove data and the expando if it's no longer used + if ( jQuery.isEmptyObject( events ) ) { + dataPriv.remove( elem, "handle events" ); + } + }, + + dispatch: function( nativeEvent ) { + + var i, j, ret, matched, handleObj, handlerQueue, + args = new Array( arguments.length ), + + // Make a writable jQuery.Event from the native event object + event = jQuery.event.fix( nativeEvent ), + + handlers = ( + dataPriv.get( this, "events" ) || Object.create( null ) + )[ event.type ] || [], + special = jQuery.event.special[ event.type ] || {}; + + // Use the fix-ed jQuery.Event rather than the (read-only) native event + args[ 0 ] = event; + + for ( i = 1; i < arguments.length; i++ ) { + args[ i ] = arguments[ i ]; + } + + event.delegateTarget = this; + + // Call the preDispatch hook for the mapped type, and let it bail if desired + if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { + return; + } + + // Determine handlers + handlerQueue = jQuery.event.handlers.call( this, event, handlers ); + + // Run delegates first; they may want to stop propagation beneath us + i = 0; + while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) { + event.currentTarget = matched.elem; + + j = 0; + while ( ( handleObj = matched.handlers[ j++ ] ) && + !event.isImmediatePropagationStopped() ) { + + // If the event is namespaced, then each handler is only invoked if it is + // specially universal or its namespaces are a superset of the event's. + if ( !event.rnamespace || handleObj.namespace === false || + event.rnamespace.test( handleObj.namespace ) ) { + + event.handleObj = handleObj; + event.data = handleObj.data; + + ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle || + handleObj.handler ).apply( matched.elem, args ); + + if ( ret !== undefined ) { + if ( ( event.result = ret ) === false ) { + event.preventDefault(); + event.stopPropagation(); + } + } + } + } + } + + // Call the postDispatch hook for the mapped type + if ( special.postDispatch ) { + special.postDispatch.call( this, event ); + } + + return event.result; + }, + + handlers: function( event, handlers ) { + var i, handleObj, sel, matchedHandlers, matchedSelectors, + handlerQueue = [], + delegateCount = handlers.delegateCount, + cur = event.target; + + // Find delegate handlers + if ( delegateCount && + + // Support: Firefox <=42 - 66+ + // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861) + // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click + // Support: IE 11+ + // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343) + !( event.type === "click" && event.button >= 1 ) ) { + + for ( ; cur !== this; cur = cur.parentNode || this ) { + + // Don't check non-elements (trac-13208) + // Don't process clicks on disabled elements (trac-6911, trac-8165, trac-11382, trac-11764) + if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) { + matchedHandlers = []; + matchedSelectors = {}; + for ( i = 0; i < delegateCount; i++ ) { + handleObj = handlers[ i ]; + + // Don't conflict with Object.prototype properties (trac-13203) + sel = handleObj.selector + " "; + + if ( matchedSelectors[ sel ] === undefined ) { + matchedSelectors[ sel ] = handleObj.needsContext ? + jQuery( sel, this ).index( cur ) > -1 : + jQuery.find( sel, this, null, [ cur ] ).length; + } + if ( matchedSelectors[ sel ] ) { + matchedHandlers.push( handleObj ); + } + } + if ( matchedHandlers.length ) { + handlerQueue.push( { elem: cur, handlers: matchedHandlers } ); + } + } + } + } + + // Add the remaining (directly-bound) handlers + cur = this; + if ( delegateCount < handlers.length ) { + handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } ); + } + + return handlerQueue; + }, + + addProp: function( name, hook ) { + Object.defineProperty( jQuery.Event.prototype, name, { + enumerable: true, + configurable: true, + + get: typeof hook === "function" ? + function() { + if ( this.originalEvent ) { + return hook( this.originalEvent ); + } + } : + function() { + if ( this.originalEvent ) { + return this.originalEvent[ name ]; + } + }, + + set: function( value ) { + Object.defineProperty( this, name, { + enumerable: true, + configurable: true, + writable: true, + value: value + } ); + } + } ); + }, + + fix: function( originalEvent ) { + return originalEvent[ jQuery.expando ] ? + originalEvent : + new jQuery.Event( originalEvent ); + }, + + special: jQuery.extend( Object.create( null ), { + load: { + + // Prevent triggered image.load events from bubbling to window.load + noBubble: true + }, + click: { + + // Utilize native event to ensure correct state for checkable inputs + setup: function( data ) { + + // For mutual compressibility with _default, replace `this` access with a local var. + // `|| data` is dead code meant only to preserve the variable through minification. + var el = this || data; + + // Claim the first handler + if ( rcheckableType.test( el.type ) && + el.click && nodeName( el, "input" ) ) { + + // dataPriv.set( el, "click", ... ) + leverageNative( el, "click", true ); + } + + // Return false to allow normal processing in the caller + return false; + }, + trigger: function( data ) { + + // For mutual compressibility with _default, replace `this` access with a local var. + // `|| data` is dead code meant only to preserve the variable through minification. + var el = this || data; + + // Force setup before triggering a click + if ( rcheckableType.test( el.type ) && + el.click && nodeName( el, "input" ) ) { + + leverageNative( el, "click" ); + } + + // Return non-false to allow normal event-path propagation + return true; + }, + + // For cross-browser consistency, suppress native .click() on links + // Also prevent it if we're currently inside a leveraged native-event stack + _default: function( event ) { + var target = event.target; + return rcheckableType.test( target.type ) && + target.click && nodeName( target, "input" ) && + dataPriv.get( target, "click" ) || + nodeName( target, "a" ); + } + }, + + beforeunload: { + postDispatch: function( event ) { + if ( event.result !== undefined ) { + + // Setting `event.originalEvent.returnValue` in modern + // browsers does the same as just calling `preventDefault()`, + // the browsers ignore the value anyway. + // Incidentally, IE 11 is the only browser from our supported + // ones which respects the value returned from a `beforeunload` + // handler attached by `addEventListener`; other browsers do + // so only for inline handlers, so not setting the value + // directly shouldn't reduce any functionality. + event.preventDefault(); + } + } + } + } ) +}; + +// Ensure the presence of an event listener that handles manually-triggered +// synthetic events by interrupting progress until reinvoked in response to +// *native* events that it fires directly, ensuring that state changes have +// already occurred before other listeners are invoked. +function leverageNative( el, type, isSetup ) { + + // Missing `isSetup` indicates a trigger call, which must force setup through jQuery.event.add + if ( !isSetup ) { + if ( dataPriv.get( el, type ) === undefined ) { + jQuery.event.add( el, type, returnTrue ); + } + return; + } + + // Register the controller as a special universal handler for all event namespaces + dataPriv.set( el, type, false ); + jQuery.event.add( el, type, { + namespace: false, + handler: function( event ) { + var result, + saved = dataPriv.get( this, type ); + + // This controller function is invoked under multiple circumstances, + // differentiated by the stored value in `saved`: + // 1. For an outer synthetic `.trigger()`ed event (detected by + // `event.isTrigger & 1` and non-array `saved`), it records arguments + // as an array and fires an [inner] native event to prompt state + // changes that should be observed by registered listeners (such as + // checkbox toggling and focus updating), then clears the stored value. + // 2. For an [inner] native event (detected by `saved` being + // an array), it triggers an inner synthetic event, records the + // result, and preempts propagation to further jQuery listeners. + // 3. For an inner synthetic event (detected by `event.isTrigger & 1` and + // array `saved`), it prevents double-propagation of surrogate events + // but otherwise allows everything to proceed (particularly including + // further listeners). + // Possible `saved` data shapes: `[...], `{ value }`, `false`. + if ( ( event.isTrigger & 1 ) && this[ type ] ) { + + // Interrupt processing of the outer synthetic .trigger()ed event + if ( !saved.length ) { + + // Store arguments for use when handling the inner native event + // There will always be at least one argument (an event object), + // so this array will not be confused with a leftover capture object. + saved = slice.call( arguments ); + dataPriv.set( this, type, saved ); + + // Trigger the native event and capture its result + this[ type ](); + result = dataPriv.get( this, type ); + dataPriv.set( this, type, false ); + + if ( saved !== result ) { + + // Cancel the outer synthetic event + event.stopImmediatePropagation(); + event.preventDefault(); + + // Support: Chrome 86+ + // In Chrome, if an element having a focusout handler is + // blurred by clicking outside of it, it invokes the handler + // synchronously. If that handler calls `.remove()` on + // the element, the data is cleared, leaving `result` + // undefined. We need to guard against this. + return result && result.value; + } + + // If this is an inner synthetic event for an event with a bubbling + // surrogate (focus or blur), assume that the surrogate already + // propagated from triggering the native event and prevent that + // from happening again here. + } else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) { + event.stopPropagation(); + } + + // If this is a native event triggered above, everything is now in order. + // Fire an inner synthetic event with the original arguments. + } else if ( saved.length ) { + + // ...and capture the result + dataPriv.set( this, type, { + value: jQuery.event.trigger( + saved[ 0 ], + saved.slice( 1 ), + this + ) + } ); + + // Abort handling of the native event by all jQuery handlers while allowing + // native handlers on the same element to run. On target, this is achieved + // by stopping immediate propagation just on the jQuery event. However, + // the native event is re-wrapped by a jQuery one on each level of the + // propagation so the only way to stop it for jQuery is to stop it for + // everyone via native `stopPropagation()`. This is not a problem for + // focus/blur which don't bubble, but it does also stop click on checkboxes + // and radios. We accept this limitation. + event.stopPropagation(); + event.isImmediatePropagationStopped = returnTrue; + } + } + } ); +} + +jQuery.removeEvent = function( elem, type, handle ) { + + // This "if" is needed for plain objects + if ( elem.removeEventListener ) { + elem.removeEventListener( type, handle ); + } +}; + +jQuery.Event = function( src, props ) { + + // Allow instantiation without the 'new' keyword + if ( !( this instanceof jQuery.Event ) ) { + return new jQuery.Event( src, props ); + } + + // Event object + if ( src && src.type ) { + this.originalEvent = src; + this.type = src.type; + + // Events bubbling up the document may have been marked as prevented + // by a handler lower down the tree; reflect the correct value. + this.isDefaultPrevented = src.defaultPrevented ? + returnTrue : + returnFalse; + + // Create target properties + this.target = src.target; + this.currentTarget = src.currentTarget; + this.relatedTarget = src.relatedTarget; + + // Event type + } else { + this.type = src; + } + + // Put explicitly provided properties onto the event object + if ( props ) { + jQuery.extend( this, props ); + } + + // Create a timestamp if incoming event doesn't have one + this.timeStamp = src && src.timeStamp || Date.now(); + + // Mark it as fixed + this[ jQuery.expando ] = true; +}; + +// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding +// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html +jQuery.Event.prototype = { + constructor: jQuery.Event, + isDefaultPrevented: returnFalse, + isPropagationStopped: returnFalse, + isImmediatePropagationStopped: returnFalse, + isSimulated: false, + + preventDefault: function() { + var e = this.originalEvent; + + this.isDefaultPrevented = returnTrue; + + if ( e && !this.isSimulated ) { + e.preventDefault(); + } + }, + stopPropagation: function() { + var e = this.originalEvent; + + this.isPropagationStopped = returnTrue; + + if ( e && !this.isSimulated ) { + e.stopPropagation(); + } + }, + stopImmediatePropagation: function() { + var e = this.originalEvent; + + this.isImmediatePropagationStopped = returnTrue; + + if ( e && !this.isSimulated ) { + e.stopImmediatePropagation(); + } + + this.stopPropagation(); + } +}; + +// Includes all common event props including KeyEvent and MouseEvent specific props +jQuery.each( { + altKey: true, + bubbles: true, + cancelable: true, + changedTouches: true, + ctrlKey: true, + detail: true, + eventPhase: true, + metaKey: true, + pageX: true, + pageY: true, + shiftKey: true, + view: true, + "char": true, + code: true, + charCode: true, + key: true, + keyCode: true, + button: true, + buttons: true, + clientX: true, + clientY: true, + offsetX: true, + offsetY: true, + pointerId: true, + pointerType: true, + screenX: true, + screenY: true, + targetTouches: true, + toElement: true, + touches: true, + which: true +}, jQuery.event.addProp ); + +jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) { + + // Support: IE 11+ + // Attach a single focusin/focusout handler on the document while someone wants focus/blur. + // This is because the former are synchronous in IE while the latter are async. In other + // browsers, all those handlers are invoked synchronously. + function focusMappedHandler( nativeEvent ) { + + // `eventHandle` would already wrap the event, but we need to change the `type` here. + var event = jQuery.event.fix( nativeEvent ); + event.type = nativeEvent.type === "focusin" ? "focus" : "blur"; + event.isSimulated = true; + + // focus/blur don't bubble while focusin/focusout do; simulate the former by only + // invoking the handler at the lower level. + if ( event.target === event.currentTarget ) { + + // The setup part calls `leverageNative`, which, in turn, calls + // `jQuery.event.add`, so event handle will already have been set + // by this point. + dataPriv.get( this, "handle" )( event ); + } + } + + jQuery.event.special[ type ] = { + + // Utilize native event if possible so blur/focus sequence is correct + setup: function() { + + // Claim the first handler + // dataPriv.set( this, "focus", ... ) + // dataPriv.set( this, "blur", ... ) + leverageNative( this, type, true ); + + if ( isIE ) { + this.addEventListener( delegateType, focusMappedHandler ); + } else { + + // Return false to allow normal processing in the caller + return false; + } + }, + trigger: function() { + + // Force setup before trigger + leverageNative( this, type ); + + // Return non-false to allow normal event-path propagation + return true; + }, + + teardown: function() { + if ( isIE ) { + this.removeEventListener( delegateType, focusMappedHandler ); + } else { + + // Return false to indicate standard teardown should be applied + return false; + } + }, + + // Suppress native focus or blur if we're currently inside + // a leveraged native-event stack + _default: function( event ) { + return dataPriv.get( event.target, type ); + }, + + delegateType: delegateType + }; +} ); + +// Create mouseenter/leave events using mouseover/out and event-time checks +// so that event delegation works in jQuery. +// Do the same for pointerenter/pointerleave and pointerover/pointerout +jQuery.each( { + mouseenter: "mouseover", + mouseleave: "mouseout", + pointerenter: "pointerover", + pointerleave: "pointerout" +}, function( orig, fix ) { + jQuery.event.special[ orig ] = { + delegateType: fix, + bindType: fix, + + handle: function( event ) { + var ret, + target = this, + related = event.relatedTarget, + handleObj = event.handleObj; + + // For mouseenter/leave call the handler if related is outside the target. + // NB: No relatedTarget if the mouse left/entered the browser window + if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) { + event.type = handleObj.origType; + ret = handleObj.handler.apply( this, arguments ); + event.type = fix; + } + return ret; + } + }; +} ); + +jQuery.fn.extend( { + + on: function( types, selector, data, fn ) { + return on( this, types, selector, data, fn ); + }, + one: function( types, selector, data, fn ) { + return on( this, types, selector, data, fn, 1 ); + }, + off: function( types, selector, fn ) { + var handleObj, type; + if ( types && types.preventDefault && types.handleObj ) { + + // ( event ) dispatched jQuery.Event + handleObj = types.handleObj; + jQuery( types.delegateTarget ).off( + handleObj.namespace ? + handleObj.origType + "." + handleObj.namespace : + handleObj.origType, + handleObj.selector, + handleObj.handler + ); + return this; + } + if ( typeof types === "object" ) { + + // ( types-object [, selector] ) + for ( type in types ) { + this.off( type, selector, types[ type ] ); + } + return this; + } + if ( selector === false || typeof selector === "function" ) { + + // ( types [, fn] ) + fn = selector; + selector = undefined; + } + if ( fn === false ) { + fn = returnFalse; + } + return this.each( function() { + jQuery.event.remove( this, types, fn, selector ); + } ); + } +} ); + +var + + // Support: IE <=10 - 11+ + // In IE using regex groups here causes severe slowdowns. + rnoInnerhtml = / 0 ) { + setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); + } + + // Return the cloned set + return clone; + }, + + cleanData: function( elems ) { + var data, elem, type, + special = jQuery.event.special, + i = 0; + + for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) { + if ( acceptData( elem ) ) { + if ( ( data = elem[ dataPriv.expando ] ) ) { + if ( data.events ) { + for ( type in data.events ) { + if ( special[ type ] ) { + jQuery.event.remove( elem, type ); + + // This is a shortcut to avoid jQuery.event.remove's overhead + } else { + jQuery.removeEvent( elem, type, data.handle ); + } + } + } + + // Support: Chrome <=35 - 45+ + // Assign undefined instead of using delete, see Data#remove + elem[ dataPriv.expando ] = undefined; + } + if ( elem[ dataUser.expando ] ) { + + // Support: Chrome <=35 - 45+ + // Assign undefined instead of using delete, see Data#remove + elem[ dataUser.expando ] = undefined; + } + } + } + } +} ); + +jQuery.fn.extend( { + detach: function( selector ) { + return remove( this, selector, true ); + }, + + remove: function( selector ) { + return remove( this, selector ); + }, + + text: function( value ) { + return access( this, function( value ) { + return value === undefined ? + jQuery.text( this ) : + this.empty().each( function() { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + this.textContent = value; + } + } ); + }, null, value, arguments.length ); + }, + + append: function() { + return domManip( this, arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.appendChild( elem ); + } + } ); + }, + + prepend: function() { + return domManip( this, arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.insertBefore( elem, target.firstChild ); + } + } ); + }, + + before: function() { + return domManip( this, arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this ); + } + } ); + }, + + after: function() { + return domManip( this, arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this.nextSibling ); + } + } ); + }, + + empty: function() { + var elem, + i = 0; + + for ( ; ( elem = this[ i ] ) != null; i++ ) { + if ( elem.nodeType === 1 ) { + + // Prevent memory leaks + jQuery.cleanData( getAll( elem, false ) ); + + // Remove any remaining nodes + elem.textContent = ""; + } + } + + return this; + }, + + clone: function( dataAndEvents, deepDataAndEvents ) { + dataAndEvents = dataAndEvents == null ? false : dataAndEvents; + deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; + + return this.map( function() { + return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); + } ); + }, + + html: function( value ) { + return access( this, function( value ) { + var elem = this[ 0 ] || {}, + i = 0, + l = this.length; + + if ( value === undefined && elem.nodeType === 1 ) { + return elem.innerHTML; + } + + // See if we can take a shortcut and just use innerHTML + if ( typeof value === "string" && !rnoInnerhtml.test( value ) && + !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { + + value = jQuery.htmlPrefilter( value ); + + try { + for ( ; i < l; i++ ) { + elem = this[ i ] || {}; + + // Remove element nodes and prevent memory leaks + if ( elem.nodeType === 1 ) { + jQuery.cleanData( getAll( elem, false ) ); + elem.innerHTML = value; + } + } + + elem = 0; + + // If using innerHTML throws an exception, use the fallback method + } catch ( e ) {} + } + + if ( elem ) { + this.empty().append( value ); + } + }, null, value, arguments.length ); + }, + + replaceWith: function() { + var ignored = []; + + // Make the changes, replacing each non-ignored context element with the new content + return domManip( this, arguments, function( elem ) { + var parent = this.parentNode; + + if ( jQuery.inArray( this, ignored ) < 0 ) { + jQuery.cleanData( getAll( this ) ); + if ( parent ) { + parent.replaceChild( elem, this ); + } + } + + // Force callback invocation + }, ignored ); + } +} ); + +jQuery.each( { + appendTo: "append", + prependTo: "prepend", + insertBefore: "before", + insertAfter: "after", + replaceAll: "replaceWith" +}, function( name, original ) { + jQuery.fn[ name ] = function( selector ) { + var elems, + ret = [], + insert = jQuery( selector ), + last = insert.length - 1, + i = 0; + + for ( ; i <= last; i++ ) { + elems = i === last ? this : this.clone( true ); + jQuery( insert[ i ] )[ original ]( elems ); + push.apply( ret, elems ); + } + + return this.pushStack( ret ); + }; +} ); + +var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" ); + +var rcustomProp = /^--/; + +function getStyles( elem ) { + + // Support: IE <=11+ (trac-14150) + // In IE popup's `window` is the opener window which makes `window.getComputedStyle( elem )` + // break. Using `elem.ownerDocument.defaultView` avoids the issue. + var view = elem.ownerDocument.defaultView; + + // `document.implementation.createHTMLDocument( "" )` has a `null` `defaultView` + // property; check `defaultView` truthiness to fallback to window in such a case. + if ( !view ) { + view = window; + } + + return view.getComputedStyle( elem ); +} + +// A method for quickly swapping in/out CSS properties to get correct calculations. +function swap( elem, options, callback ) { + var ret, name, + old = {}; + + // Remember the old values, and insert the new ones + for ( name in options ) { + old[ name ] = elem.style[ name ]; + elem.style[ name ] = options[ name ]; + } + + ret = callback.call( elem ); + + // Revert the old values + for ( name in options ) { + elem.style[ name ] = old[ name ]; + } + + return ret; +} + +function curCSS( elem, name, computed ) { + var ret, + isCustomProp = rcustomProp.test( name ); + + computed = computed || getStyles( elem ); + + // getPropertyValue is needed for `.css('--customProperty')` (gh-3144) + if ( computed ) { + + // A fallback to direct property access is needed as `computed`, being + // the output of `getComputedStyle`, contains camelCased keys and + // `getPropertyValue` requires kebab-case ones. + // + // Support: IE <=9 - 11+ + // IE only supports `"float"` in `getPropertyValue`; in computed styles + // it's only available as `"cssFloat"`. We no longer modify properties + // sent to `.css()` apart from camelCasing, so we need to check both. + // Normally, this would create difference in behavior: if + // `getPropertyValue` returns an empty string, the value returned + // by `.css()` would be `undefined`. This is usually the case for + // disconnected elements. However, in IE even disconnected elements + // with no styles return `"none"` for `getPropertyValue( "float" )` + ret = computed.getPropertyValue( name ) || computed[ name ]; + + if ( isCustomProp && ret ) { + + // Support: Firefox 105 - 135+ + // Spec requires trimming whitespace for custom properties (gh-4926). + // Firefox only trims leading whitespace. + // + // Fall back to `undefined` if empty string returned. + // This collapses a missing definition with property defined + // and set to an empty string but there's no standard API + // allowing us to differentiate them without a performance penalty + // and returning `undefined` aligns with older jQuery. + // + // rtrimCSS treats U+000D CARRIAGE RETURN and U+000C FORM FEED + // as whitespace while CSS does not, but this is not a problem + // because CSS preprocessing replaces them with U+000A LINE FEED + // (which *is* CSS whitespace) + // https://www.w3.org/TR/css-syntax-3/#input-preprocessing + ret = ret.replace( rtrimCSS, "$1" ) || undefined; + } + + if ( ret === "" && !isAttached( elem ) ) { + ret = jQuery.style( elem, name ); + } + } + + return ret !== undefined ? + + // Support: IE <=9 - 11+ + // IE returns zIndex value as an integer. + ret + "" : + ret; +} + +var cssPrefixes = [ "Webkit", "Moz", "ms" ], + emptyStyle = document$1.createElement( "div" ).style; + +// Return a vendor-prefixed property or undefined +function vendorPropName( name ) { + + // Check for vendor prefixed names + var capName = name[ 0 ].toUpperCase() + name.slice( 1 ), + i = cssPrefixes.length; + + while ( i-- ) { + name = cssPrefixes[ i ] + capName; + if ( name in emptyStyle ) { + return name; + } + } +} + +// Return a potentially-mapped vendor prefixed property +function finalPropName( name ) { + if ( name in emptyStyle ) { + return name; + } + return vendorPropName( name ) || name; +} + +var reliableTrDimensionsVal, reliableColDimensionsVal, + table = document$1.createElement( "table" ); + +// Executing table tests requires only one layout, so they're executed +// at the same time to save the second computation. +function computeTableStyleTests() { + if ( + + // This is a singleton, we need to execute it only once + !table || + + // Finish early in limited (non-browser) environments + !table.style + ) { + return; + } + + var trStyle, + col = document$1.createElement( "col" ), + tr = document$1.createElement( "tr" ), + td = document$1.createElement( "td" ); + + table.style.cssText = "position:absolute;left:-11111px;" + + "border-collapse:separate;border-spacing:0"; + tr.style.cssText = "box-sizing:content-box;border:1px solid;height:1px"; + td.style.cssText = "height:9px;width:9px;padding:0"; + + col.span = 2; + + documentElement$1 + .appendChild( table ) + .appendChild( col ) + .parentNode + .appendChild( tr ) + .appendChild( td ) + .parentNode + .appendChild( td.cloneNode( true ) ); + + // Don't run until window is visible + if ( table.offsetWidth === 0 ) { + documentElement$1.removeChild( table ); + return; + } + + trStyle = window.getComputedStyle( tr ); + + // Support: Firefox 135+ + // Firefox always reports computed width as if `span` was 1. + // Support: Safari 18.3+ + // In Safari, computed width for columns is always 0. + // In both these browsers, using `offsetWidth` solves the issue. + // Support: IE 11+ + // In IE, `` computed width is `"auto"` unless `width` is set + // explicitly via CSS so measurements there remain incorrect. Because of + // the lack of a proper workaround, we accept this limitation, treating + // IE as passing the test. + reliableColDimensionsVal = isIE || Math.round( parseFloat( + window.getComputedStyle( col ).width ) + ) === 18; + + // Support: IE 10 - 11+ + // IE misreports `getComputedStyle` of table rows with width/height + // set in CSS while `offset*` properties report correct values. + // Support: Firefox 70 - 135+ + // Only Firefox includes border widths + // in computed dimensions for table rows. (gh-4529) + reliableTrDimensionsVal = Math.round( parseFloat( trStyle.height ) + + parseFloat( trStyle.borderTopWidth ) + + parseFloat( trStyle.borderBottomWidth ) ) === tr.offsetHeight; + + documentElement$1.removeChild( table ); + + // Nullify the table so it wouldn't be stored in the memory; + // it will also be a sign that checks were already performed. + table = null; +} + +jQuery.extend( support, { + reliableTrDimensions: function() { + computeTableStyleTests(); + return reliableTrDimensionsVal; + }, + + reliableColDimensions: function() { + computeTableStyleTests(); + return reliableColDimensionsVal; + } +} ); + +var cssShow = { position: "absolute", visibility: "hidden", display: "block" }, + cssNormalTransform = { + letterSpacing: "0", + fontWeight: "400" + }; + +function setPositiveNumber( _elem, value, subtract ) { + + // Any relative (+/-) values have already been + // normalized at this point + var matches = rcssNum.exec( value ); + return matches ? + + // Guard against undefined "subtract", e.g., when used as in cssHooks + Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) : + value; +} + +function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) { + var i = dimension === "width" ? 1 : 0, + extra = 0, + delta = 0, + marginDelta = 0; + + // Adjustment may not be necessary + if ( box === ( isBorderBox ? "border" : "content" ) ) { + return 0; + } + + for ( ; i < 4; i += 2 ) { + + // Both box models exclude margin + // Count margin delta separately to only add it after scroll gutter adjustment. + // This is needed to make negative margins work with `outerHeight( true )` (gh-3982). + if ( box === "margin" ) { + marginDelta += jQuery.css( elem, box + cssExpand[ i ], true, styles ); + } + + // If we get here with a content-box, we're seeking "padding" or "border" or "margin" + if ( !isBorderBox ) { + + // Add padding + delta += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); + + // For "border" or "margin", add border + if ( box !== "padding" ) { + delta += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); + + // But still keep track of it otherwise + } else { + extra += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); + } + + // If we get here with a border-box (content + padding + border), we're seeking "content" or + // "padding" or "margin" + } else { + + // For "content", subtract padding + if ( box === "content" ) { + delta -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); + } + + // For "content" or "padding", subtract border + if ( box !== "margin" ) { + delta -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); + } + } + } + + // Account for positive content-box scroll gutter when requested by providing computedVal + if ( !isBorderBox && computedVal >= 0 ) { + + // offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border + // Assuming integer scroll gutter, subtract the rest and round down + delta += Math.max( 0, Math.ceil( + elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - + computedVal - + delta - + extra - + 0.5 + + // If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter + // Use an explicit zero to avoid NaN (gh-3964) + ) ) || 0; + } + + return delta + marginDelta; +} + +function getWidthOrHeight( elem, dimension, extra ) { + + // Start with computed style + var styles = getStyles( elem ), + + // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322). + // Fake content-box until we know it's needed to know the true value. + boxSizingNeeded = isIE || extra, + isBorderBox = boxSizingNeeded && + jQuery.css( elem, "boxSizing", false, styles ) === "border-box", + valueIsBorderBox = isBorderBox, + + val = curCSS( elem, dimension, styles ), + offsetProp = "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ); + + // Return a confounding non-pixel value or feign ignorance, as appropriate. + if ( rnumnonpx.test( val ) ) { + if ( !extra ) { + return val; + } + val = "auto"; + } + + + if ( + ( + + // Fall back to offsetWidth/offsetHeight when value is "auto" + // This happens for inline elements with no explicit setting (gh-3571) + val === "auto" || + + // Support: IE 9 - 11+ + // Use offsetWidth/offsetHeight for when box sizing is unreliable. + // In those cases, the computed value can be trusted to be border-box. + ( isIE && isBorderBox ) || + + ( !support.reliableColDimensions() && nodeName( elem, "col" ) ) || + + ( !support.reliableTrDimensions() && nodeName( elem, "tr" ) ) + ) && + + // Make sure the element is visible & connected + elem.getClientRects().length ) { + + isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box"; + + // Where available, offsetWidth/offsetHeight approximate border box dimensions. + // Where not available (e.g., SVG), assume unreliable box-sizing and interpret the + // retrieved value as a content box dimension. + valueIsBorderBox = offsetProp in elem; + if ( valueIsBorderBox ) { + val = elem[ offsetProp ]; + } + } + + // Normalize "" and auto + val = parseFloat( val ) || 0; + + // Adjust for the element's box model + return ( val + + boxModelAdjustment( + elem, + dimension, + extra || ( isBorderBox ? "border" : "content" ), + valueIsBorderBox, + styles, + + // Provide the current computed size to request scroll gutter calculation (gh-3589) + val + ) + ) + "px"; +} + +jQuery.extend( { + + // Add in style property hooks for overriding the default + // behavior of getting and setting a style property + cssHooks: {}, + + // Get and set the style property on a DOM Node + style: function( elem, name, value, extra ) { + + // Don't set styles on text and comment nodes + if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { + return; + } + + // Make sure that we're working with the right name + var ret, type, hooks, + origName = cssCamelCase( name ), + isCustomProp = rcustomProp.test( name ), + style = elem.style; + + // Make sure that we're working with the right name. We don't + // want to query the value if it is a CSS custom property + // since they are user-defined. + if ( !isCustomProp ) { + name = finalPropName( origName ); + } + + // Gets hook for the prefixed version, then unprefixed version + hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; + + // Check if we're setting a value + if ( value !== undefined ) { + type = typeof value; + + // Convert "+=" or "-=" to relative numbers (trac-7345) + if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) { + value = adjustCSS( elem, name, ret ); + + // Fixes bug trac-9237 + type = "number"; + } + + // Make sure that null and NaN values aren't set (trac-7116) + if ( value == null || value !== value ) { + return; + } + + // If the value is a number, add `px` for certain CSS properties + if ( type === "number" ) { + value += ret && ret[ 3 ] || ( isAutoPx( origName ) ? "px" : "" ); + } + + // Support: IE <=9 - 11+ + // background-* props of a cloned element affect the source element (trac-8908) + if ( isIE && value === "" && name.indexOf( "background" ) === 0 ) { + style[ name ] = "inherit"; + } + + // If a hook was provided, use that value, otherwise just set the specified value + if ( !hooks || !( "set" in hooks ) || + ( value = hooks.set( elem, value, extra ) ) !== undefined ) { + + if ( isCustomProp ) { + style.setProperty( name, value ); + } else { + style[ name ] = value; + } + } + + } else { + + // If a hook was provided get the non-computed value from there + if ( hooks && "get" in hooks && + ( ret = hooks.get( elem, false, extra ) ) !== undefined ) { + + return ret; + } + + // Otherwise just get the value from the style object + return style[ name ]; + } + }, + + css: function( elem, name, extra, styles ) { + var val, num, hooks, + origName = cssCamelCase( name ), + isCustomProp = rcustomProp.test( name ); + + // Make sure that we're working with the right name. We don't + // want to modify the value if it is a CSS custom property + // since they are user-defined. + if ( !isCustomProp ) { + name = finalPropName( origName ); + } + + // Try prefixed name followed by the unprefixed name + hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; + + // If a hook was provided get the computed value from there + if ( hooks && "get" in hooks ) { + val = hooks.get( elem, true, extra ); + } + + // Otherwise, if a way to get the computed value exists, use that + if ( val === undefined ) { + val = curCSS( elem, name, styles ); + } + + // Convert "normal" to computed value + if ( val === "normal" && name in cssNormalTransform ) { + val = cssNormalTransform[ name ]; + } + + // Make numeric if forced or a qualifier was provided and val looks numeric + if ( extra === "" || extra ) { + num = parseFloat( val ); + return extra === true || isFinite( num ) ? num || 0 : val; + } + + return val; + } +} ); + +jQuery.each( [ "height", "width" ], function( _i, dimension ) { + jQuery.cssHooks[ dimension ] = { + get: function( elem, computed, extra ) { + if ( computed ) { + + // Elements with `display: none` can have dimension info if + // we invisibly show them. + return jQuery.css( elem, "display" ) === "none" ? + swap( elem, cssShow, function() { + return getWidthOrHeight( elem, dimension, extra ); + } ) : + getWidthOrHeight( elem, dimension, extra ); + } + }, + + set: function( elem, value, extra ) { + var matches, + styles = getStyles( elem ), + + // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991) + isBorderBox = extra && + jQuery.css( elem, "boxSizing", false, styles ) === "border-box", + subtract = extra ? + boxModelAdjustment( + elem, + dimension, + extra, + isBorderBox, + styles + ) : + 0; + + // Convert to pixels if value adjustment is needed + if ( subtract && ( matches = rcssNum.exec( value ) ) && + ( matches[ 3 ] || "px" ) !== "px" ) { + + elem.style[ dimension ] = value; + value = jQuery.css( elem, dimension ); + } + + return setPositiveNumber( elem, value, subtract ); + } + }; +} ); + +// These hooks are used by animate to expand properties +jQuery.each( { + margin: "", + padding: "", + border: "Width" +}, function( prefix, suffix ) { + jQuery.cssHooks[ prefix + suffix ] = { + expand: function( value ) { + var i = 0, + expanded = {}, + + // Assumes a single number if not a string + parts = typeof value === "string" ? value.split( " " ) : [ value ]; + + for ( ; i < 4; i++ ) { + expanded[ prefix + cssExpand[ i ] + suffix ] = + parts[ i ] || parts[ i - 2 ] || parts[ 0 ]; + } + + return expanded; + } + }; + + if ( prefix !== "margin" ) { + jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber; + } +} ); + +jQuery.fn.extend( { + css: function( name, value ) { + return access( this, function( elem, name, value ) { + var styles, len, + map = {}, + i = 0; + + if ( Array.isArray( name ) ) { + styles = getStyles( elem ); + len = name.length; + + for ( ; i < len; i++ ) { + map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles ); + } + + return map; + } + + return value !== undefined ? + jQuery.style( elem, name, value ) : + jQuery.css( elem, name ); + }, name, value, arguments.length > 1 ); + } +} ); + +function Tween( elem, options, prop, end, easing ) { + return new Tween.prototype.init( elem, options, prop, end, easing ); +} +jQuery.Tween = Tween; + +Tween.prototype = { + constructor: Tween, + init: function( elem, options, prop, end, easing, unit ) { + this.elem = elem; + this.prop = prop; + this.easing = easing || jQuery.easing._default; + this.options = options; + this.start = this.now = this.cur(); + this.end = end; + this.unit = unit || ( isAutoPx( prop ) ? "px" : "" ); + }, + cur: function() { + var hooks = Tween.propHooks[ this.prop ]; + + return hooks && hooks.get ? + hooks.get( this ) : + Tween.propHooks._default.get( this ); + }, + run: function( percent ) { + var eased, + hooks = Tween.propHooks[ this.prop ]; + + if ( this.options.duration ) { + this.pos = eased = jQuery.easing[ this.easing ]( + percent, this.options.duration * percent, 0, 1, this.options.duration + ); + } else { + this.pos = eased = percent; + } + this.now = ( this.end - this.start ) * eased + this.start; + + if ( this.options.step ) { + this.options.step.call( this.elem, this.now, this ); + } + + if ( hooks && hooks.set ) { + hooks.set( this ); + } else { + Tween.propHooks._default.set( this ); + } + return this; + } +}; + +Tween.prototype.init.prototype = Tween.prototype; + +Tween.propHooks = { + _default: { + get: function( tween ) { + var result; + + // Use a property on the element directly when it is not a DOM element, + // or when there is no matching style property that exists. + if ( tween.elem.nodeType !== 1 || + tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) { + return tween.elem[ tween.prop ]; + } + + // Passing an empty string as a 3rd parameter to .css will automatically + // attempt a parseFloat and fallback to a string if the parse fails. + // Simple values such as "10px" are parsed to Float; + // complex values such as "rotate(1rad)" are returned as-is. + result = jQuery.css( tween.elem, tween.prop, "" ); + + // Empty strings, null, undefined and "auto" are converted to 0. + return !result || result === "auto" ? 0 : result; + }, + set: function( tween ) { + + // Use step hook for back compat. + // Use cssHook if its there. + // Use .style if available and use plain properties where available. + if ( jQuery.fx.step[ tween.prop ] ) { + jQuery.fx.step[ tween.prop ]( tween ); + } else if ( tween.elem.nodeType === 1 && ( + jQuery.cssHooks[ tween.prop ] || + tween.elem.style[ finalPropName( tween.prop ) ] != null ) ) { + jQuery.style( tween.elem, tween.prop, tween.now + tween.unit ); + } else { + tween.elem[ tween.prop ] = tween.now; + } + } + } +}; + +jQuery.easing = { + linear: function( p ) { + return p; + }, + swing: function( p ) { + return 0.5 - Math.cos( p * Math.PI ) / 2; + }, + _default: "swing" +}; + +jQuery.fx = Tween.prototype.init; + +// Back compat <1.8 extension point +jQuery.fx.step = {}; + +var + fxNow, inProgress, + rfxtypes = /^(?:toggle|show|hide)$/, + rrun = /queueHooks$/; + +function schedule() { + if ( inProgress ) { + if ( document$1.hidden === false && window.requestAnimationFrame ) { + window.requestAnimationFrame( schedule ); + } else { + window.setTimeout( schedule, 13 ); + } + + jQuery.fx.tick(); + } +} + +// Animations created synchronously will run synchronously +function createFxNow() { + window.setTimeout( function() { + fxNow = undefined; + } ); + return ( fxNow = Date.now() ); +} + +// Generate parameters to create a standard animation +function genFx( type, includeWidth ) { + var which, + i = 0, + attrs = { height: type }; + + // If we include width, step value is 1 to do all cssExpand values, + // otherwise step value is 2 to skip over Left and Right + includeWidth = includeWidth ? 1 : 0; + for ( ; i < 4; i += 2 - includeWidth ) { + which = cssExpand[ i ]; + attrs[ "margin" + which ] = attrs[ "padding" + which ] = type; + } + + if ( includeWidth ) { + attrs.opacity = attrs.width = type; + } + + return attrs; +} + +function createTween( value, prop, animation ) { + var tween, + collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ), + index = 0, + length = collection.length; + for ( ; index < length; index++ ) { + if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) { + + // We're done with this property + return tween; + } + } +} + +function defaultPrefilter( elem, props, opts ) { + var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display, + isBox = "width" in props || "height" in props, + anim = this, + orig = {}, + style = elem.style, + hidden = elem.nodeType && isHiddenWithinTree( elem ), + dataShow = dataPriv.get( elem, "fxshow" ); + + // Queue-skipping animations hijack the fx hooks + if ( !opts.queue ) { + hooks = jQuery._queueHooks( elem, "fx" ); + if ( hooks.unqueued == null ) { + hooks.unqueued = 0; + oldfire = hooks.empty.fire; + hooks.empty.fire = function() { + if ( !hooks.unqueued ) { + oldfire(); + } + }; + } + hooks.unqueued++; + + anim.always( function() { + + // Ensure the complete handler is called before this completes + anim.always( function() { + hooks.unqueued--; + if ( !jQuery.queue( elem, "fx" ).length ) { + hooks.empty.fire(); + } + } ); + } ); + } + + // Detect show/hide animations + for ( prop in props ) { + value = props[ prop ]; + if ( rfxtypes.test( value ) ) { + delete props[ prop ]; + toggle = toggle || value === "toggle"; + if ( value === ( hidden ? "hide" : "show" ) ) { + + // Pretend to be hidden if this is a "show" and + // there is still data from a stopped show/hide + if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) { + hidden = true; + + // Ignore all other no-op show/hide data + } else { + continue; + } + } + orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop ); + } + } + + // Bail out if this is a no-op like .hide().hide() + propTween = !jQuery.isEmptyObject( props ); + if ( !propTween && jQuery.isEmptyObject( orig ) ) { + return; + } + + // Restrict "overflow" and "display" styles during box animations + if ( isBox && elem.nodeType === 1 ) { + + // Support: IE <=9 - 11+ + // Record all 3 overflow attributes because IE does not infer the shorthand + // from identically-valued overflowX and overflowY. + opts.overflow = [ style.overflow, style.overflowX, style.overflowY ]; + + // Identify a display type, preferring old show/hide data over the CSS cascade + restoreDisplay = dataShow && dataShow.display; + if ( restoreDisplay == null ) { + restoreDisplay = dataPriv.get( elem, "display" ); + } + display = jQuery.css( elem, "display" ); + if ( display === "none" ) { + if ( restoreDisplay ) { + display = restoreDisplay; + } else { + + // Get nonempty value(s) by temporarily forcing visibility + showHide( [ elem ], true ); + restoreDisplay = elem.style.display || restoreDisplay; + display = jQuery.css( elem, "display" ); + showHide( [ elem ] ); + } + } + + // Animate inline elements as inline-block + if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) { + if ( jQuery.css( elem, "float" ) === "none" ) { + + // Restore the original display value at the end of pure show/hide animations + if ( !propTween ) { + anim.done( function() { + style.display = restoreDisplay; + } ); + if ( restoreDisplay == null ) { + display = style.display; + restoreDisplay = display === "none" ? "" : display; + } + } + style.display = "inline-block"; + } + } + } + + if ( opts.overflow ) { + style.overflow = "hidden"; + anim.always( function() { + style.overflow = opts.overflow[ 0 ]; + style.overflowX = opts.overflow[ 1 ]; + style.overflowY = opts.overflow[ 2 ]; + } ); + } + + // Implement show/hide animations + propTween = false; + for ( prop in orig ) { + + // General show/hide setup for this element animation + if ( !propTween ) { + if ( dataShow ) { + if ( "hidden" in dataShow ) { + hidden = dataShow.hidden; + } + } else { + dataShow = dataPriv.set( elem, "fxshow", { display: restoreDisplay } ); + } + + // Store hidden/visible for toggle so `.stop().toggle()` "reverses" + if ( toggle ) { + dataShow.hidden = !hidden; + } + + // Show elements before animating them + if ( hidden ) { + showHide( [ elem ], true ); + } + + // eslint-disable-next-line no-loop-func + anim.done( function() { + + // The final step of a "hide" animation is actually hiding the element + if ( !hidden ) { + showHide( [ elem ] ); + } + dataPriv.remove( elem, "fxshow" ); + for ( prop in orig ) { + jQuery.style( elem, prop, orig[ prop ] ); + } + } ); + } + + // Per-property setup + propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim ); + if ( !( prop in dataShow ) ) { + dataShow[ prop ] = propTween.start; + if ( hidden ) { + propTween.end = propTween.start; + propTween.start = 0; + } + } + } +} + +function propFilter( props, specialEasing ) { + var index, name, easing, value, hooks; + + // camelCase, specialEasing and expand cssHook pass + for ( index in props ) { + name = cssCamelCase( index ); + easing = specialEasing[ name ]; + value = props[ index ]; + if ( Array.isArray( value ) ) { + easing = value[ 1 ]; + value = props[ index ] = value[ 0 ]; + } + + if ( index !== name ) { + props[ name ] = value; + delete props[ index ]; + } + + hooks = jQuery.cssHooks[ name ]; + if ( hooks && "expand" in hooks ) { + value = hooks.expand( value ); + delete props[ name ]; + + // Not quite $.extend, this won't overwrite existing keys. + // Reusing 'index' because we have the correct "name" + for ( index in value ) { + if ( !( index in props ) ) { + props[ index ] = value[ index ]; + specialEasing[ index ] = easing; + } + } + } else { + specialEasing[ name ] = easing; + } + } +} + +function Animation( elem, properties, options ) { + var result, + stopped, + index = 0, + length = Animation.prefilters.length, + deferred = jQuery.Deferred().always( function() { + + // Don't match elem in the :animated selector + delete tick.elem; + } ), + tick = function() { + if ( stopped ) { + return false; + } + var currentTime = fxNow || createFxNow(), + remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ), + + percent = 1 - ( remaining / animation.duration || 0 ), + index = 0, + length = animation.tweens.length; + + for ( ; index < length; index++ ) { + animation.tweens[ index ].run( percent ); + } + + deferred.notifyWith( elem, [ animation, percent, remaining ] ); + + // If there's more to do, yield + if ( percent < 1 && length ) { + return remaining; + } + + // If this was an empty animation, synthesize a final progress notification + if ( !length ) { + deferred.notifyWith( elem, [ animation, 1, 0 ] ); + } + + // Resolve the animation and report its conclusion + deferred.resolveWith( elem, [ animation ] ); + return false; + }, + animation = deferred.promise( { + elem: elem, + props: jQuery.extend( {}, properties ), + opts: jQuery.extend( true, { + specialEasing: {}, + easing: jQuery.easing._default + }, options ), + originalProperties: properties, + originalOptions: options, + startTime: fxNow || createFxNow(), + duration: options.duration, + tweens: [], + createTween: function( prop, end ) { + var tween = jQuery.Tween( elem, animation.opts, prop, end, + animation.opts.specialEasing[ prop ] || animation.opts.easing ); + animation.tweens.push( tween ); + return tween; + }, + stop: function( gotoEnd ) { + var index = 0, + + // If we are going to the end, we want to run all the tweens + // otherwise we skip this part + length = gotoEnd ? animation.tweens.length : 0; + if ( stopped ) { + return this; + } + stopped = true; + for ( ; index < length; index++ ) { + animation.tweens[ index ].run( 1 ); + } + + // Resolve when we played the last frame; otherwise, reject + if ( gotoEnd ) { + deferred.notifyWith( elem, [ animation, 1, 0 ] ); + deferred.resolveWith( elem, [ animation, gotoEnd ] ); + } else { + deferred.rejectWith( elem, [ animation, gotoEnd ] ); + } + return this; + } + } ), + props = animation.props; + + propFilter( props, animation.opts.specialEasing ); + + for ( ; index < length; index++ ) { + result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts ); + if ( result ) { + if ( typeof result.stop === "function" ) { + jQuery._queueHooks( animation.elem, animation.opts.queue ).stop = + result.stop.bind( result ); + } + return result; + } + } + + jQuery.map( props, createTween, animation ); + + if ( typeof animation.opts.start === "function" ) { + animation.opts.start.call( elem, animation ); + } + + // Attach callbacks from options + animation + .progress( animation.opts.progress ) + .done( animation.opts.done, animation.opts.complete ) + .fail( animation.opts.fail ) + .always( animation.opts.always ); + + jQuery.fx.timer( + jQuery.extend( tick, { + elem: elem, + anim: animation, + queue: animation.opts.queue + } ) + ); + + return animation; +} + +jQuery.Animation = jQuery.extend( Animation, { + + tweeners: { + "*": [ function( prop, value ) { + var tween = this.createTween( prop, value ); + adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween ); + return tween; + } ] + }, + + tweener: function( props, callback ) { + if ( typeof props === "function" ) { + callback = props; + props = [ "*" ]; + } else { + props = props.match( rnothtmlwhite ); + } + + var prop, + index = 0, + length = props.length; + + for ( ; index < length; index++ ) { + prop = props[ index ]; + Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || []; + Animation.tweeners[ prop ].unshift( callback ); + } + }, + + prefilters: [ defaultPrefilter ], + + prefilter: function( callback, prepend ) { + if ( prepend ) { + Animation.prefilters.unshift( callback ); + } else { + Animation.prefilters.push( callback ); + } + } +} ); + +jQuery.speed = function( speed, easing, fn ) { + var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : { + complete: fn || easing || + typeof speed === "function" && speed, + duration: speed, + easing: fn && easing || easing && typeof easing !== "function" && easing + }; + + // Go to the end state if fx are off + if ( jQuery.fx.off ) { + opt.duration = 0; + + } else { + if ( typeof opt.duration !== "number" ) { + if ( opt.duration in jQuery.fx.speeds ) { + opt.duration = jQuery.fx.speeds[ opt.duration ]; + + } else { + opt.duration = jQuery.fx.speeds._default; + } + } + } + + // Normalize opt.queue - true/undefined/null -> "fx" + if ( opt.queue == null || opt.queue === true ) { + opt.queue = "fx"; + } + + // Queueing + opt.old = opt.complete; + + opt.complete = function() { + if ( typeof opt.old === "function" ) { + opt.old.call( this ); + } + + if ( opt.queue ) { + jQuery.dequeue( this, opt.queue ); + } + }; + + return opt; +}; + +jQuery.fn.extend( { + fadeTo: function( speed, to, easing, callback ) { + + // Show any hidden elements after setting opacity to 0 + return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show() + + // Animate to the value specified + .end().animate( { opacity: to }, speed, easing, callback ); + }, + animate: function( prop, speed, easing, callback ) { + var empty = jQuery.isEmptyObject( prop ), + optall = jQuery.speed( speed, easing, callback ), + doAnimation = function() { + + // Operate on a copy of prop so per-property easing won't be lost + var anim = Animation( this, jQuery.extend( {}, prop ), optall ); + + // Empty animations, or finishing resolves immediately + if ( empty || dataPriv.get( this, "finish" ) ) { + anim.stop( true ); + } + }; + + doAnimation.finish = doAnimation; + + return empty || optall.queue === false ? + this.each( doAnimation ) : + this.queue( optall.queue, doAnimation ); + }, + stop: function( type, clearQueue, gotoEnd ) { + var stopQueue = function( hooks ) { + var stop = hooks.stop; + delete hooks.stop; + stop( gotoEnd ); + }; + + if ( typeof type !== "string" ) { + gotoEnd = clearQueue; + clearQueue = type; + type = undefined; + } + if ( clearQueue ) { + this.queue( type || "fx", [] ); + } + + return this.each( function() { + var dequeue = true, + index = type != null && type + "queueHooks", + timers = jQuery.timers, + data = dataPriv.get( this ); + + if ( index ) { + if ( data[ index ] && data[ index ].stop ) { + stopQueue( data[ index ] ); + } + } else { + for ( index in data ) { + if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) { + stopQueue( data[ index ] ); + } + } + } + + for ( index = timers.length; index--; ) { + if ( timers[ index ].elem === this && + ( type == null || timers[ index ].queue === type ) ) { + + timers[ index ].anim.stop( gotoEnd ); + dequeue = false; + timers.splice( index, 1 ); + } + } + + // Start the next in the queue if the last step wasn't forced. + // Timers currently will call their complete callbacks, which + // will dequeue but only if they were gotoEnd. + if ( dequeue || !gotoEnd ) { + jQuery.dequeue( this, type ); + } + } ); + }, + finish: function( type ) { + if ( type !== false ) { + type = type || "fx"; + } + return this.each( function() { + var index, + data = dataPriv.get( this ), + queue = data[ type + "queue" ], + hooks = data[ type + "queueHooks" ], + timers = jQuery.timers, + length = queue ? queue.length : 0; + + // Enable finishing flag on private data + data.finish = true; + + // Empty the queue first + jQuery.queue( this, type, [] ); + + if ( hooks && hooks.stop ) { + hooks.stop.call( this, true ); + } + + // Look for any active animations, and finish them + for ( index = timers.length; index--; ) { + if ( timers[ index ].elem === this && timers[ index ].queue === type ) { + timers[ index ].anim.stop( true ); + timers.splice( index, 1 ); + } + } + + // Look for any animations in the old queue and finish them + for ( index = 0; index < length; index++ ) { + if ( queue[ index ] && queue[ index ].finish ) { + queue[ index ].finish.call( this ); + } + } + + // Turn off finishing flag + delete data.finish; + } ); + } +} ); + +jQuery.each( [ "toggle", "show", "hide" ], function( _i, name ) { + var cssFn = jQuery.fn[ name ]; + jQuery.fn[ name ] = function( speed, easing, callback ) { + return speed == null || typeof speed === "boolean" ? + cssFn.apply( this, arguments ) : + this.animate( genFx( name, true ), speed, easing, callback ); + }; +} ); + +// Generate shortcuts for custom animations +jQuery.each( { + slideDown: genFx( "show" ), + slideUp: genFx( "hide" ), + slideToggle: genFx( "toggle" ), + fadeIn: { opacity: "show" }, + fadeOut: { opacity: "hide" }, + fadeToggle: { opacity: "toggle" } +}, function( name, props ) { + jQuery.fn[ name ] = function( speed, easing, callback ) { + return this.animate( props, speed, easing, callback ); + }; +} ); + +jQuery.timers = []; +jQuery.fx.tick = function() { + var timer, + i = 0, + timers = jQuery.timers; + + fxNow = Date.now(); + + for ( ; i < timers.length; i++ ) { + timer = timers[ i ]; + + // Run the timer and safely remove it when done (allowing for external removal) + if ( !timer() && timers[ i ] === timer ) { + timers.splice( i--, 1 ); + } + } + + if ( !timers.length ) { + jQuery.fx.stop(); + } + fxNow = undefined; +}; + +jQuery.fx.timer = function( timer ) { + jQuery.timers.push( timer ); + jQuery.fx.start(); +}; + +jQuery.fx.start = function() { + if ( inProgress ) { + return; + } + + inProgress = true; + schedule(); +}; + +jQuery.fx.stop = function() { + inProgress = null; +}; + +jQuery.fx.speeds = { + slow: 600, + fast: 200, + + // Default speed + _default: 400 +}; + +// Based off of the plugin by Clint Helfers, with permission. +jQuery.fn.delay = function( time, type ) { + time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; + type = type || "fx"; + + return this.queue( type, function( next, hooks ) { + var timeout = window.setTimeout( next, time ); + hooks.stop = function() { + window.clearTimeout( timeout ); + }; + } ); +}; + +var rfocusable = /^(?:input|select|textarea|button)$/i, + rclickable = /^(?:a|area)$/i; + +jQuery.fn.extend( { + prop: function( name, value ) { + return access( this, jQuery.prop, name, value, arguments.length > 1 ); + }, + + removeProp: function( name ) { + return this.each( function() { + delete this[ jQuery.propFix[ name ] || name ]; + } ); + } +} ); + +jQuery.extend( { + prop: function( elem, name, value ) { + var ret, hooks, + nType = elem.nodeType; + + // Don't get/set properties on text, comment and attribute nodes + if ( nType === 3 || nType === 8 || nType === 2 ) { + return; + } + + if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { + + // Fix name and attach hooks + name = jQuery.propFix[ name ] || name; + hooks = jQuery.propHooks[ name ]; + } + + if ( value !== undefined ) { + if ( hooks && "set" in hooks && + ( ret = hooks.set( elem, value, name ) ) !== undefined ) { + return ret; + } + + return ( elem[ name ] = value ); + } + + if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { + return ret; + } + + return elem[ name ]; + }, + + propHooks: { + tabIndex: { + get: function( elem ) { + + // Support: IE <=9 - 11+ + // elem.tabIndex doesn't always return the + // correct value when it hasn't been explicitly set + // Use proper attribute retrieval (trac-12072) + var tabindex = elem.getAttribute( "tabindex" ); + + if ( tabindex ) { + return parseInt( tabindex, 10 ); + } + + if ( + rfocusable.test( elem.nodeName ) || + + // href-less anchor's `tabIndex` property value is `0` and + // the `tabindex` attribute value: `null`. We want `-1`. + rclickable.test( elem.nodeName ) && elem.href + ) { + return 0; + } + + return -1; + } + } + }, + + propFix: { + "for": "htmlFor", + "class": "className" + } +} ); + +// Support: IE <=11+ +// Accessing the selectedIndex property forces the browser to respect +// setting selected on the option. The getter ensures a default option +// is selected when in an optgroup. ESLint rule "no-unused-expressions" +// is disabled for this code since it considers such accessions noop. +if ( isIE ) { + jQuery.propHooks.selected = { + get: function( elem ) { + + var parent = elem.parentNode; + if ( parent && parent.parentNode ) { + // eslint-disable-next-line no-unused-expressions + parent.parentNode.selectedIndex; + } + return null; + }, + set: function( elem ) { + + + var parent = elem.parentNode; + if ( parent ) { + // eslint-disable-next-line no-unused-expressions + parent.selectedIndex; + + if ( parent.parentNode ) { + // eslint-disable-next-line no-unused-expressions + parent.parentNode.selectedIndex; + } + } + } + }; +} + +jQuery.each( [ + "tabIndex", + "readOnly", + "maxLength", + "cellSpacing", + "cellPadding", + "rowSpan", + "colSpan", + "useMap", + "frameBorder", + "contentEditable" +], function() { + jQuery.propFix[ this.toLowerCase() ] = this; +} ); + +// Strip and collapse whitespace according to HTML spec +// https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace +function stripAndCollapse( value ) { + var tokens = value.match( rnothtmlwhite ) || []; + return tokens.join( " " ); +} + +function getClass( elem ) { + return elem.getAttribute && elem.getAttribute( "class" ) || ""; +} + +function classesToArray( value ) { + if ( Array.isArray( value ) ) { + return value; + } + if ( typeof value === "string" ) { + return value.match( rnothtmlwhite ) || []; + } + return []; +} + +jQuery.fn.extend( { + addClass: function( value ) { + var classNames, cur, curValue, className, i, finalValue; + + if ( typeof value === "function" ) { + return this.each( function( j ) { + jQuery( this ).addClass( value.call( this, j, getClass( this ) ) ); + } ); + } + + classNames = classesToArray( value ); + + if ( classNames.length ) { + return this.each( function() { + curValue = getClass( this ); + cur = this.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); + + if ( cur ) { + for ( i = 0; i < classNames.length; i++ ) { + className = classNames[ i ]; + if ( cur.indexOf( " " + className + " " ) < 0 ) { + cur += className + " "; + } + } + + // Only assign if different to avoid unneeded rendering. + finalValue = stripAndCollapse( cur ); + if ( curValue !== finalValue ) { + this.setAttribute( "class", finalValue ); + } + } + } ); + } + + return this; + }, + + removeClass: function( value ) { + var classNames, cur, curValue, className, i, finalValue; + + if ( typeof value === "function" ) { + return this.each( function( j ) { + jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) ); + } ); + } + + if ( !arguments.length ) { + return this.attr( "class", "" ); + } + + classNames = classesToArray( value ); + + if ( classNames.length ) { + return this.each( function() { + curValue = getClass( this ); + + // This expression is here for better compressibility (see addClass) + cur = this.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); + + if ( cur ) { + for ( i = 0; i < classNames.length; i++ ) { + className = classNames[ i ]; + + // Remove *all* instances + while ( cur.indexOf( " " + className + " " ) > -1 ) { + cur = cur.replace( " " + className + " ", " " ); + } + } + + // Only assign if different to avoid unneeded rendering. + finalValue = stripAndCollapse( cur ); + if ( curValue !== finalValue ) { + this.setAttribute( "class", finalValue ); + } + } + } ); + } + + return this; + }, + + toggleClass: function( value, stateVal ) { + var classNames, className, i, self; + + if ( typeof value === "function" ) { + return this.each( function( i ) { + jQuery( this ).toggleClass( + value.call( this, i, getClass( this ), stateVal ), + stateVal + ); + } ); + } + + if ( typeof stateVal === "boolean" ) { + return stateVal ? this.addClass( value ) : this.removeClass( value ); + } + + classNames = classesToArray( value ); + + if ( classNames.length ) { + return this.each( function() { + + // Toggle individual class names + self = jQuery( this ); + + for ( i = 0; i < classNames.length; i++ ) { + className = classNames[ i ]; + + // Check each className given, space separated list + if ( self.hasClass( className ) ) { + self.removeClass( className ); + } else { + self.addClass( className ); + } + } + } ); + } + + return this; + }, + + hasClass: function( selector ) { + var className, elem, + i = 0; + + className = " " + selector + " "; + while ( ( elem = this[ i++ ] ) ) { + if ( elem.nodeType === 1 && + ( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) { + return true; + } + } + + return false; + } +} ); + +jQuery.fn.extend( { + val: function( value ) { + var hooks, ret, valueIsFunction, + elem = this[ 0 ]; + + if ( !arguments.length ) { + if ( elem ) { + hooks = jQuery.valHooks[ elem.type ] || + jQuery.valHooks[ elem.nodeName.toLowerCase() ]; + + if ( hooks && + "get" in hooks && + ( ret = hooks.get( elem, "value" ) ) !== undefined + ) { + return ret; + } + + ret = elem.value; + + // Handle cases where value is null/undef or number + return ret == null ? "" : ret; + } + + return; + } + + valueIsFunction = typeof value === "function"; + + return this.each( function( i ) { + var val; + + if ( this.nodeType !== 1 ) { + return; + } + + if ( valueIsFunction ) { + val = value.call( this, i, jQuery( this ).val() ); + } else { + val = value; + } + + // Treat null/undefined as ""; convert numbers to string + if ( val == null ) { + val = ""; + + } else if ( typeof val === "number" ) { + val += ""; + + } else if ( Array.isArray( val ) ) { + val = jQuery.map( val, function( value ) { + return value == null ? "" : value + ""; + } ); + } + + hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; + + // If set returns undefined, fall back to normal setting + if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) { + this.value = val; + } + } ); + } +} ); + +jQuery.extend( { + valHooks: { + select: { + get: function( elem ) { + var value, option, i, + options = elem.options, + index = elem.selectedIndex, + one = elem.type === "select-one", + values = one ? null : [], + max = one ? index + 1 : options.length; + + if ( index < 0 ) { + i = max; + + } else { + i = one ? index : 0; + } + + // Loop through all the selected options + for ( ; i < max; i++ ) { + option = options[ i ]; + + if ( option.selected && + + // Don't return options that are disabled or in a disabled optgroup + !option.disabled && + ( !option.parentNode.disabled || + !nodeName( option.parentNode, "optgroup" ) ) ) { + + // Get the specific value for the option + value = jQuery( option ).val(); + + // We don't need an array for one selects + if ( one ) { + return value; + } + + // Multi-Selects return an array + values.push( value ); + } + } + + return values; + }, + + set: function( elem, value ) { + var optionSet, option, + options = elem.options, + values = jQuery.makeArray( value ), + i = options.length; + + while ( i-- ) { + option = options[ i ]; + + if ( ( option.selected = + jQuery.inArray( jQuery( option ).val(), values ) > -1 + ) ) { + optionSet = true; + } + } + + // Force browsers to behave consistently when non-matching value is set + if ( !optionSet ) { + elem.selectedIndex = -1; + } + return values; + } + } + } +} ); + +if ( isIE ) { + jQuery.valHooks.option = { + get: function( elem ) { + + var val = elem.getAttribute( "value" ); + return val != null ? + val : + + // Support: IE <=10 - 11+ + // option.text throws exceptions (trac-14686, trac-14858) + // Strip and collapse whitespace + // https://html.spec.whatwg.org/#strip-and-collapse-whitespace + stripAndCollapse( jQuery.text( elem ) ); + } + }; +} + +// Radios and checkboxes getter/setter +jQuery.each( [ "radio", "checkbox" ], function() { + jQuery.valHooks[ this ] = { + set: function( elem, value ) { + if ( Array.isArray( value ) ) { + return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 ); + } + } + }; +} ); + +var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, + stopPropagationCallback = function( e ) { + e.stopPropagation(); + }; + +jQuery.extend( jQuery.event, { + + trigger: function( event, data, elem, onlyHandlers ) { + + var i, cur, tmp, bubbleType, ontype, handle, special, lastElement, + eventPath = [ elem || document$1 ], + type = hasOwn.call( event, "type" ) ? event.type : event, + namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : []; + + cur = lastElement = tmp = elem = elem || document$1; + + // Don't do events on text and comment nodes + if ( elem.nodeType === 3 || elem.nodeType === 8 ) { + return; + } + + // focus/blur morphs to focusin/out; ensure we're not firing them right now + if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { + return; + } + + if ( type.indexOf( "." ) > -1 ) { + + // Namespaced trigger; create a regexp to match event type in handle() + namespaces = type.split( "." ); + type = namespaces.shift(); + namespaces.sort(); + } + ontype = type.indexOf( ":" ) < 0 && "on" + type; + + // Caller can pass in a jQuery.Event object, Object, or just an event type string + event = event[ jQuery.expando ] ? + event : + new jQuery.Event( type, typeof event === "object" && event ); + + // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) + event.isTrigger = onlyHandlers ? 2 : 3; + event.namespace = namespaces.join( "." ); + event.rnamespace = event.namespace ? + new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) : + null; + + // Clean up the event in case it is being reused + event.result = undefined; + if ( !event.target ) { + event.target = elem; + } + + // Clone any incoming data and prepend the event, creating the handler arg list + data = data == null ? + [ event ] : + jQuery.makeArray( data, [ event ] ); + + // Allow special events to draw outside the lines + special = jQuery.event.special[ type ] || {}; + if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { + return; + } + + // Determine event propagation path in advance, per W3C events spec (trac-9951) + // Bubble up to document, then to window; watch for a global ownerDocument var (trac-9724) + if ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) { + + bubbleType = special.delegateType || type; + if ( !rfocusMorph.test( bubbleType + type ) ) { + cur = cur.parentNode; + } + for ( ; cur; cur = cur.parentNode ) { + eventPath.push( cur ); + tmp = cur; + } + + // Only add window if we got to document (e.g., not plain obj or detached DOM) + if ( tmp === ( elem.ownerDocument || document$1 ) ) { + eventPath.push( tmp.defaultView || tmp.parentWindow || window ); + } + } + + // Fire handlers on the event path + i = 0; + while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) { + lastElement = cur; + event.type = i > 1 ? + bubbleType : + special.bindType || type; + + // jQuery handler + handle = ( dataPriv.get( cur, "events" ) || Object.create( null ) )[ event.type ] && + dataPriv.get( cur, "handle" ); + if ( handle ) { + handle.apply( cur, data ); + } + + // Native handler + handle = ontype && cur[ ontype ]; + if ( handle && handle.apply && acceptData( cur ) ) { + event.result = handle.apply( cur, data ); + if ( event.result === false ) { + event.preventDefault(); + } + } + } + event.type = type; + + // If nobody prevented the default action, do it now + if ( !onlyHandlers && !event.isDefaultPrevented() ) { + + if ( ( !special._default || + special._default.apply( eventPath.pop(), data ) === false ) && + acceptData( elem ) ) { + + // Call a native DOM method on the target with the same name as the event. + // Don't do default actions on window, that's where global variables be (trac-6170) + if ( ontype && typeof elem[ type ] === "function" && !isWindow( elem ) ) { + + // Don't re-trigger an onFOO event when we call its FOO() method + tmp = elem[ ontype ]; + + if ( tmp ) { + elem[ ontype ] = null; + } + + // Prevent re-triggering of the same event, since we already bubbled it above + jQuery.event.triggered = type; + + if ( event.isPropagationStopped() ) { + lastElement.addEventListener( type, stopPropagationCallback ); + } + + elem[ type ](); + + if ( event.isPropagationStopped() ) { + lastElement.removeEventListener( type, stopPropagationCallback ); + } + + jQuery.event.triggered = undefined; + + if ( tmp ) { + elem[ ontype ] = tmp; + } + } + } + } + + return event.result; + }, + + // Piggyback on a donor event to simulate a different one + // Used only for `focus(in | out)` events + simulate: function( type, elem, event ) { + var e = jQuery.extend( + new jQuery.Event(), + event, + { + type: type, + isSimulated: true + } + ); + + jQuery.event.trigger( e, null, elem ); + } + +} ); + +jQuery.fn.extend( { + + trigger: function( type, data ) { + return this.each( function() { + jQuery.event.trigger( type, data, this ); + } ); + }, + triggerHandler: function( type, data ) { + var elem = this[ 0 ]; + if ( elem ) { + return jQuery.event.trigger( type, data, elem, true ); + } + } +} ); + +var location = window.location; + +var nonce = { guid: Date.now() }; + +var rquery = /\?/; + +// Cross-browser xml parsing +jQuery.parseXML = function( data ) { + var xml, parserErrorElem; + if ( !data || typeof data !== "string" ) { + return null; + } + + // Support: IE 9 - 11+ + // IE throws on parseFromString with invalid input. + try { + xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" ); + } catch ( e ) {} + + parserErrorElem = xml && xml.getElementsByTagName( "parsererror" )[ 0 ]; + if ( !xml || parserErrorElem ) { + jQuery.error( "Invalid XML: " + ( + parserErrorElem ? + jQuery.map( parserErrorElem.childNodes, function( el ) { + return el.textContent; + } ).join( "\n" ) : + data + ) ); + } + return xml; +}; + +var + rbracket = /\[\]$/, + rCRLF = /\r?\n/g, + rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i, + rsubmittable = /^(?:input|select|textarea|keygen)/i; + +function buildParams( prefix, obj, traditional, add ) { + var name; + + if ( Array.isArray( obj ) ) { + + // Serialize array item. + jQuery.each( obj, function( i, v ) { + if ( traditional || rbracket.test( prefix ) ) { + + // Treat each array item as a scalar. + add( prefix, v ); + + } else { + + // Item is non-scalar (array or object), encode its numeric index. + buildParams( + prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]", + v, + traditional, + add + ); + } + } ); + + } else if ( !traditional && toType( obj ) === "object" ) { + + // Serialize object item. + for ( name in obj ) { + buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add ); + } + + } else { + + // Serialize scalar item. + add( prefix, obj ); + } +} + +// Serialize an array of form elements or a set of +// key/values into a query string +jQuery.param = function( a, traditional ) { + var prefix, + s = [], + add = function( key, valueOrFunction ) { + + // If value is a function, invoke it and use its return value + var value = typeof valueOrFunction === "function" ? + valueOrFunction() : + valueOrFunction; + + s[ s.length ] = encodeURIComponent( key ) + "=" + + encodeURIComponent( value == null ? "" : value ); + }; + + if ( a == null ) { + return ""; + } + + // If an array was passed in, assume that it is an array of form elements. + if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) { + + // Serialize the form elements + jQuery.each( a, function() { + add( this.name, this.value ); + } ); + + } else { + + // If traditional, encode the "old" way (the way 1.3.2 or older + // did it), otherwise encode params recursively. + for ( prefix in a ) { + buildParams( prefix, a[ prefix ], traditional, add ); + } + } + + // Return the resulting serialization + return s.join( "&" ); +}; + +jQuery.fn.extend( { + serialize: function() { + return jQuery.param( this.serializeArray() ); + }, + serializeArray: function() { + return this.map( function() { + + // Can add propHook for "elements" to filter or add form elements + var elements = jQuery.prop( this, "elements" ); + return elements ? jQuery.makeArray( elements ) : this; + } ).filter( function() { + var type = this.type; + + // Use .is( ":disabled" ) so that fieldset[disabled] works + return this.name && !jQuery( this ).is( ":disabled" ) && + rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) && + ( this.checked || !rcheckableType.test( type ) ); + } ).map( function( _i, elem ) { + var val = jQuery( this ).val(); + + if ( val == null ) { + return null; + } + + if ( Array.isArray( val ) ) { + return jQuery.map( val, function( val ) { + return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; + } ); + } + + return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; + } ).get(); + } +} ); + +var + r20 = /%20/g, + rhash = /#.*$/, + rantiCache = /([?&])_=[^&]*/, + rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg, + + // trac-7653, trac-8125, trac-8152: local protocol detection + rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/, + rnoContent = /^(?:GET|HEAD)$/, + rprotocol = /^\/\//, + + /* Prefilters + * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example) + * 2) These are called: + * - BEFORE asking for a transport + * - AFTER param serialization (s.data is a string if s.processData is true) + * 3) key is the dataType + * 4) the catchall symbol "*" can be used + * 5) execution will start with transport dataType and THEN continue down to "*" if needed + */ + prefilters = {}, + + /* Transports bindings + * 1) key is the dataType + * 2) the catchall symbol "*" can be used + * 3) selection will start with transport dataType and THEN go to "*" if needed + */ + transports = {}, + + // Avoid comment-prolog char sequence (trac-10098); must appease lint and evade compression + allTypes = "*/".concat( "*" ), + + // Anchor tag for parsing the document origin + originAnchor = document$1.createElement( "a" ); + +originAnchor.href = location.href; + +// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport +function addToPrefiltersOrTransports( structure ) { + + // dataTypeExpression is optional and defaults to "*" + return function( dataTypeExpression, func ) { + + if ( typeof dataTypeExpression !== "string" ) { + func = dataTypeExpression; + dataTypeExpression = "*"; + } + + var dataType, + i = 0, + dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || []; + + if ( typeof func === "function" ) { + + // For each dataType in the dataTypeExpression + while ( ( dataType = dataTypes[ i++ ] ) ) { + + // Prepend if requested + if ( dataType[ 0 ] === "+" ) { + dataType = dataType.slice( 1 ) || "*"; + ( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func ); + + // Otherwise append + } else { + ( structure[ dataType ] = structure[ dataType ] || [] ).push( func ); + } + } + } + }; +} + +// Base inspection function for prefilters and transports +function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) { + + var inspected = {}, + seekingTransport = ( structure === transports ); + + function inspect( dataType ) { + var selected; + inspected[ dataType ] = true; + jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) { + var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR ); + if ( typeof dataTypeOrTransport === "string" && + !seekingTransport && !inspected[ dataTypeOrTransport ] ) { + + options.dataTypes.unshift( dataTypeOrTransport ); + inspect( dataTypeOrTransport ); + return false; + } else if ( seekingTransport ) { + return !( selected = dataTypeOrTransport ); + } + } ); + return selected; + } + + return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" ); +} + +// A special extend for ajax options +// that takes "flat" options (not to be deep extended) +// Fixes trac-9887 +function ajaxExtend( target, src ) { + var key, deep, + flatOptions = jQuery.ajaxSettings.flatOptions || {}; + + for ( key in src ) { + if ( src[ key ] !== undefined ) { + ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ]; + } + } + if ( deep ) { + jQuery.extend( true, target, deep ); + } + + return target; +} + +/* Handles responses to an ajax request: + * - finds the right dataType (mediates between content-type and expected dataType) + * - returns the corresponding response + */ +function ajaxHandleResponses( s, jqXHR, responses ) { + + var ct, type, finalDataType, firstDataType, + contents = s.contents, + dataTypes = s.dataTypes; + + // Remove auto dataType and get content-type in the process + while ( dataTypes[ 0 ] === "*" ) { + dataTypes.shift(); + if ( ct === undefined ) { + ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" ); + } + } + + // Check if we're dealing with a known content-type + if ( ct ) { + for ( type in contents ) { + if ( contents[ type ] && contents[ type ].test( ct ) ) { + dataTypes.unshift( type ); + break; + } + } + } + + // Check to see if we have a response for the expected dataType + if ( dataTypes[ 0 ] in responses ) { + finalDataType = dataTypes[ 0 ]; + } else { + + // Try convertible dataTypes + for ( type in responses ) { + if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) { + finalDataType = type; + break; + } + if ( !firstDataType ) { + firstDataType = type; + } + } + + // Or just use first one + finalDataType = finalDataType || firstDataType; + } + + // If we found a dataType + // We add the dataType to the list if needed + // and return the corresponding response + if ( finalDataType ) { + if ( finalDataType !== dataTypes[ 0 ] ) { + dataTypes.unshift( finalDataType ); + } + return responses[ finalDataType ]; + } +} + +/* Chain conversions given the request and the original response + * Also sets the responseXXX fields on the jqXHR instance + */ +function ajaxConvert( s, response, jqXHR, isSuccess ) { + var conv2, current, conv, tmp, prev, + converters = {}, + + // Work with a copy of dataTypes in case we need to modify it for conversion + dataTypes = s.dataTypes.slice(); + + // Create converters map with lowercased keys + if ( dataTypes[ 1 ] ) { + for ( conv in s.converters ) { + converters[ conv.toLowerCase() ] = s.converters[ conv ]; + } + } + + current = dataTypes.shift(); + + // Convert to each sequential dataType + while ( current ) { + + if ( s.responseFields[ current ] ) { + jqXHR[ s.responseFields[ current ] ] = response; + } + + // Apply the dataFilter if provided + if ( !prev && isSuccess && s.dataFilter ) { + response = s.dataFilter( response, s.dataType ); + } + + prev = current; + current = dataTypes.shift(); + + if ( current ) { + + // There's only work to do if current dataType is non-auto + if ( current === "*" ) { + + current = prev; + + // Convert response if prev dataType is non-auto and differs from current + } else if ( prev !== "*" && prev !== current ) { + + // Seek a direct converter + conv = converters[ prev + " " + current ] || converters[ "* " + current ]; + + // If none found, seek a pair + if ( !conv ) { + for ( conv2 in converters ) { + + // If conv2 outputs current + tmp = conv2.split( " " ); + if ( tmp[ 1 ] === current ) { + + // If prev can be converted to accepted input + conv = converters[ prev + " " + tmp[ 0 ] ] || + converters[ "* " + tmp[ 0 ] ]; + if ( conv ) { + + // Condense equivalence converters + if ( conv === true ) { + conv = converters[ conv2 ]; + + // Otherwise, insert the intermediate dataType + } else if ( converters[ conv2 ] !== true ) { + current = tmp[ 0 ]; + dataTypes.unshift( tmp[ 1 ] ); + } + break; + } + } + } + } + + // Apply converter (if not an equivalence) + if ( conv !== true ) { + + // Unless errors are allowed to bubble, catch and return them + if ( conv && s.throws ) { + response = conv( response ); + } else { + try { + response = conv( response ); + } catch ( e ) { + return { + state: "parsererror", + error: conv ? e : "No conversion from " + prev + " to " + current + }; + } + } + } + } + } + } + + return { state: "success", data: response }; +} + +jQuery.extend( { + + // Counter for holding the number of active queries + active: 0, + + // Last-Modified header cache for next request + lastModified: {}, + etag: {}, + + ajaxSettings: { + url: location.href, + type: "GET", + isLocal: rlocalProtocol.test( location.protocol ), + global: true, + processData: true, + async: true, + contentType: "application/x-www-form-urlencoded; charset=UTF-8", + + /* + timeout: 0, + data: null, + dataType: null, + username: null, + password: null, + cache: null, + throws: false, + traditional: false, + headers: {}, + */ + + accepts: { + "*": allTypes, + text: "text/plain", + html: "text/html", + xml: "application/xml, text/xml", + json: "application/json, text/javascript" + }, + + contents: { + xml: /\bxml\b/, + html: /\bhtml/, + json: /\bjson\b/ + }, + + responseFields: { + xml: "responseXML", + text: "responseText", + json: "responseJSON" + }, + + // Data converters + // Keys separate source (or catchall "*") and destination types with a single space + converters: { + + // Convert anything to text + "* text": String, + + // Text to html (true = no transformation) + "text html": true, + + // Evaluate text as a json expression + "text json": JSON.parse, + + // Parse text as xml + "text xml": jQuery.parseXML + }, + + // For options that shouldn't be deep extended: + // you can add your own custom options here if + // and when you create one that shouldn't be + // deep extended (see ajaxExtend) + flatOptions: { + url: true, + context: true + } + }, + + // Creates a full fledged settings object into target + // with both ajaxSettings and settings fields. + // If target is omitted, writes into ajaxSettings. + ajaxSetup: function( target, settings ) { + return settings ? + + // Building a settings object + ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) : + + // Extending ajaxSettings + ajaxExtend( jQuery.ajaxSettings, target ); + }, + + ajaxPrefilter: addToPrefiltersOrTransports( prefilters ), + ajaxTransport: addToPrefiltersOrTransports( transports ), + + // Main method + ajax: function( url, options ) { + + // If url is an object, simulate pre-1.5 signature + if ( typeof url === "object" ) { + options = url; + url = undefined; + } + + // Force options to be an object + options = options || {}; + + var transport, + + // URL without anti-cache param + cacheURL, + + // Response headers + responseHeadersString, + responseHeaders, + + // timeout handle + timeoutTimer, + + // Url cleanup var + urlAnchor, + + // Request state (becomes false upon send and true upon completion) + completed, + + // To know if global events are to be dispatched + fireGlobals, + + // Loop variable + i, + + // uncached part of the url + uncached, + + // Create the final options object + s = jQuery.ajaxSetup( {}, options ), + + // Callbacks context + callbackContext = s.context || s, + + // Context for global events is callbackContext if it is a DOM node or jQuery collection + globalEventContext = s.context && + ( callbackContext.nodeType || callbackContext.jquery ) ? + jQuery( callbackContext ) : + jQuery.event, + + // Deferreds + deferred = jQuery.Deferred(), + completeDeferred = jQuery.Callbacks( "once memory" ), + + // Status-dependent callbacks + statusCode = s.statusCode || {}, + + // Headers (they are sent all at once) + requestHeaders = {}, + requestHeadersNames = {}, + + // Default abort message + strAbort = "canceled", + + // Fake xhr + jqXHR = { + readyState: 0, + + // Builds headers hashtable if needed + getResponseHeader: function( key ) { + var match; + if ( completed ) { + if ( !responseHeaders ) { + responseHeaders = {}; + while ( ( match = rheaders.exec( responseHeadersString ) ) ) { + + // Support: IE 11+ + // `getResponseHeader( key )` in IE doesn't combine all header + // values for the provided key into a single result with values + // joined by commas as other browsers do. Instead, it returns + // them on separate lines. + responseHeaders[ match[ 1 ].toLowerCase() + " " ] = + ( responseHeaders[ match[ 1 ].toLowerCase() + " " ] || [] ) + .concat( match[ 2 ] ); + } + } + match = responseHeaders[ key.toLowerCase() + " " ]; + } + return match == null ? null : match.join( ", " ); + }, + + // Raw string + getAllResponseHeaders: function() { + return completed ? responseHeadersString : null; + }, + + // Caches the header + setRequestHeader: function( name, value ) { + if ( completed == null ) { + name = requestHeadersNames[ name.toLowerCase() ] = + requestHeadersNames[ name.toLowerCase() ] || name; + requestHeaders[ name ] = value; + } + return this; + }, + + // Overrides response content-type header + overrideMimeType: function( type ) { + if ( completed == null ) { + s.mimeType = type; + } + return this; + }, + + // Status-dependent callbacks + statusCode: function( map ) { + var code; + if ( map ) { + if ( completed ) { + + // Execute the appropriate callbacks + jqXHR.always( map[ jqXHR.status ] ); + } else { + + // Lazy-add the new callbacks in a way that preserves old ones + for ( code in map ) { + statusCode[ code ] = [ statusCode[ code ], map[ code ] ]; + } + } + } + return this; + }, + + // Cancel the request + abort: function( statusText ) { + var finalText = statusText || strAbort; + if ( transport ) { + transport.abort( finalText ); + } + done( 0, finalText ); + return this; + } + }; + + // Attach deferreds + deferred.promise( jqXHR ); + + // Add protocol if not provided (prefilters might expect it) + // Handle falsy url in the settings object (trac-10093: consistency with old signature) + // We also use the url parameter if available + s.url = ( ( url || s.url || location.href ) + "" ) + .replace( rprotocol, location.protocol + "//" ); + + // Alias method option to type as per ticket trac-12004 + s.type = options.method || options.type || s.method || s.type; + + // Extract dataTypes list + s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ]; + + // A cross-domain request is in order when the origin doesn't match the current origin. + if ( s.crossDomain == null ) { + urlAnchor = document$1.createElement( "a" ); + + // Support: IE <=8 - 11+ + // IE throws exception on accessing the href property if url is malformed, + // e.g. http://example.com:80x/ + try { + urlAnchor.href = s.url; + + // Support: IE <=8 - 11+ + // Anchor's host property isn't correctly set when s.url is relative + urlAnchor.href = urlAnchor.href; + s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !== + urlAnchor.protocol + "//" + urlAnchor.host; + } catch ( e ) { + + // If there is an error parsing the URL, assume it is crossDomain, + // it can be rejected by the transport if it is invalid + s.crossDomain = true; + } + } + + // Apply prefilters + inspectPrefiltersOrTransports( prefilters, s, options, jqXHR ); + + // Convert data if not already a string + if ( s.data && s.processData && typeof s.data !== "string" ) { + s.data = jQuery.param( s.data, s.traditional ); + } + + // If request was aborted inside a prefilter, stop there + if ( completed ) { + return jqXHR; + } + + // We can fire global events as of now if asked to + // Don't fire events if jQuery.event is undefined in an ESM-usage scenario (trac-15118) + fireGlobals = jQuery.event && s.global; + + // Watch for a new set of requests + if ( fireGlobals && jQuery.active++ === 0 ) { + jQuery.event.trigger( "ajaxStart" ); + } + + // Uppercase the type + s.type = s.type.toUpperCase(); + + // Determine if request has content + s.hasContent = !rnoContent.test( s.type ); + + // Save the URL in case we're toying with the If-Modified-Since + // and/or If-None-Match header later on + // Remove hash to simplify url manipulation + cacheURL = s.url.replace( rhash, "" ); + + // More options handling for requests with no content + if ( !s.hasContent ) { + + // Remember the hash so we can put it back + uncached = s.url.slice( cacheURL.length ); + + // If data is available and should be processed, append data to url + if ( s.data && ( s.processData || typeof s.data === "string" ) ) { + cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data; + + // trac-9682: remove data so that it's not used in an eventual retry + delete s.data; + } + + // Add or update anti-cache param if needed + if ( s.cache === false ) { + cacheURL = cacheURL.replace( rantiCache, "$1" ); + uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + + ( nonce.guid++ ) + uncached; + } + + // Put hash and anti-cache on the URL that will be requested (gh-1732) + s.url = cacheURL + uncached; + + // Change '%20' to '+' if this is encoded form body content (gh-2658) + } else if ( s.data && s.processData && + ( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) { + s.data = s.data.replace( r20, "+" ); + } + + // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. + if ( s.ifModified ) { + if ( jQuery.lastModified[ cacheURL ] ) { + jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] ); + } + if ( jQuery.etag[ cacheURL ] ) { + jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] ); + } + } + + // Set the correct header, if data is being sent + if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) { + jqXHR.setRequestHeader( "Content-Type", s.contentType ); + } + + // Set the Accepts header for the server, depending on the dataType + jqXHR.setRequestHeader( + "Accept", + s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ? + s.accepts[ s.dataTypes[ 0 ] ] + + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) : + s.accepts[ "*" ] + ); + + // Check for headers option + for ( i in s.headers ) { + jqXHR.setRequestHeader( i, s.headers[ i ] ); + } + + // Allow custom headers/mimetypes and early abort + if ( s.beforeSend && + ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) { + + // Abort if not done already and return + return jqXHR.abort(); + } + + // Aborting is no longer a cancellation + strAbort = "abort"; + + // Install callbacks on deferreds + completeDeferred.add( s.complete ); + jqXHR.done( s.success ); + jqXHR.fail( s.error ); + + // Get transport + transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR ); + + // If no transport, we auto-abort + if ( !transport ) { + done( -1, "No Transport" ); + } else { + jqXHR.readyState = 1; + + // Send global event + if ( fireGlobals ) { + globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] ); + } + + // If request was aborted inside ajaxSend, stop there + if ( completed ) { + return jqXHR; + } + + // Timeout + if ( s.async && s.timeout > 0 ) { + timeoutTimer = window.setTimeout( function() { + jqXHR.abort( "timeout" ); + }, s.timeout ); + } + + try { + completed = false; + transport.send( requestHeaders, done ); + } catch ( e ) { + + // Rethrow post-completion exceptions + if ( completed ) { + throw e; + } + + // Propagate others as results + done( -1, e ); + } + } + + // Callback for when everything is done + function done( status, nativeStatusText, responses, headers ) { + var isSuccess, success, error, response, modified, + statusText = nativeStatusText; + + // Ignore repeat invocations + if ( completed ) { + return; + } + + completed = true; + + // Clear timeout if it exists + if ( timeoutTimer ) { + window.clearTimeout( timeoutTimer ); + } + + // Dereference transport for early garbage collection + // (no matter how long the jqXHR object will be used) + transport = undefined; + + // Cache response headers + responseHeadersString = headers || ""; + + // Set readyState + jqXHR.readyState = status > 0 ? 4 : 0; + + // Determine if successful + isSuccess = status >= 200 && status < 300 || status === 304; + + // Get response data + if ( responses ) { + response = ajaxHandleResponses( s, jqXHR, responses ); + } + + // Use a noop converter for missing script but not if jsonp + if ( !isSuccess && + jQuery.inArray( "script", s.dataTypes ) > -1 && + jQuery.inArray( "json", s.dataTypes ) < 0 ) { + s.converters[ "text script" ] = function() {}; + } + + // Convert no matter what (that way responseXXX fields are always set) + response = ajaxConvert( s, response, jqXHR, isSuccess ); + + // If successful, handle type chaining + if ( isSuccess ) { + + // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. + if ( s.ifModified ) { + modified = jqXHR.getResponseHeader( "Last-Modified" ); + if ( modified ) { + jQuery.lastModified[ cacheURL ] = modified; + } + modified = jqXHR.getResponseHeader( "etag" ); + if ( modified ) { + jQuery.etag[ cacheURL ] = modified; + } + } + + // if no content + if ( status === 204 || s.type === "HEAD" ) { + statusText = "nocontent"; + + // if not modified + } else if ( status === 304 ) { + statusText = "notmodified"; + + // If we have data, let's convert it + } else { + statusText = response.state; + success = response.data; + error = response.error; + isSuccess = !error; + } + } else { + + // Extract error from statusText and normalize for non-aborts + error = statusText; + if ( status || !statusText ) { + statusText = "error"; + if ( status < 0 ) { + status = 0; + } + } + } + + // Set data for the fake xhr object + jqXHR.status = status; + jqXHR.statusText = ( nativeStatusText || statusText ) + ""; + + // Success/Error + if ( isSuccess ) { + deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] ); + } else { + deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] ); + } + + // Status-dependent callbacks + jqXHR.statusCode( statusCode ); + statusCode = undefined; + + if ( fireGlobals ) { + globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError", + [ jqXHR, s, isSuccess ? success : error ] ); + } + + // Complete + completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] ); + + if ( fireGlobals ) { + globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] ); + + // Handle the global AJAX counter + if ( !( --jQuery.active ) ) { + jQuery.event.trigger( "ajaxStop" ); + } + } + } + + return jqXHR; + }, + + getJSON: function( url, data, callback ) { + return jQuery.get( url, data, callback, "json" ); + }, + + getScript: function( url, callback ) { + return jQuery.get( url, undefined, callback, "script" ); + } +} ); + +jQuery.each( [ "get", "post" ], function( _i, method ) { + jQuery[ method ] = function( url, data, callback, type ) { + + // Shift arguments if data argument was omitted. + // Handle the null callback placeholder. + if ( typeof data === "function" || data === null ) { + type = type || callback; + callback = data; + data = undefined; + } + + // The url can be an options object (which then must have .url) + return jQuery.ajax( jQuery.extend( { + url: url, + type: method, + dataType: type, + data: data, + success: callback + }, jQuery.isPlainObject( url ) && url ) ); + }; +} ); + +jQuery.ajaxPrefilter( function( s ) { + var i; + for ( i in s.headers ) { + if ( i.toLowerCase() === "content-type" ) { + s.contentType = s.headers[ i ] || ""; + } + } +} ); + +jQuery._evalUrl = function( url, options, doc ) { + return jQuery.ajax( { + url: url, + + // Make this explicit, since user can override this through ajaxSetup (trac-11264) + type: "GET", + dataType: "script", + cache: true, + async: false, + global: false, + scriptAttrs: options.crossOrigin ? { "crossOrigin": options.crossOrigin } : undefined, + + // Only evaluate the response if it is successful (gh-4126) + // dataFilter is not invoked for failure responses, so using it instead + // of the default converter is kludgy but it works. + converters: { + "text script": function() {} + }, + dataFilter: function( response ) { + jQuery.globalEval( response, options, doc ); + } + } ); +}; + +jQuery.fn.extend( { + wrapAll: function( html ) { + var wrap; + + if ( this[ 0 ] ) { + if ( typeof html === "function" ) { + html = html.call( this[ 0 ] ); + } + + // The elements to wrap the target around + wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true ); + + if ( this[ 0 ].parentNode ) { + wrap.insertBefore( this[ 0 ] ); + } + + wrap.map( function() { + var elem = this; + + while ( elem.firstElementChild ) { + elem = elem.firstElementChild; + } + + return elem; + } ).append( this ); + } + + return this; + }, + + wrapInner: function( html ) { + if ( typeof html === "function" ) { + return this.each( function( i ) { + jQuery( this ).wrapInner( html.call( this, i ) ); + } ); + } + + return this.each( function() { + var self = jQuery( this ), + contents = self.contents(); + + if ( contents.length ) { + contents.wrapAll( html ); + + } else { + self.append( html ); + } + } ); + }, + + wrap: function( html ) { + var htmlIsFunction = typeof html === "function"; + + return this.each( function( i ) { + jQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html ); + } ); + }, + + unwrap: function( selector ) { + this.parent( selector ).not( "body" ).each( function() { + jQuery( this ).replaceWith( this.childNodes ); + } ); + return this; + } +} ); + +jQuery.expr.pseudos.hidden = function( elem ) { + return !jQuery.expr.pseudos.visible( elem ); +}; +jQuery.expr.pseudos.visible = function( elem ) { + return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length ); +}; + +jQuery.ajaxSettings.xhr = function() { + return new window.XMLHttpRequest(); +}; + +var xhrSuccessStatus = { + + // File protocol always yields status code 0, assume 200 + 0: 200 +}; + +jQuery.ajaxTransport( function( options ) { + var callback; + + return { + send: function( headers, complete ) { + var i, + xhr = options.xhr(); + + xhr.open( + options.type, + options.url, + options.async, + options.username, + options.password + ); + + // Apply custom fields if provided + if ( options.xhrFields ) { + for ( i in options.xhrFields ) { + xhr[ i ] = options.xhrFields[ i ]; + } + } + + // Override mime type if needed + if ( options.mimeType && xhr.overrideMimeType ) { + xhr.overrideMimeType( options.mimeType ); + } + + // X-Requested-With header + // For cross-domain requests, seeing as conditions for a preflight are + // akin to a jigsaw puzzle, we simply never set it to be sure. + // (it can always be set on a per-request basis or even using ajaxSetup) + // For same-domain requests, won't change header if already provided. + if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) { + headers[ "X-Requested-With" ] = "XMLHttpRequest"; + } + + // Set headers + for ( i in headers ) { + xhr.setRequestHeader( i, headers[ i ] ); + } + + // Callback + callback = function( type ) { + return function() { + if ( callback ) { + callback = xhr.onload = xhr.onerror = xhr.onabort = xhr.ontimeout = null; + + if ( type === "abort" ) { + xhr.abort(); + } else if ( type === "error" ) { + complete( + + // File: protocol always yields status 0; see trac-8605, trac-14207 + xhr.status, + xhr.statusText + ); + } else { + complete( + xhrSuccessStatus[ xhr.status ] || xhr.status, + xhr.statusText, + + // For XHR2 non-text, let the caller handle it (gh-2498) + ( xhr.responseType || "text" ) === "text" ? + { text: xhr.responseText } : + { binary: xhr.response }, + xhr.getAllResponseHeaders() + ); + } + } + }; + }; + + // Listen to events + xhr.onload = callback(); + xhr.onabort = xhr.onerror = xhr.ontimeout = callback( "error" ); + + // Create the abort callback + callback = callback( "abort" ); + + try { + + // Do send the request (this may raise an exception) + xhr.send( options.hasContent && options.data || null ); + } catch ( e ) { + + // trac-14683: Only rethrow if this hasn't been notified as an error yet + if ( callback ) { + throw e; + } + } + }, + + abort: function() { + if ( callback ) { + callback(); + } + } + }; +} ); + +function canUseScriptTag( s ) { + + // A script tag can only be used for async, cross domain or forced-by-attrs requests. + // Requests with headers cannot use a script tag. However, when both `scriptAttrs` & + // `headers` options are specified, both are impossible to satisfy together; we + // prefer `scriptAttrs` then. + // Sync requests remain handled differently to preserve strict script ordering. + return s.scriptAttrs || ( + !s.headers && + ( + s.crossDomain || + + // When dealing with JSONP (`s.dataTypes` include "json" then) + // don't use a script tag so that error responses still may have + // `responseJSON` set. Continue using a script tag for JSONP requests that: + // * are cross-domain as AJAX requests won't work without a CORS setup + // * have `scriptAttrs` set as that's a script-only functionality + // Note that this means JSONP requests violate strict CSP script-src settings. + // A proper solution is to migrate from using JSONP to a CORS setup. + ( s.async && jQuery.inArray( "json", s.dataTypes ) < 0 ) + ) + ); +} + +// Install script dataType. Don't specify `contents.script` so that an explicit +// `dataType: "script"` is required (see gh-2432, gh-4822) +jQuery.ajaxSetup( { + accepts: { + script: "text/javascript, application/javascript, " + + "application/ecmascript, application/x-ecmascript" + }, + converters: { + "text script": function( text ) { + jQuery.globalEval( text ); + return text; + } + } +} ); + +// Handle cache's special case and crossDomain +jQuery.ajaxPrefilter( "script", function( s ) { + if ( s.cache === undefined ) { + s.cache = false; + } + + // These types of requests are handled via a script tag + // so force their methods to GET. + if ( canUseScriptTag( s ) ) { + s.type = "GET"; + } +} ); + +// Bind script tag hack transport +jQuery.ajaxTransport( "script", function( s ) { + if ( canUseScriptTag( s ) ) { + var script, callback; + return { + send: function( _, complete ) { + script = jQuery( " + + + +``` + +Take a look at the [Quill](https://quilljs.com/) website for more documentation, guides and [live playground](https://quilljs.com/playground/)! + +## Download + +```shell +npm install quill +``` + +### CDN + +```html + + + + + + + + + + +``` + +## Community + +Get help or stay up to date. + +- [Contribute](https://github.com/slab/quill/blob/main/.github/CONTRIBUTING.md) on [Issues](https://github.com/slab/quill/issues) +- Ask questions on [Discussions](https://github.com/slab/quill/discussions) + +## License + +BSD 3-clause diff --git a/public/assets/quill/assets/base.styl b/public/assets/quill/assets/base.styl new file mode 100644 index 0000000..261edc8 --- /dev/null +++ b/public/assets/quill/assets/base.styl @@ -0,0 +1,309 @@ +// Styles shared between snow and bubble + +controlHeight = 24px +inputPaddingWidth = 5px +inputPaddingHeight = 3px + +colorItemMargin = 2px +colorItemSize = 16px +colorItemsPerRow = 7 + + +.ql-{themeName}.ql-toolbar, .ql-{themeName} .ql-toolbar + &:after + clear: both + content: '' + display: table + + button + background: none + border: none + cursor: pointer + display: inline-block + float: left + height: controlHeight + padding: inputPaddingHeight inputPaddingWidth + width: controlHeight + (inputPaddingWidth - inputPaddingHeight)*2 + + svg + float: left + height: 100% + + &:active:hover + outline: none + + input.ql-image[type=file] + display: none + + button:hover, button:focus, button.ql-active, + .ql-picker-label:hover, .ql-picker-label.ql-active, + .ql-picker-item:hover, .ql-picker-item.ql-selected + color: activeColor + .ql-fill, .ql-stroke.ql-fill + fill: activeColor + .ql-stroke, .ql-stroke-miter + stroke: activeColor + +// Fix for iOS not losing hover on touch +@media (pointer: coarse) + .ql-{themeName}.ql-toolbar, .ql-{themeName} .ql-toolbar + button:hover:not(.ql-active) + color: inactiveColor + .ql-fill, .ql-stroke.ql-fill + fill: inactiveColor + .ql-stroke, .ql-stroke-miter + stroke: inactiveColor + +.ql-{themeName} + box-sizing: border-box + * + box-sizing: border-box + + .ql-hidden + display: none + .ql-out-bottom, .ql-out-top + visibility: hidden + + .ql-tooltip + position: absolute + transform: translateY(10px) + a + cursor: pointer + text-decoration: none + .ql-tooltip.ql-flip + transform: translateY(-10px) + + .ql-formats + &:after + clear: both + content: '' + display: table + display: inline-block + vertical-align: middle + + .ql-stroke + fill: none + stroke: inactiveColor + stroke-linecap: round + stroke-linejoin: round + stroke-width: 2 + .ql-stroke-miter + fill: none + stroke: inactiveColor + stroke-miterlimit: 10 + stroke-width: 2 + + .ql-fill, .ql-stroke.ql-fill + fill: inactiveColor + + .ql-empty + fill: none + .ql-even + fill-rule: evenodd + .ql-thin, .ql-stroke.ql-thin + stroke-width: 1 + .ql-transparent + opacity: 0.4 + + .ql-direction + svg:last-child + display: none + .ql-direction.ql-active + svg:last-child + display: inline + svg:first-child + display: none + + .ql-editor + h1 + font-size: 2em + h2 + font-size: 1.5em + h3 + font-size: 1.17em + h4 + font-size: 1em + h5 + font-size: 0.83em + h6 + font-size: 0.67em + a + text-decoration: underline + blockquote + border-left: 4px solid #ccc + margin-bottom: 5px + margin-top: 5px + padding-left: 16px + code, .ql-code-block-container + background-color: #f0f0f0 + border-radius: 3px + .ql-code-block-container + margin-bottom: 5px + margin-top: 5px + padding: 5px 10px + code + font-size: 85% + padding: 2px 4px + .ql-code-block-container + background-color: #23241f + color: #f8f8f2 + overflow: visible + img + max-width: 100% + + .ql-picker + color: inactiveColor + display: inline-block + float: left + font-size: 14px + font-weight: 500 + height: controlHeight + position: relative + vertical-align: middle + .ql-picker-label + cursor: pointer + display: inline-block + height: 100% + padding-left: 8px + padding-right: 2px + position: relative + width: 100% + &::before + display: inline-block + line-height: 22px + .ql-picker-options + background-color: backgroundColor + display: none + min-width: 100% + padding: 4px 8px + position: absolute + white-space: nowrap + .ql-picker-item + cursor: pointer + display: block + padding-bottom: 5px + padding-top: 5px + .ql-picker.ql-expanded + .ql-picker-label + color: borderColor + z-index: 2 + .ql-fill + fill: borderColor + .ql-stroke + stroke: borderColor + .ql-picker-options + display: block + margin-top: -1px + top: 100% + z-index: 1 + + .ql-color-picker, .ql-icon-picker + width: controlHeight + 4 + .ql-picker-label + padding: 2px 4px + svg + right: 4px + .ql-icon-picker + .ql-picker-options + padding: 4px 0px + .ql-picker-item + height: controlHeight + width: controlHeight + padding: 2px 4px + .ql-color-picker + .ql-picker-options + padding: inputPaddingHeight inputPaddingWidth + width: (colorItemSize + 2*colorItemMargin) * colorItemsPerRow + 2*inputPaddingWidth + 2 // +2 for the border + .ql-picker-item + border: 1px solid transparent + float: left + height: colorItemSize + margin: colorItemMargin + padding: 0px + width: colorItemSize + + .ql-picker:not(.ql-color-picker):not(.ql-icon-picker) + svg + position: absolute + margin-top: -9px + right: 0 + top: 50% + width: 18px + + .ql-picker.ql-header, .ql-picker.ql-font, .ql-picker.ql-size + .ql-picker-label[data-label]:not([data-label='']), + .ql-picker-item[data-label]:not([data-label='']) + &::before + content: attr(data-label) + + .ql-picker.ql-header + width: 98px + .ql-picker-label::before, + .ql-picker-item::before + content: 'Normal' + for num in (1..6) + .ql-picker-label[data-value=\"{num}\"]::before, + .ql-picker-item[data-value=\"{num}\"]::before + content: 'Heading ' + num + .ql-picker-item[data-value="1"]::before + font-size: 2em + .ql-picker-item[data-value="2"]::before + font-size: 1.5em + .ql-picker-item[data-value="3"]::before + font-size: 1.17em + .ql-picker-item[data-value="4"]::before + font-size: 1em + .ql-picker-item[data-value="5"]::before + font-size: 0.83em + .ql-picker-item[data-value="6"]::before + font-size: 0.67em + + .ql-picker.ql-font + width: 108px + .ql-picker-label::before, + .ql-picker-item::before + content: 'Sans Serif' + .ql-picker-label[data-value=serif]::before, + .ql-picker-item[data-value=serif]::before + content: 'Serif' + .ql-picker-label[data-value=monospace]::before, + .ql-picker-item[data-value=monospace]::before + content: 'Monospace' + .ql-picker-item[data-value=serif]::before + font-family: Georgia, Times New Roman, serif + .ql-picker-item[data-value=monospace]::before + font-family: Monaco, Courier New, monospace + + .ql-picker.ql-size + width: 98px + .ql-picker-label::before, + .ql-picker-item::before + content: 'Normal' + .ql-picker-label[data-value=small]::before, + .ql-picker-item[data-value=small]::before + content: 'Small' + .ql-picker-label[data-value=large]::before, + .ql-picker-item[data-value=large]::before + content: 'Large' + .ql-picker-label[data-value=huge]::before, + .ql-picker-item[data-value=huge]::before + content: 'Huge' + .ql-picker-item[data-value=small]::before + font-size: 10px + .ql-picker-item[data-value=large]::before + font-size: 18px + .ql-picker-item[data-value=huge]::before + font-size: 32px + + .ql-color-picker.ql-background + .ql-picker-item + background-color: #fff + .ql-color-picker.ql-color + .ql-picker-item + background-color: #000 + +.ql-code-block-container + position: relative + .ql-ui + right: 5px + top: 5px diff --git a/public/assets/quill/assets/bubble.styl b/public/assets/quill/assets/bubble.styl new file mode 100644 index 0000000..7dcef3f --- /dev/null +++ b/public/assets/quill/assets/bubble.styl @@ -0,0 +1,45 @@ +themeName = 'bubble' +activeColor = #fff +borderColor = #777 +backgroundColor = #444 +inactiveColor = #ccc +shadowColor = #ddd +textColor = #fff + +@import './core' +@import './base' +@import './bubble/*' + +.ql-container.ql-bubble:not(.ql-disabled) + a:not(.ql-close) + position: relative + white-space: nowrap + a:not(.ql-close)::before + background-color: #444 + border-radius: 15px + top: -5px + font-size: 12px + color: #fff + content: attr(href) + font-weight: normal + overflow: hidden + padding: 5px 15px + text-decoration: none + z-index: 1 + a:not(.ql-close)::after + border-top: 6px solid #444 + border-left: 6px solid transparent + border-right: 6px solid transparent + top: 0 + content: " " + height: 0 + width: 0 + a:not(.ql-close)::before, a:not(.ql-close)::after + left: 0 + margin-left: 50% + position: absolute + transform: translate(-50%, -100%) + transition: visibility 0s ease 200ms + visibility: hidden + a:not(.ql-close):hover::before, a:not(.ql-close):hover::after + visibility: visible diff --git a/public/assets/quill/assets/bubble/toolbar.styl b/public/assets/quill/assets/bubble/toolbar.styl new file mode 100644 index 0000000..2f80c3d --- /dev/null +++ b/public/assets/quill/assets/bubble/toolbar.styl @@ -0,0 +1,14 @@ +arrowWidth = 6px + +.ql-bubble + .ql-toolbar + .ql-formats + margin: 8px 12px 8px 0px + .ql-formats:first-child + margin-left: 12px + + .ql-color-picker + svg + margin: 1px + .ql-picker-item.ql-selected, .ql-picker-item:hover + border-color: activeColor diff --git a/public/assets/quill/assets/bubble/tooltip.styl b/public/assets/quill/assets/bubble/tooltip.styl new file mode 100644 index 0000000..4c65b91 --- /dev/null +++ b/public/assets/quill/assets/bubble/tooltip.styl @@ -0,0 +1,49 @@ +arrowWidth = 6px + +.ql-bubble + .ql-tooltip + background-color: backgroundColor + border-radius: 25px + color: textColor + .ql-tooltip-arrow + border-left: arrowWidth solid transparent + border-right: arrowWidth solid transparent + content: " " + display: block + left: 50% + margin-left: -1 * arrowWidth + position: absolute + .ql-tooltip:not(.ql-flip) .ql-tooltip-arrow + border-bottom: arrowWidth solid backgroundColor + top: -1 * arrowWidth + .ql-tooltip.ql-flip .ql-tooltip-arrow + border-top: arrowWidth solid backgroundColor + bottom: -1 * arrowWidth + + .ql-tooltip.ql-editing + .ql-tooltip-editor + display: block + .ql-formats + visibility: hidden + + .ql-tooltip-editor + display: none + input[type=text] + background: transparent + border: none + color: textColor + font-size: 13px + height: 100% + outline: none + padding: 10px 20px + position: absolute + width: 100% + a + &:before + color: inactiveColor + content: "\00D7" + font-size: 16px + font-weight: bold + top: 10px + position: absolute + right: 20px diff --git a/public/assets/quill/assets/core.styl b/public/assets/quill/assets/core.styl new file mode 100644 index 0000000..b4645ca --- /dev/null +++ b/public/assets/quill/assets/core.styl @@ -0,0 +1,215 @@ +// Styles necessary for Quill + +LIST_STYLE = decimal lower-alpha lower-roman +LIST_STYLE_WIDTH = 1.2em +LIST_STYLE_MARGIN = 0.3em +LIST_STYLE_OUTER_WIDTH = LIST_STYLE_MARGIN + LIST_STYLE_WIDTH +MAX_INDENT = 9 + +resets(arr) + unquote('list-' + join(' list-', arr)) + +.ql-container + box-sizing: border-box + font-family: Helvetica, Arial, sans-serif + font-size: 13px + height: 100% + margin: 0px + position: relative + +.ql-container.ql-disabled + .ql-tooltip + visibility: hidden + +.ql-container:not(.ql-disabled) + li[data-list=checked], + li[data-list=unchecked] + > .ql-ui + cursor: pointer + +.ql-clipboard + left: -100000px + height: 1px + overflow-y: hidden + position: absolute + top: 50% + p + margin: 0 + padding: 0 + +.ql-editor + box-sizing: border-box + counter-reset: resets(0..MAX_INDENT) + line-height: 1.42 + height: 100% + outline: none + overflow-y: auto + padding: 12px 15px + tab-size: 4 + -moz-tab-size: 4 + text-align: left + white-space: pre-wrap + word-wrap: break-word + > * + cursor: text + + p, ol, pre, blockquote, h1, h2, h3, h4, h5, h6 + margin: 0 + padding: 0 + p, h1, h2, h3, h4, h5, h6 + @supports (counter-set: none) + counter-set: resets(0..MAX_INDENT) + @supports not (counter-set: none) + counter-reset: resets(0..MAX_INDENT) + table + border-collapse: collapse + td + border: 1px solid #000 + padding: 2px 5px + ol + padding-left: 1.5em + li + list-style-type: none + padding-left: LIST_STYLE_OUTER_WIDTH + position: relative + + > .ql-ui:before + display: inline-block + margin-left: -1*LIST_STYLE_OUTER_WIDTH + margin-right: LIST_STYLE_MARGIN + text-align: right + white-space: nowrap + width: LIST_STYLE_WIDTH + + li[data-list=checked], + li[data-list=unchecked] + > .ql-ui + color: #777 + + li[data-list=bullet] > .ql-ui:before + content: '\2022' + li[data-list=checked] > .ql-ui:before + content: '\2611' + li[data-list=unchecked] > .ql-ui:before + content: '\2610' + + li[data-list] + @supports (counter-set: none) + counter-set: resets(1..MAX_INDENT) + @supports not (counter-set: none) + counter-reset: resets(1..MAX_INDENT) + + li[data-list=ordered] + counter-increment: list-0 + > .ql-ui:before + content: unquote('counter(list-0, ' + LIST_STYLE[0] + ')') '. ' + for num in (1..MAX_INDENT) + li[data-list=ordered].ql-indent-{num} + counter-increment: unquote('list-' + num) + > .ql-ui:before + content: unquote('counter(list-' + num + ', ' + LIST_STYLE[num%3] + ')') '. ' + if (num < MAX_INDENT) + li[data-list].ql-indent-{num} + @supports (counter-set: none) + counter-set: resets((num+1)..MAX_INDENT) + @supports not (counter-set: none) + counter-reset: resets((num+1)..MAX_INDENT) + + for num in (1..MAX_INDENT) + .ql-indent-{num}:not(.ql-direction-rtl) + padding-left: (3*num)em + li.ql-indent-{num}:not(.ql-direction-rtl) + padding-left: (3*num + LIST_STYLE_OUTER_WIDTH)em + .ql-indent-{num}.ql-direction-rtl.ql-align-right + padding-right: (3*num)em + li.ql-indent-{num}.ql-direction-rtl.ql-align-right + padding-right: (3*num + LIST_STYLE_OUTER_WIDTH)em + + li.ql-direction-rtl + padding-right: LIST_STYLE_OUTER_WIDTH + > .ql-ui:before + margin-left: LIST_STYLE_MARGIN + margin-right: -1*LIST_STYLE_OUTER_WIDTH + text-align: left + + table + table-layout: fixed + width: 100% + td + outline: none + + .ql-code-block-container + font-family: monospace + + .ql-video + display: block + max-width: 100% + .ql-video.ql-align-center + margin: 0 auto + .ql-video.ql-align-right + margin: 0 0 0 auto + + .ql-bg-black + background-color: rgb(0,0,0) + .ql-bg-red + background-color: rgb(230,0,0) + .ql-bg-orange + background-color: rgb(255,153,0) + .ql-bg-yellow + background-color: rgb(255,255,0) + .ql-bg-green + background-color: rgb(0,138,0) + .ql-bg-blue + background-color: rgb(0,102,204) + .ql-bg-purple + background-color: rgb(153,51,255) + + .ql-color-white + color: rgb(255,255,255) + .ql-color-red + color: rgb(230,0,0) + .ql-color-orange + color: rgb(255,153,0) + .ql-color-yellow + color: rgb(255,255,0) + .ql-color-green + color: rgb(0,138,0) + .ql-color-blue + color: rgb(0,102,204) + .ql-color-purple + color: rgb(153,51,255) + + .ql-font-serif + font-family: Georgia, Times New Roman, serif + .ql-font-monospace + font-family: Monaco, Courier New, monospace + + .ql-size-small + font-size: 0.75em + .ql-size-large + font-size: 1.5em + .ql-size-huge + font-size: 2.5em + + .ql-direction-rtl + direction: rtl + text-align: inherit + + .ql-align-center + text-align: center + .ql-align-justify + text-align: justify + .ql-align-right + text-align: right + + .ql-ui + position: absolute + +.ql-editor.ql-blank::before + color: rgba(0,0,0,0.6) + content: attr(data-placeholder) + font-style: italic + left: 15px + pointer-events: none + position: absolute + right: 15px diff --git a/public/assets/quill/assets/favicon.png b/public/assets/quill/assets/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..f0f8cdbd63b9c234cb202f4759a3ec08504abb95 GIT binary patch literal 696 zcmV;p0!RIcP)B}#~yJQ0hotcVW~S6wM?1ea2G6|__k?8++WN_Q?4s$B=s zMRB2m3X+9_uNI2WT8d4qjbi-{+<_s?+}?2}Gw^d~CX@5sbLQN0?!;md9NBEPr%)&y zE|<$grBdk*n&A8udfpOXJRa`?cofie^ajw9hrWdh&gb*n0gj?s4fMC;d?6HYu~^)M zv76|R2Kfq=qIk7`RubJR&-*B>f?K1EMCU}D9k^m-`ndDi&VPA>ShZ>K5Fz(Iea$5}G zOGK#XH{mYp)-+!4G=-zLm~8U{KZyQ%cs@J7efs^Kg5{O!I|K9sesZKxE=w%-*4ibaWf43 zB;y9v)ttaD=oUIo7u+1U)ME6ti&vv6GEbZC&!S`etv!?`Bk#%uUXgao`F+iMe!+7G z!e}&Cn&6Y^bb7sPDh!ueMOILd34Cz&aU!yZd)Ex%pHW|s@E4klo>ww~kCUX`LBl`n zF#1HY-m4NilTaE_C<%zM$I9q0#?!LyHSmVy3oBz?C~#`}Y8xm$n{m#=<3+|BQVB!d zToT58c5g?YT)WJbarVZFV zd&4NX5R394^yd_Oj!U< el5LDdeEb720A9@Ffg2$J0000 + + + + \ No newline at end of file diff --git a/public/assets/quill/assets/icons/align-justify.svg b/public/assets/quill/assets/icons/align-justify.svg new file mode 100644 index 0000000..404a5a7 --- /dev/null +++ b/public/assets/quill/assets/icons/align-justify.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/public/assets/quill/assets/icons/align-left.svg b/public/assets/quill/assets/icons/align-left.svg new file mode 100644 index 0000000..dd2fe81 --- /dev/null +++ b/public/assets/quill/assets/icons/align-left.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/public/assets/quill/assets/icons/align-right.svg b/public/assets/quill/assets/icons/align-right.svg new file mode 100644 index 0000000..d9f5570 --- /dev/null +++ b/public/assets/quill/assets/icons/align-right.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/public/assets/quill/assets/icons/attachment.svg b/public/assets/quill/assets/icons/attachment.svg new file mode 100644 index 0000000..b491b4d --- /dev/null +++ b/public/assets/quill/assets/icons/attachment.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/public/assets/quill/assets/icons/audio.svg b/public/assets/quill/assets/icons/audio.svg new file mode 100644 index 0000000..684888f --- /dev/null +++ b/public/assets/quill/assets/icons/audio.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/public/assets/quill/assets/icons/authorship.svg b/public/assets/quill/assets/icons/authorship.svg new file mode 100644 index 0000000..b9997ec --- /dev/null +++ b/public/assets/quill/assets/icons/authorship.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/public/assets/quill/assets/icons/background.svg b/public/assets/quill/assets/icons/background.svg new file mode 100644 index 0000000..0487104 --- /dev/null +++ b/public/assets/quill/assets/icons/background.svg @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/assets/quill/assets/icons/blockquote.svg b/public/assets/quill/assets/icons/blockquote.svg new file mode 100644 index 0000000..b408ade --- /dev/null +++ b/public/assets/quill/assets/icons/blockquote.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/public/assets/quill/assets/icons/bold.svg b/public/assets/quill/assets/icons/bold.svg new file mode 100644 index 0000000..48055c4 --- /dev/null +++ b/public/assets/quill/assets/icons/bold.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/public/assets/quill/assets/icons/clean.svg b/public/assets/quill/assets/icons/clean.svg new file mode 100644 index 0000000..72cf882 --- /dev/null +++ b/public/assets/quill/assets/icons/clean.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/public/assets/quill/assets/icons/code.svg b/public/assets/quill/assets/icons/code.svg new file mode 100644 index 0000000..2d151f9 --- /dev/null +++ b/public/assets/quill/assets/icons/code.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/public/assets/quill/assets/icons/color.svg b/public/assets/quill/assets/icons/color.svg new file mode 100644 index 0000000..9f0df94 --- /dev/null +++ b/public/assets/quill/assets/icons/color.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/public/assets/quill/assets/icons/comment.svg b/public/assets/quill/assets/icons/comment.svg new file mode 100644 index 0000000..8de5701 --- /dev/null +++ b/public/assets/quill/assets/icons/comment.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/public/assets/quill/assets/icons/direction-ltr.svg b/public/assets/quill/assets/icons/direction-ltr.svg new file mode 100644 index 0000000..f3bad36 --- /dev/null +++ b/public/assets/quill/assets/icons/direction-ltr.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/public/assets/quill/assets/icons/direction-rtl.svg b/public/assets/quill/assets/icons/direction-rtl.svg new file mode 100644 index 0000000..761519e --- /dev/null +++ b/public/assets/quill/assets/icons/direction-rtl.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/public/assets/quill/assets/icons/dropdown.svg b/public/assets/quill/assets/icons/dropdown.svg new file mode 100644 index 0000000..2cd51ff --- /dev/null +++ b/public/assets/quill/assets/icons/dropdown.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/public/assets/quill/assets/icons/embed.svg b/public/assets/quill/assets/icons/embed.svg new file mode 100644 index 0000000..b092f74 --- /dev/null +++ b/public/assets/quill/assets/icons/embed.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/public/assets/quill/assets/icons/emoji.svg b/public/assets/quill/assets/icons/emoji.svg new file mode 100644 index 0000000..c991566 --- /dev/null +++ b/public/assets/quill/assets/icons/emoji.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/public/assets/quill/assets/icons/float-center.svg b/public/assets/quill/assets/icons/float-center.svg new file mode 100644 index 0000000..50838db --- /dev/null +++ b/public/assets/quill/assets/icons/float-center.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/public/assets/quill/assets/icons/float-full.svg b/public/assets/quill/assets/icons/float-full.svg new file mode 100644 index 0000000..b5982ed --- /dev/null +++ b/public/assets/quill/assets/icons/float-full.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/public/assets/quill/assets/icons/float-left.svg b/public/assets/quill/assets/icons/float-left.svg new file mode 100644 index 0000000..b2dbfea --- /dev/null +++ b/public/assets/quill/assets/icons/float-left.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/public/assets/quill/assets/icons/float-right.svg b/public/assets/quill/assets/icons/float-right.svg new file mode 100644 index 0000000..0cf8af5 --- /dev/null +++ b/public/assets/quill/assets/icons/float-right.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/public/assets/quill/assets/icons/font.svg b/public/assets/quill/assets/icons/font.svg new file mode 100644 index 0000000..0ee8777 --- /dev/null +++ b/public/assets/quill/assets/icons/font.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/public/assets/quill/assets/icons/formula.svg b/public/assets/quill/assets/icons/formula.svg new file mode 100644 index 0000000..b7126b4 --- /dev/null +++ b/public/assets/quill/assets/icons/formula.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/public/assets/quill/assets/icons/hashtag.svg b/public/assets/quill/assets/icons/hashtag.svg new file mode 100644 index 0000000..4e688b2 --- /dev/null +++ b/public/assets/quill/assets/icons/hashtag.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/public/assets/quill/assets/icons/header-2.svg b/public/assets/quill/assets/icons/header-2.svg new file mode 100644 index 0000000..8819e2f --- /dev/null +++ b/public/assets/quill/assets/icons/header-2.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/public/assets/quill/assets/icons/header-3.svg b/public/assets/quill/assets/icons/header-3.svg new file mode 100644 index 0000000..b8e5364 --- /dev/null +++ b/public/assets/quill/assets/icons/header-3.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/public/assets/quill/assets/icons/header-4.svg b/public/assets/quill/assets/icons/header-4.svg new file mode 100644 index 0000000..c06f69d --- /dev/null +++ b/public/assets/quill/assets/icons/header-4.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/public/assets/quill/assets/icons/header-5.svg b/public/assets/quill/assets/icons/header-5.svg new file mode 100644 index 0000000..4541235 --- /dev/null +++ b/public/assets/quill/assets/icons/header-5.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/public/assets/quill/assets/icons/header-6.svg b/public/assets/quill/assets/icons/header-6.svg new file mode 100644 index 0000000..3dfebef --- /dev/null +++ b/public/assets/quill/assets/icons/header-6.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/public/assets/quill/assets/icons/header.svg b/public/assets/quill/assets/icons/header.svg new file mode 100644 index 0000000..06ab0b0 --- /dev/null +++ b/public/assets/quill/assets/icons/header.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/public/assets/quill/assets/icons/horizontal-rule.svg b/public/assets/quill/assets/icons/horizontal-rule.svg new file mode 100644 index 0000000..1a867b6 --- /dev/null +++ b/public/assets/quill/assets/icons/horizontal-rule.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/public/assets/quill/assets/icons/image.svg b/public/assets/quill/assets/icons/image.svg new file mode 100644 index 0000000..3341a24 --- /dev/null +++ b/public/assets/quill/assets/icons/image.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/public/assets/quill/assets/icons/indent.svg b/public/assets/quill/assets/icons/indent.svg new file mode 100644 index 0000000..37bfe97 --- /dev/null +++ b/public/assets/quill/assets/icons/indent.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/public/assets/quill/assets/icons/italic.svg b/public/assets/quill/assets/icons/italic.svg new file mode 100644 index 0000000..39e841c --- /dev/null +++ b/public/assets/quill/assets/icons/italic.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/public/assets/quill/assets/icons/link.svg b/public/assets/quill/assets/icons/link.svg new file mode 100644 index 0000000..1f5a81a --- /dev/null +++ b/public/assets/quill/assets/icons/link.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/public/assets/quill/assets/icons/list-bullet.svg b/public/assets/quill/assets/icons/list-bullet.svg new file mode 100644 index 0000000..ec158fa --- /dev/null +++ b/public/assets/quill/assets/icons/list-bullet.svg @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/public/assets/quill/assets/icons/list-check.svg b/public/assets/quill/assets/icons/list-check.svg new file mode 100644 index 0000000..4539f45 --- /dev/null +++ b/public/assets/quill/assets/icons/list-check.svg @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/public/assets/quill/assets/icons/list-ordered.svg b/public/assets/quill/assets/icons/list-ordered.svg new file mode 100644 index 0000000..7e81b33 --- /dev/null +++ b/public/assets/quill/assets/icons/list-ordered.svg @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/public/assets/quill/assets/icons/map.svg b/public/assets/quill/assets/icons/map.svg new file mode 100644 index 0000000..3f429f1 --- /dev/null +++ b/public/assets/quill/assets/icons/map.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/public/assets/quill/assets/icons/mention.svg b/public/assets/quill/assets/icons/mention.svg new file mode 100644 index 0000000..b2d44ac --- /dev/null +++ b/public/assets/quill/assets/icons/mention.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/public/assets/quill/assets/icons/more.svg b/public/assets/quill/assets/icons/more.svg new file mode 100644 index 0000000..1a78114 --- /dev/null +++ b/public/assets/quill/assets/icons/more.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/public/assets/quill/assets/icons/outdent.svg b/public/assets/quill/assets/icons/outdent.svg new file mode 100644 index 0000000..8811e23 --- /dev/null +++ b/public/assets/quill/assets/icons/outdent.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/public/assets/quill/assets/icons/redo.svg b/public/assets/quill/assets/icons/redo.svg new file mode 100644 index 0000000..1ea9179 --- /dev/null +++ b/public/assets/quill/assets/icons/redo.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/public/assets/quill/assets/icons/size-decrease.svg b/public/assets/quill/assets/icons/size-decrease.svg new file mode 100644 index 0000000..e3c6bbf --- /dev/null +++ b/public/assets/quill/assets/icons/size-decrease.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/public/assets/quill/assets/icons/size-increase.svg b/public/assets/quill/assets/icons/size-increase.svg new file mode 100644 index 0000000..59fe541 --- /dev/null +++ b/public/assets/quill/assets/icons/size-increase.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/public/assets/quill/assets/icons/size.svg b/public/assets/quill/assets/icons/size.svg new file mode 100644 index 0000000..dfadc1f --- /dev/null +++ b/public/assets/quill/assets/icons/size.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/public/assets/quill/assets/icons/spacing.svg b/public/assets/quill/assets/icons/spacing.svg new file mode 100644 index 0000000..c489969 --- /dev/null +++ b/public/assets/quill/assets/icons/spacing.svg @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/public/assets/quill/assets/icons/speech.svg b/public/assets/quill/assets/icons/speech.svg new file mode 100644 index 0000000..b35b4b9 --- /dev/null +++ b/public/assets/quill/assets/icons/speech.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/public/assets/quill/assets/icons/strike.svg b/public/assets/quill/assets/icons/strike.svg new file mode 100644 index 0000000..e185d73 --- /dev/null +++ b/public/assets/quill/assets/icons/strike.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/public/assets/quill/assets/icons/subscript.svg b/public/assets/quill/assets/icons/subscript.svg new file mode 100644 index 0000000..a2d5eae --- /dev/null +++ b/public/assets/quill/assets/icons/subscript.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/public/assets/quill/assets/icons/superscript.svg b/public/assets/quill/assets/icons/superscript.svg new file mode 100644 index 0000000..1254540 --- /dev/null +++ b/public/assets/quill/assets/icons/superscript.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/public/assets/quill/assets/icons/table-border-all.svg b/public/assets/quill/assets/icons/table-border-all.svg new file mode 100644 index 0000000..eadfe4c --- /dev/null +++ b/public/assets/quill/assets/icons/table-border-all.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/public/assets/quill/assets/icons/table-border-bottom.svg b/public/assets/quill/assets/icons/table-border-bottom.svg new file mode 100644 index 0000000..4860988 --- /dev/null +++ b/public/assets/quill/assets/icons/table-border-bottom.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/assets/quill/assets/icons/table-border-left.svg b/public/assets/quill/assets/icons/table-border-left.svg new file mode 100644 index 0000000..4c3362f --- /dev/null +++ b/public/assets/quill/assets/icons/table-border-left.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/assets/quill/assets/icons/table-border-none.svg b/public/assets/quill/assets/icons/table-border-none.svg new file mode 100644 index 0000000..c96df12 --- /dev/null +++ b/public/assets/quill/assets/icons/table-border-none.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/assets/quill/assets/icons/table-border-outside.svg b/public/assets/quill/assets/icons/table-border-outside.svg new file mode 100644 index 0000000..771db96 --- /dev/null +++ b/public/assets/quill/assets/icons/table-border-outside.svg @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/assets/quill/assets/icons/table-border-right.svg b/public/assets/quill/assets/icons/table-border-right.svg new file mode 100644 index 0000000..cbc5045 --- /dev/null +++ b/public/assets/quill/assets/icons/table-border-right.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/assets/quill/assets/icons/table-border-top.svg b/public/assets/quill/assets/icons/table-border-top.svg new file mode 100644 index 0000000..7c15330 --- /dev/null +++ b/public/assets/quill/assets/icons/table-border-top.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/assets/quill/assets/icons/table-delete-cells.svg b/public/assets/quill/assets/icons/table-delete-cells.svg new file mode 100644 index 0000000..405f43e --- /dev/null +++ b/public/assets/quill/assets/icons/table-delete-cells.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/assets/quill/assets/icons/table-delete-columns.svg b/public/assets/quill/assets/icons/table-delete-columns.svg new file mode 100644 index 0000000..c1c2567 --- /dev/null +++ b/public/assets/quill/assets/icons/table-delete-columns.svg @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/public/assets/quill/assets/icons/table-delete-rows.svg b/public/assets/quill/assets/icons/table-delete-rows.svg new file mode 100644 index 0000000..df216d8 --- /dev/null +++ b/public/assets/quill/assets/icons/table-delete-rows.svg @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/public/assets/quill/assets/icons/table-insert-cells.svg b/public/assets/quill/assets/icons/table-insert-cells.svg new file mode 100644 index 0000000..9a37601 --- /dev/null +++ b/public/assets/quill/assets/icons/table-insert-cells.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/assets/quill/assets/icons/table-insert-columns.svg b/public/assets/quill/assets/icons/table-insert-columns.svg new file mode 100644 index 0000000..4374221 --- /dev/null +++ b/public/assets/quill/assets/icons/table-insert-columns.svg @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/public/assets/quill/assets/icons/table-insert-rows.svg b/public/assets/quill/assets/icons/table-insert-rows.svg new file mode 100644 index 0000000..76819c7 --- /dev/null +++ b/public/assets/quill/assets/icons/table-insert-rows.svg @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/public/assets/quill/assets/icons/table-merge-cells.svg b/public/assets/quill/assets/icons/table-merge-cells.svg new file mode 100644 index 0000000..71209af --- /dev/null +++ b/public/assets/quill/assets/icons/table-merge-cells.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/public/assets/quill/assets/icons/table-unmerge-cells.svg b/public/assets/quill/assets/icons/table-unmerge-cells.svg new file mode 100644 index 0000000..24ec0b3 --- /dev/null +++ b/public/assets/quill/assets/icons/table-unmerge-cells.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/public/assets/quill/assets/icons/table.svg b/public/assets/quill/assets/icons/table.svg new file mode 100644 index 0000000..cf85df9 --- /dev/null +++ b/public/assets/quill/assets/icons/table.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/public/assets/quill/assets/icons/underline.svg b/public/assets/quill/assets/icons/underline.svg new file mode 100644 index 0000000..b3c2a35 --- /dev/null +++ b/public/assets/quill/assets/icons/underline.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/public/assets/quill/assets/icons/undo.svg b/public/assets/quill/assets/icons/undo.svg new file mode 100644 index 0000000..33fc0ff --- /dev/null +++ b/public/assets/quill/assets/icons/undo.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/public/assets/quill/assets/icons/video.svg b/public/assets/quill/assets/icons/video.svg new file mode 100644 index 0000000..777c532 --- /dev/null +++ b/public/assets/quill/assets/icons/video.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/assets/quill/assets/snow.styl b/public/assets/quill/assets/snow.styl new file mode 100644 index 0000000..14f8ed3 --- /dev/null +++ b/public/assets/quill/assets/snow.styl @@ -0,0 +1,18 @@ +themeName = 'snow' +activeColor = #06c +borderColor = #ccc +backgroundColor = #fff +inactiveColor = #444 +shadowColor = #ddd +textColor = #444 + +@import './core' +@import './base' +@import './snow/*' + +.ql-snow + a + color: activeColor + +.ql-container.ql-snow + border: 1px solid borderColor diff --git a/public/assets/quill/assets/snow/toolbar.styl b/public/assets/quill/assets/snow/toolbar.styl new file mode 100644 index 0000000..bac8701 --- /dev/null +++ b/public/assets/quill/assets/snow/toolbar.styl @@ -0,0 +1,26 @@ +.ql-toolbar.ql-snow + border: 1px solid borderColor + box-sizing: border-box + font-family: 'Helvetica Neue', 'Helvetica', 'Arial', sans-serif + padding: 8px + + .ql-formats + margin-right: 15px + + .ql-picker-label + border: 1px solid transparent + .ql-picker-options + border: 1px solid transparent + box-shadow: rgba(0,0,0,0.2) 0 2px 8px + .ql-picker.ql-expanded + .ql-picker-label + border-color: borderColor + .ql-picker-options + border-color: borderColor + + .ql-color-picker + .ql-picker-item.ql-selected, .ql-picker-item:hover + border-color: #000 + +.ql-toolbar.ql-snow + .ql-container.ql-snow + border-top: 0px; diff --git a/public/assets/quill/assets/snow/tooltip.styl b/public/assets/quill/assets/snow/tooltip.styl new file mode 100644 index 0000000..9af6009 --- /dev/null +++ b/public/assets/quill/assets/snow/tooltip.styl @@ -0,0 +1,53 @@ +tooltipMargin = 8px + +.ql-snow + .ql-tooltip + background-color: #fff + border: 1px solid borderColor + box-shadow: 0px 0px 5px shadowColor + color: textColor + padding: 5px 12px + white-space: nowrap + &::before + content: "Visit URL:" + line-height: 26px + margin-right: tooltipMargin + input[type=text] + display: none + border: 1px solid borderColor + font-size: 13px + height: 26px + margin: 0px + padding: 3px 5px + width: 170px + a.ql-preview + display: inline-block + max-width: 200px + overflow-x: hidden + text-overflow: ellipsis + vertical-align: top + a.ql-action::after + border-right: 1px solid borderColor + content: 'Edit' + margin-left: tooltipMargin*2 + padding-right: tooltipMargin + a.ql-remove::before + content: 'Remove' + margin-left: tooltipMargin + a + line-height: 26px + .ql-tooltip.ql-editing + a.ql-preview, a.ql-remove + display: none + input[type=text] + display: inline-block + a.ql-action::after + border-right: 0px + content: 'Save' + padding-right: 0px + .ql-tooltip[data-mode=link]::before + content: "Enter link:" + .ql-tooltip[data-mode=formula]::before + content: "Enter formula:" + .ql-tooltip[data-mode=video]::before + content: "Enter video:" diff --git a/public/assets/quill/blots/block.d.ts b/public/assets/quill/blots/block.d.ts new file mode 100644 index 0000000..a49e2a5 --- /dev/null +++ b/public/assets/quill/blots/block.d.ts @@ -0,0 +1,34 @@ +import { AttributorStore, BlockBlot, EmbedBlot } from 'parchment'; +import type { Blot, Parent } from 'parchment'; +import Delta from 'quill-delta'; +declare class Block extends BlockBlot { + cache: { + delta?: Delta | null; + length?: number; + }; + delta(): Delta; + deleteAt(index: number, length: number): void; + formatAt(index: number, length: number, name: string, value: unknown): void; + insertAt(index: number, value: string, def?: unknown): void; + insertBefore(blot: Blot, ref?: Blot | null): void; + length(): number; + moveChildren(target: Parent, ref?: Blot | null): void; + optimize(context: { + [key: string]: any; + }): void; + path(index: number): [Blot, number][]; + removeChild(child: Blot): void; + split(index: number, force?: boolean | undefined): Blot | null; +} +declare class BlockEmbed extends EmbedBlot { + attributes: AttributorStore; + domNode: HTMLElement; + attach(): void; + delta(): Delta; + format(name: string, value: unknown): void; + formatAt(index: number, length: number, name: string, value: unknown): void; + insertAt(index: number, value: string, def?: unknown): void; +} +declare function blockDelta(blot: BlockBlot, filter?: boolean): Delta; +declare function bubbleFormats(blot: Blot | null, formats?: Record, filter?: boolean): Record; +export { blockDelta, bubbleFormats, BlockEmbed, Block as default }; diff --git a/public/assets/quill/blots/block.js b/public/assets/quill/blots/block.js new file mode 100644 index 0000000..553c232 --- /dev/null +++ b/public/assets/quill/blots/block.js @@ -0,0 +1,182 @@ +import { AttributorStore, BlockBlot, EmbedBlot, LeafBlot, Scope } from 'parchment'; +import Delta from 'quill-delta'; +import Break from './break.js'; +import Inline from './inline.js'; +import TextBlot from './text.js'; +const NEWLINE_LENGTH = 1; +class Block extends BlockBlot { + cache = {}; + delta() { + if (this.cache.delta == null) { + this.cache.delta = blockDelta(this); + } + return this.cache.delta; + } + deleteAt(index, length) { + super.deleteAt(index, length); + this.cache = {}; + } + formatAt(index, length, name, value) { + if (length <= 0) return; + if (this.scroll.query(name, Scope.BLOCK)) { + if (index + length === this.length()) { + this.format(name, value); + } + } else { + super.formatAt(index, Math.min(length, this.length() - index - 1), name, value); + } + this.cache = {}; + } + insertAt(index, value, def) { + if (def != null) { + super.insertAt(index, value, def); + this.cache = {}; + return; + } + if (value.length === 0) return; + const lines = value.split('\n'); + const text = lines.shift(); + if (text.length > 0) { + if (index < this.length() - 1 || this.children.tail == null) { + super.insertAt(Math.min(index, this.length() - 1), text); + } else { + this.children.tail.insertAt(this.children.tail.length(), text); + } + this.cache = {}; + } + // TODO: Fix this next time the file is edited. + // eslint-disable-next-line @typescript-eslint/no-this-alias + let block = this; + lines.reduce((lineIndex, line) => { + // @ts-expect-error Fix me later + block = block.split(lineIndex, true); + block.insertAt(0, line); + return line.length; + }, index + text.length); + } + insertBefore(blot, ref) { + const { + head + } = this.children; + super.insertBefore(blot, ref); + if (head instanceof Break) { + head.remove(); + } + this.cache = {}; + } + length() { + if (this.cache.length == null) { + this.cache.length = super.length() + NEWLINE_LENGTH; + } + return this.cache.length; + } + moveChildren(target, ref) { + super.moveChildren(target, ref); + this.cache = {}; + } + optimize(context) { + super.optimize(context); + this.cache = {}; + } + path(index) { + return super.path(index, true); + } + removeChild(child) { + super.removeChild(child); + this.cache = {}; + } + split(index) { + let force = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + if (force && (index === 0 || index >= this.length() - NEWLINE_LENGTH)) { + const clone = this.clone(); + if (index === 0) { + this.parent.insertBefore(clone, this); + return this; + } + this.parent.insertBefore(clone, this.next); + return clone; + } + const next = super.split(index, force); + this.cache = {}; + return next; + } +} +Block.blotName = 'block'; +Block.tagName = 'P'; +Block.defaultChild = Break; +Block.allowedChildren = [Break, Inline, EmbedBlot, TextBlot]; +class BlockEmbed extends EmbedBlot { + attach() { + super.attach(); + this.attributes = new AttributorStore(this.domNode); + } + delta() { + return new Delta().insert(this.value(), { + ...this.formats(), + ...this.attributes.values() + }); + } + format(name, value) { + const attribute = this.scroll.query(name, Scope.BLOCK_ATTRIBUTE); + if (attribute != null) { + // @ts-expect-error TODO: Scroll#query() should return Attributor when scope is attribute + this.attributes.attribute(attribute, value); + } + } + formatAt(index, length, name, value) { + this.format(name, value); + } + insertAt(index, value, def) { + if (def != null) { + super.insertAt(index, value, def); + return; + } + const lines = value.split('\n'); + const text = lines.pop(); + const blocks = lines.map(line => { + const block = this.scroll.create(Block.blotName); + block.insertAt(0, line); + return block; + }); + const ref = this.split(index); + blocks.forEach(block => { + this.parent.insertBefore(block, ref); + }); + if (text) { + this.parent.insertBefore(this.scroll.create('text', text), ref); + } + } +} +BlockEmbed.scope = Scope.BLOCK_BLOT; +// It is important for cursor behavior BlockEmbeds use tags that are block level elements + +function blockDelta(blot) { + let filter = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; + return blot.descendants(LeafBlot).reduce((delta, leaf) => { + if (leaf.length() === 0) { + return delta; + } + return delta.insert(leaf.value(), bubbleFormats(leaf, {}, filter)); + }, new Delta()).insert('\n', bubbleFormats(blot)); +} +function bubbleFormats(blot) { + let formats = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + let filter = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true; + if (blot == null) return formats; + if ('formats' in blot && typeof blot.formats === 'function') { + formats = { + ...formats, + ...blot.formats() + }; + if (filter) { + // exclude syntax highlighting from deltas and getFormat() + delete formats['code-token']; + } + } + if (blot.parent == null || blot.parent.statics.blotName === 'scroll' || blot.parent.statics.scope !== blot.statics.scope) { + return formats; + } + return bubbleFormats(blot.parent, formats, filter); +} +export { blockDelta, bubbleFormats, BlockEmbed, Block as default }; +//# sourceMappingURL=block.js.map \ No newline at end of file diff --git a/public/assets/quill/blots/block.js.map b/public/assets/quill/blots/block.js.map new file mode 100644 index 0000000..373766b --- /dev/null +++ b/public/assets/quill/blots/block.js.map @@ -0,0 +1 @@ +{"version":3,"file":"block.js","names":["AttributorStore","BlockBlot","EmbedBlot","LeafBlot","Scope","Delta","Break","Inline","TextBlot","NEWLINE_LENGTH","Block","cache","delta","blockDelta","deleteAt","index","length","formatAt","name","value","scroll","query","BLOCK","format","Math","min","insertAt","def","lines","split","text","shift","children","tail","block","reduce","lineIndex","line","insertBefore","blot","ref","head","remove","moveChildren","target","optimize","context","path","removeChild","child","force","arguments","undefined","clone","parent","next","blotName","tagName","defaultChild","allowedChildren","BlockEmbed","attach","attributes","domNode","insert","formats","values","attribute","BLOCK_ATTRIBUTE","pop","blocks","map","create","forEach","scope","BLOCK_BLOT","filter","descendants","leaf","bubbleFormats","statics","default"],"sources":["../../src/blots/block.ts"],"sourcesContent":["import {\n AttributorStore,\n BlockBlot,\n EmbedBlot,\n LeafBlot,\n Scope,\n} from 'parchment';\nimport type { Blot, Parent } from 'parchment';\nimport Delta from 'quill-delta';\nimport Break from './break.js';\nimport Inline from './inline.js';\nimport TextBlot from './text.js';\n\nconst NEWLINE_LENGTH = 1;\n\nclass Block extends BlockBlot {\n cache: { delta?: Delta | null; length?: number } = {};\n\n delta(): Delta {\n if (this.cache.delta == null) {\n this.cache.delta = blockDelta(this);\n }\n return this.cache.delta;\n }\n\n deleteAt(index: number, length: number) {\n super.deleteAt(index, length);\n this.cache = {};\n }\n\n formatAt(index: number, length: number, name: string, value: unknown) {\n if (length <= 0) return;\n if (this.scroll.query(name, Scope.BLOCK)) {\n if (index + length === this.length()) {\n this.format(name, value);\n }\n } else {\n super.formatAt(\n index,\n Math.min(length, this.length() - index - 1),\n name,\n value,\n );\n }\n this.cache = {};\n }\n\n insertAt(index: number, value: string, def?: unknown) {\n if (def != null) {\n super.insertAt(index, value, def);\n this.cache = {};\n return;\n }\n if (value.length === 0) return;\n const lines = value.split('\\n');\n const text = lines.shift() as string;\n if (text.length > 0) {\n if (index < this.length() - 1 || this.children.tail == null) {\n super.insertAt(Math.min(index, this.length() - 1), text);\n } else {\n this.children.tail.insertAt(this.children.tail.length(), text);\n }\n this.cache = {};\n }\n // TODO: Fix this next time the file is edited.\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n let block: Blot | this = this;\n lines.reduce((lineIndex, line) => {\n // @ts-expect-error Fix me later\n block = block.split(lineIndex, true);\n block.insertAt(0, line);\n return line.length;\n }, index + text.length);\n }\n\n insertBefore(blot: Blot, ref?: Blot | null) {\n const { head } = this.children;\n super.insertBefore(blot, ref);\n if (head instanceof Break) {\n head.remove();\n }\n this.cache = {};\n }\n\n length() {\n if (this.cache.length == null) {\n this.cache.length = super.length() + NEWLINE_LENGTH;\n }\n return this.cache.length;\n }\n\n moveChildren(target: Parent, ref?: Blot | null) {\n super.moveChildren(target, ref);\n this.cache = {};\n }\n\n optimize(context: { [key: string]: any }) {\n super.optimize(context);\n this.cache = {};\n }\n\n path(index: number) {\n return super.path(index, true);\n }\n\n removeChild(child: Blot) {\n super.removeChild(child);\n this.cache = {};\n }\n\n split(index: number, force: boolean | undefined = false): Blot | null {\n if (force && (index === 0 || index >= this.length() - NEWLINE_LENGTH)) {\n const clone = this.clone();\n if (index === 0) {\n this.parent.insertBefore(clone, this);\n return this;\n }\n this.parent.insertBefore(clone, this.next);\n return clone;\n }\n const next = super.split(index, force);\n this.cache = {};\n return next;\n }\n}\nBlock.blotName = 'block';\nBlock.tagName = 'P';\nBlock.defaultChild = Break;\nBlock.allowedChildren = [Break, Inline, EmbedBlot, TextBlot];\n\nclass BlockEmbed extends EmbedBlot {\n attributes: AttributorStore;\n domNode: HTMLElement;\n\n attach() {\n super.attach();\n this.attributes = new AttributorStore(this.domNode);\n }\n\n delta() {\n return new Delta().insert(this.value(), {\n ...this.formats(),\n ...this.attributes.values(),\n });\n }\n\n format(name: string, value: unknown) {\n const attribute = this.scroll.query(name, Scope.BLOCK_ATTRIBUTE);\n if (attribute != null) {\n // @ts-expect-error TODO: Scroll#query() should return Attributor when scope is attribute\n this.attributes.attribute(attribute, value);\n }\n }\n\n formatAt(index: number, length: number, name: string, value: unknown) {\n this.format(name, value);\n }\n\n insertAt(index: number, value: string, def?: unknown) {\n if (def != null) {\n super.insertAt(index, value, def);\n return;\n }\n const lines = value.split('\\n');\n const text = lines.pop();\n const blocks = lines.map((line) => {\n const block = this.scroll.create(Block.blotName);\n block.insertAt(0, line);\n return block;\n });\n const ref = this.split(index);\n blocks.forEach((block) => {\n this.parent.insertBefore(block, ref);\n });\n if (text) {\n this.parent.insertBefore(this.scroll.create('text', text), ref);\n }\n }\n}\nBlockEmbed.scope = Scope.BLOCK_BLOT;\n// It is important for cursor behavior BlockEmbeds use tags that are block level elements\n\nfunction blockDelta(blot: BlockBlot, filter = true) {\n return blot\n .descendants(LeafBlot)\n .reduce((delta, leaf) => {\n if (leaf.length() === 0) {\n return delta;\n }\n return delta.insert(leaf.value(), bubbleFormats(leaf, {}, filter));\n }, new Delta())\n .insert('\\n', bubbleFormats(blot));\n}\n\nfunction bubbleFormats(\n blot: Blot | null,\n formats: Record = {},\n filter = true,\n): Record {\n if (blot == null) return formats;\n if ('formats' in blot && typeof blot.formats === 'function') {\n formats = {\n ...formats,\n ...blot.formats(),\n };\n if (filter) {\n // exclude syntax highlighting from deltas and getFormat()\n delete formats['code-token'];\n }\n }\n if (\n blot.parent == null ||\n blot.parent.statics.blotName === 'scroll' ||\n blot.parent.statics.scope !== blot.statics.scope\n ) {\n return formats;\n }\n return bubbleFormats(blot.parent, formats, filter);\n}\n\nexport { blockDelta, bubbleFormats, BlockEmbed, Block as default };\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file diff --git a/public/assets/quill/blots/break.d.ts b/public/assets/quill/blots/break.d.ts new file mode 100644 index 0000000..0319649 --- /dev/null +++ b/public/assets/quill/blots/break.d.ts @@ -0,0 +1,8 @@ +import { EmbedBlot } from 'parchment'; +declare class Break extends EmbedBlot { + static value(): undefined; + optimize(): void; + length(): number; + value(): string; +} +export default Break; diff --git a/public/assets/quill/blots/break.js b/public/assets/quill/blots/break.js new file mode 100644 index 0000000..521a3ac --- /dev/null +++ b/public/assets/quill/blots/break.js @@ -0,0 +1,21 @@ +import { EmbedBlot } from 'parchment'; +class Break extends EmbedBlot { + static value() { + return undefined; + } + optimize() { + if (this.prev || this.next) { + this.remove(); + } + } + length() { + return 0; + } + value() { + return ''; + } +} +Break.blotName = 'break'; +Break.tagName = 'BR'; +export default Break; +//# sourceMappingURL=break.js.map \ No newline at end of file diff --git a/public/assets/quill/blots/break.js.map b/public/assets/quill/blots/break.js.map new file mode 100644 index 0000000..3f870c7 --- /dev/null +++ b/public/assets/quill/blots/break.js.map @@ -0,0 +1 @@ +{"version":3,"file":"break.js","names":["EmbedBlot","Break","value","undefined","optimize","prev","next","remove","length","blotName","tagName"],"sources":["../../src/blots/break.ts"],"sourcesContent":["import { EmbedBlot } from 'parchment';\n\nclass Break extends EmbedBlot {\n static value() {\n return undefined;\n }\n\n optimize() {\n if (this.prev || this.next) {\n this.remove();\n }\n }\n\n length() {\n return 0;\n }\n\n value() {\n return '';\n }\n}\nBreak.blotName = 'break';\nBreak.tagName = 'BR';\n\nexport default Break;\n"],"mappings":"AAAA,SAASA,SAAS,QAAQ,WAAW;AAErC,MAAMC,KAAK,SAASD,SAAS,CAAC;EAC5B,OAAOE,KAAKA,CAAA,EAAG;IACb,OAAOC,SAAS;EAClB;EAEAC,QAAQA,CAAA,EAAG;IACT,IAAI,IAAI,CAACC,IAAI,IAAI,IAAI,CAACC,IAAI,EAAE;MAC1B,IAAI,CAACC,MAAM,CAAC,CAAC;IACf;EACF;EAEAC,MAAMA,CAAA,EAAG;IACP,OAAO,CAAC;EACV;EAEAN,KAAKA,CAAA,EAAG;IACN,OAAO,EAAE;EACX;AACF;AACAD,KAAK,CAACQ,QAAQ,GAAG,OAAO;AACxBR,KAAK,CAACS,OAAO,GAAG,IAAI;AAEpB,eAAeT,KAAK","ignoreList":[]} \ No newline at end of file diff --git a/public/assets/quill/blots/container.d.ts b/public/assets/quill/blots/container.d.ts new file mode 100644 index 0000000..88c01db --- /dev/null +++ b/public/assets/quill/blots/container.d.ts @@ -0,0 +1,4 @@ +import { ContainerBlot } from 'parchment'; +declare class Container extends ContainerBlot { +} +export default Container; diff --git a/public/assets/quill/blots/container.js b/public/assets/quill/blots/container.js new file mode 100644 index 0000000..a8f4f6b --- /dev/null +++ b/public/assets/quill/blots/container.js @@ -0,0 +1,4 @@ +import { ContainerBlot } from 'parchment'; +class Container extends ContainerBlot {} +export default Container; +//# sourceMappingURL=container.js.map \ No newline at end of file diff --git a/public/assets/quill/blots/container.js.map b/public/assets/quill/blots/container.js.map new file mode 100644 index 0000000..e88accb --- /dev/null +++ b/public/assets/quill/blots/container.js.map @@ -0,0 +1 @@ +{"version":3,"file":"container.js","names":["ContainerBlot","Container"],"sources":["../../src/blots/container.ts"],"sourcesContent":["import { ContainerBlot } from 'parchment';\n\nclass Container extends ContainerBlot {}\n\nexport default Container;\n"],"mappings":"AAAA,SAASA,aAAa,QAAQ,WAAW;AAEzC,MAAMC,SAAS,SAASD,aAAa,CAAC;AAEtC,eAAeC,SAAS","ignoreList":[]} \ No newline at end of file diff --git a/public/assets/quill/blots/cursor.d.ts b/public/assets/quill/blots/cursor.d.ts new file mode 100644 index 0000000..d076448 --- /dev/null +++ b/public/assets/quill/blots/cursor.d.ts @@ -0,0 +1,26 @@ +import { EmbedBlot } from 'parchment'; +import type { ScrollBlot } from 'parchment'; +import type Selection from '../core/selection.js'; +import type { EmbedContextRange } from './embed.js'; +declare class Cursor extends EmbedBlot { + static blotName: string; + static className: string; + static tagName: string; + static CONTENTS: string; + static value(): undefined; + selection: Selection; + textNode: Text; + savedLength: number; + constructor(scroll: ScrollBlot, domNode: HTMLElement, selection: Selection); + detach(): void; + format(name: string, value: unknown): void; + index(node: Node, offset: number): number; + length(): number; + position(): [Text, number]; + remove(): void; + restore(): EmbedContextRange | null; + update(mutations: MutationRecord[], context: Record): void; + optimize(context?: unknown): void; + value(): string; +} +export default Cursor; diff --git a/public/assets/quill/blots/cursor.js b/public/assets/quill/blots/cursor.js new file mode 100644 index 0000000..1de0f90 --- /dev/null +++ b/public/assets/quill/blots/cursor.js @@ -0,0 +1,170 @@ +import { EmbedBlot, Scope } from 'parchment'; +import TextBlot from './text.js'; +class Cursor extends EmbedBlot { + static blotName = 'cursor'; + static className = 'ql-cursor'; + static tagName = 'span'; + static CONTENTS = '\uFEFF'; // Zero width no break space + + static value() { + return undefined; + } + constructor(scroll, domNode, selection) { + super(scroll, domNode); + this.selection = selection; + this.textNode = document.createTextNode(Cursor.CONTENTS); + this.domNode.appendChild(this.textNode); + this.savedLength = 0; + } + detach() { + // super.detach() will also clear domNode.__blot + if (this.parent != null) this.parent.removeChild(this); + } + format(name, value) { + if (this.savedLength !== 0) { + super.format(name, value); + return; + } + // TODO: Fix this next time the file is edited. + // eslint-disable-next-line @typescript-eslint/no-this-alias + let target = this; + let index = 0; + while (target != null && target.statics.scope !== Scope.BLOCK_BLOT) { + index += target.offset(target.parent); + target = target.parent; + } + if (target != null) { + this.savedLength = Cursor.CONTENTS.length; + // @ts-expect-error TODO: allow empty context in Parchment + target.optimize(); + target.formatAt(index, Cursor.CONTENTS.length, name, value); + this.savedLength = 0; + } + } + index(node, offset) { + if (node === this.textNode) return 0; + return super.index(node, offset); + } + length() { + return this.savedLength; + } + position() { + return [this.textNode, this.textNode.data.length]; + } + remove() { + super.remove(); + // @ts-expect-error Fix me later + this.parent = null; + } + restore() { + if (this.selection.composing || this.parent == null) return null; + const range = this.selection.getNativeRange(); + // Browser may push down styles/nodes inside the cursor blot. + // https://dvcs.w3.org/hg/editing/raw-file/tip/editing.html#push-down-values + while (this.domNode.lastChild != null && this.domNode.lastChild !== this.textNode) { + // @ts-expect-error Fix me later + this.domNode.parentNode.insertBefore(this.domNode.lastChild, this.domNode); + } + const prevTextBlot = this.prev instanceof TextBlot ? this.prev : null; + const prevTextLength = prevTextBlot ? prevTextBlot.length() : 0; + const nextTextBlot = this.next instanceof TextBlot ? this.next : null; + // @ts-expect-error TODO: make TextBlot.text public + const nextText = nextTextBlot ? nextTextBlot.text : ''; + const { + textNode + } = this; + // take text from inside this blot and reset it + const newText = textNode.data.split(Cursor.CONTENTS).join(''); + textNode.data = Cursor.CONTENTS; + + // proactively merge TextBlots around cursor so that optimization + // doesn't lose the cursor. the reason we are here in cursor.restore + // could be that the user clicked in prevTextBlot or nextTextBlot, or + // the user typed something. + let mergedTextBlot; + if (prevTextBlot) { + mergedTextBlot = prevTextBlot; + if (newText || nextTextBlot) { + prevTextBlot.insertAt(prevTextBlot.length(), newText + nextText); + if (nextTextBlot) { + nextTextBlot.remove(); + } + } + } else if (nextTextBlot) { + mergedTextBlot = nextTextBlot; + nextTextBlot.insertAt(0, newText); + } else { + const newTextNode = document.createTextNode(newText); + mergedTextBlot = this.scroll.create(newTextNode); + this.parent.insertBefore(mergedTextBlot, this); + } + this.remove(); + if (range) { + // calculate selection to restore + const remapOffset = (node, offset) => { + if (prevTextBlot && node === prevTextBlot.domNode) { + return offset; + } + if (node === textNode) { + return prevTextLength + offset - 1; + } + if (nextTextBlot && node === nextTextBlot.domNode) { + return prevTextLength + newText.length + offset; + } + return null; + }; + const start = remapOffset(range.start.node, range.start.offset); + const end = remapOffset(range.end.node, range.end.offset); + if (start !== null && end !== null) { + return { + startNode: mergedTextBlot.domNode, + startOffset: start, + endNode: mergedTextBlot.domNode, + endOffset: end + }; + } + } + return null; + } + update(mutations, context) { + if (mutations.some(mutation => { + return mutation.type === 'characterData' && mutation.target === this.textNode; + })) { + const range = this.restore(); + if (range) context.range = range; + } + } + + // Avoid .ql-cursor being a descendant of ``. + // The reason is Safari pushes down `` on text insertion. + // That will cause DOM nodes not sync with the model. + // + // For example ({I} is the caret), given the markup: + // \uFEFF{I} + // When typing a char "x", `` will be pushed down inside the `` first: + // \uFEFF{I} + // And then "x" will be inserted after ``: + // \uFEFFd{I} + optimize(context) { + // @ts-expect-error Fix me later + super.optimize(context); + let { + parent + } = this; + while (parent) { + if (parent.domNode.tagName === 'A') { + this.savedLength = Cursor.CONTENTS.length; + // @ts-expect-error TODO: make isolate generic + parent.isolate(this.offset(parent), this.length()).unwrap(); + this.savedLength = 0; + break; + } + parent = parent.parent; + } + } + value() { + return ''; + } +} +export default Cursor; +//# sourceMappingURL=cursor.js.map \ No newline at end of file diff --git a/public/assets/quill/blots/cursor.js.map b/public/assets/quill/blots/cursor.js.map new file mode 100644 index 0000000..7401ead --- /dev/null +++ b/public/assets/quill/blots/cursor.js.map @@ -0,0 +1 @@ +{"version":3,"file":"cursor.js","names":["EmbedBlot","Scope","TextBlot","Cursor","blotName","className","tagName","CONTENTS","value","undefined","constructor","scroll","domNode","selection","textNode","document","createTextNode","appendChild","savedLength","detach","parent","removeChild","format","name","target","index","statics","scope","BLOCK_BLOT","offset","length","optimize","formatAt","node","position","data","remove","restore","composing","range","getNativeRange","lastChild","parentNode","insertBefore","prevTextBlot","prev","prevTextLength","nextTextBlot","next","nextText","text","newText","split","join","mergedTextBlot","insertAt","newTextNode","create","remapOffset","start","end","startNode","startOffset","endNode","endOffset","update","mutations","context","some","mutation","type","isolate","unwrap"],"sources":["../../src/blots/cursor.ts"],"sourcesContent":["import { EmbedBlot, Scope } from 'parchment';\nimport type { Parent, ScrollBlot } from 'parchment';\nimport type Selection from '../core/selection.js';\nimport TextBlot from './text.js';\nimport type { EmbedContextRange } from './embed.js';\n\nclass Cursor extends EmbedBlot {\n static blotName = 'cursor';\n static className = 'ql-cursor';\n static tagName = 'span';\n static CONTENTS = '\\uFEFF'; // Zero width no break space\n\n static value() {\n return undefined;\n }\n\n selection: Selection;\n textNode: Text;\n savedLength: number;\n\n constructor(scroll: ScrollBlot, domNode: HTMLElement, selection: Selection) {\n super(scroll, domNode);\n this.selection = selection;\n this.textNode = document.createTextNode(Cursor.CONTENTS);\n this.domNode.appendChild(this.textNode);\n this.savedLength = 0;\n }\n\n detach() {\n // super.detach() will also clear domNode.__blot\n if (this.parent != null) this.parent.removeChild(this);\n }\n\n format(name: string, value: unknown) {\n if (this.savedLength !== 0) {\n super.format(name, value);\n return;\n }\n // TODO: Fix this next time the file is edited.\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n let target: Parent | this = this;\n let index = 0;\n while (target != null && target.statics.scope !== Scope.BLOCK_BLOT) {\n index += target.offset(target.parent);\n target = target.parent;\n }\n if (target != null) {\n this.savedLength = Cursor.CONTENTS.length;\n // @ts-expect-error TODO: allow empty context in Parchment\n target.optimize();\n target.formatAt(index, Cursor.CONTENTS.length, name, value);\n this.savedLength = 0;\n }\n }\n\n index(node: Node, offset: number) {\n if (node === this.textNode) return 0;\n return super.index(node, offset);\n }\n\n length() {\n return this.savedLength;\n }\n\n position(): [Text, number] {\n return [this.textNode, this.textNode.data.length];\n }\n\n remove() {\n super.remove();\n // @ts-expect-error Fix me later\n this.parent = null;\n }\n\n restore(): EmbedContextRange | null {\n if (this.selection.composing || this.parent == null) return null;\n const range = this.selection.getNativeRange();\n // Browser may push down styles/nodes inside the cursor blot.\n // https://dvcs.w3.org/hg/editing/raw-file/tip/editing.html#push-down-values\n while (\n this.domNode.lastChild != null &&\n this.domNode.lastChild !== this.textNode\n ) {\n // @ts-expect-error Fix me later\n this.domNode.parentNode.insertBefore(\n this.domNode.lastChild,\n this.domNode,\n );\n }\n\n const prevTextBlot = this.prev instanceof TextBlot ? this.prev : null;\n const prevTextLength = prevTextBlot ? prevTextBlot.length() : 0;\n const nextTextBlot = this.next instanceof TextBlot ? this.next : null;\n // @ts-expect-error TODO: make TextBlot.text public\n const nextText = nextTextBlot ? nextTextBlot.text : '';\n const { textNode } = this;\n // take text from inside this blot and reset it\n const newText = textNode.data.split(Cursor.CONTENTS).join('');\n textNode.data = Cursor.CONTENTS;\n\n // proactively merge TextBlots around cursor so that optimization\n // doesn't lose the cursor. the reason we are here in cursor.restore\n // could be that the user clicked in prevTextBlot or nextTextBlot, or\n // the user typed something.\n let mergedTextBlot;\n if (prevTextBlot) {\n mergedTextBlot = prevTextBlot;\n if (newText || nextTextBlot) {\n prevTextBlot.insertAt(prevTextBlot.length(), newText + nextText);\n if (nextTextBlot) {\n nextTextBlot.remove();\n }\n }\n } else if (nextTextBlot) {\n mergedTextBlot = nextTextBlot;\n nextTextBlot.insertAt(0, newText);\n } else {\n const newTextNode = document.createTextNode(newText);\n mergedTextBlot = this.scroll.create(newTextNode);\n this.parent.insertBefore(mergedTextBlot, this);\n }\n\n this.remove();\n if (range) {\n // calculate selection to restore\n const remapOffset = (node: Node, offset: number) => {\n if (prevTextBlot && node === prevTextBlot.domNode) {\n return offset;\n }\n if (node === textNode) {\n return prevTextLength + offset - 1;\n }\n if (nextTextBlot && node === nextTextBlot.domNode) {\n return prevTextLength + newText.length + offset;\n }\n return null;\n };\n\n const start = remapOffset(range.start.node, range.start.offset);\n const end = remapOffset(range.end.node, range.end.offset);\n if (start !== null && end !== null) {\n return {\n startNode: mergedTextBlot.domNode,\n startOffset: start,\n endNode: mergedTextBlot.domNode,\n endOffset: end,\n };\n }\n }\n return null;\n }\n\n update(mutations: MutationRecord[], context: Record) {\n if (\n mutations.some((mutation) => {\n return (\n mutation.type === 'characterData' && mutation.target === this.textNode\n );\n })\n ) {\n const range = this.restore();\n if (range) context.range = range;\n }\n }\n\n // Avoid .ql-cursor being a descendant of ``.\n // The reason is Safari pushes down `` on text insertion.\n // That will cause DOM nodes not sync with the model.\n //\n // For example ({I} is the caret), given the markup:\n // \\uFEFF{I}\n // When typing a char \"x\", `` will be pushed down inside the `` first:\n // \\uFEFF{I}\n // And then \"x\" will be inserted after ``:\n // \\uFEFFd{I}\n optimize(context?: unknown) {\n // @ts-expect-error Fix me later\n super.optimize(context);\n\n let { parent } = this;\n while (parent) {\n if (parent.domNode.tagName === 'A') {\n this.savedLength = Cursor.CONTENTS.length;\n // @ts-expect-error TODO: make isolate generic\n parent.isolate(this.offset(parent), this.length()).unwrap();\n this.savedLength = 0;\n break;\n }\n parent = parent.parent;\n }\n }\n\n value() {\n return '';\n }\n}\n\nexport default Cursor;\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file diff --git a/public/assets/quill/blots/embed.d.ts b/public/assets/quill/blots/embed.d.ts new file mode 100644 index 0000000..1f512dd --- /dev/null +++ b/public/assets/quill/blots/embed.d.ts @@ -0,0 +1,18 @@ +import type { ScrollBlot } from 'parchment'; +import { EmbedBlot } from 'parchment'; +export interface EmbedContextRange { + startNode: Node | Text; + startOffset: number; + endNode?: Node | Text; + endOffset?: number; +} +declare class Embed extends EmbedBlot { + contentNode: HTMLSpanElement; + leftGuard: Text; + rightGuard: Text; + constructor(scroll: ScrollBlot, node: Node); + index(node: Node, offset: number): number; + restore(node: Text): EmbedContextRange | null; + update(mutations: MutationRecord[], context: Record): void; +} +export default Embed; diff --git a/public/assets/quill/blots/embed.js b/public/assets/quill/blots/embed.js new file mode 100644 index 0000000..d9ac8aa --- /dev/null +++ b/public/assets/quill/blots/embed.js @@ -0,0 +1,72 @@ +import { EmbedBlot } from 'parchment'; +import TextBlot from './text.js'; +const GUARD_TEXT = '\uFEFF'; +class Embed extends EmbedBlot { + constructor(scroll, node) { + super(scroll, node); + this.contentNode = document.createElement('span'); + this.contentNode.setAttribute('contenteditable', 'false'); + Array.from(this.domNode.childNodes).forEach(childNode => { + this.contentNode.appendChild(childNode); + }); + this.leftGuard = document.createTextNode(GUARD_TEXT); + this.rightGuard = document.createTextNode(GUARD_TEXT); + this.domNode.appendChild(this.leftGuard); + this.domNode.appendChild(this.contentNode); + this.domNode.appendChild(this.rightGuard); + } + index(node, offset) { + if (node === this.leftGuard) return 0; + if (node === this.rightGuard) return 1; + return super.index(node, offset); + } + restore(node) { + let range = null; + let textNode; + const text = node.data.split(GUARD_TEXT).join(''); + if (node === this.leftGuard) { + if (this.prev instanceof TextBlot) { + const prevLength = this.prev.length(); + this.prev.insertAt(prevLength, text); + range = { + startNode: this.prev.domNode, + startOffset: prevLength + text.length + }; + } else { + textNode = document.createTextNode(text); + this.parent.insertBefore(this.scroll.create(textNode), this); + range = { + startNode: textNode, + startOffset: text.length + }; + } + } else if (node === this.rightGuard) { + if (this.next instanceof TextBlot) { + this.next.insertAt(0, text); + range = { + startNode: this.next.domNode, + startOffset: text.length + }; + } else { + textNode = document.createTextNode(text); + this.parent.insertBefore(this.scroll.create(textNode), this.next); + range = { + startNode: textNode, + startOffset: text.length + }; + } + } + node.data = GUARD_TEXT; + return range; + } + update(mutations, context) { + mutations.forEach(mutation => { + if (mutation.type === 'characterData' && (mutation.target === this.leftGuard || mutation.target === this.rightGuard)) { + const range = this.restore(mutation.target); + if (range) context.range = range; + } + }); + } +} +export default Embed; +//# sourceMappingURL=embed.js.map \ No newline at end of file diff --git a/public/assets/quill/blots/embed.js.map b/public/assets/quill/blots/embed.js.map new file mode 100644 index 0000000..c2d6774 --- /dev/null +++ b/public/assets/quill/blots/embed.js.map @@ -0,0 +1 @@ +{"version":3,"file":"embed.js","names":["EmbedBlot","TextBlot","GUARD_TEXT","Embed","constructor","scroll","node","contentNode","document","createElement","setAttribute","Array","from","domNode","childNodes","forEach","childNode","appendChild","leftGuard","createTextNode","rightGuard","index","offset","restore","range","textNode","text","data","split","join","prev","prevLength","length","insertAt","startNode","startOffset","parent","insertBefore","create","next","update","mutations","context","mutation","type","target"],"sources":["../../src/blots/embed.ts"],"sourcesContent":["import type { ScrollBlot } from 'parchment';\nimport { EmbedBlot } from 'parchment';\nimport TextBlot from './text.js';\n\nconst GUARD_TEXT = '\\uFEFF';\n\nexport interface EmbedContextRange {\n startNode: Node | Text;\n startOffset: number;\n endNode?: Node | Text;\n endOffset?: number;\n}\n\nclass Embed extends EmbedBlot {\n contentNode: HTMLSpanElement;\n leftGuard: Text;\n rightGuard: Text;\n\n constructor(scroll: ScrollBlot, node: Node) {\n super(scroll, node);\n this.contentNode = document.createElement('span');\n this.contentNode.setAttribute('contenteditable', 'false');\n Array.from(this.domNode.childNodes).forEach((childNode) => {\n this.contentNode.appendChild(childNode);\n });\n this.leftGuard = document.createTextNode(GUARD_TEXT);\n this.rightGuard = document.createTextNode(GUARD_TEXT);\n this.domNode.appendChild(this.leftGuard);\n this.domNode.appendChild(this.contentNode);\n this.domNode.appendChild(this.rightGuard);\n }\n\n index(node: Node, offset: number) {\n if (node === this.leftGuard) return 0;\n if (node === this.rightGuard) return 1;\n return super.index(node, offset);\n }\n\n restore(node: Text): EmbedContextRange | null {\n let range: EmbedContextRange | null = null;\n let textNode: Text;\n const text = node.data.split(GUARD_TEXT).join('');\n if (node === this.leftGuard) {\n if (this.prev instanceof TextBlot) {\n const prevLength = this.prev.length();\n this.prev.insertAt(prevLength, text);\n range = {\n startNode: this.prev.domNode,\n startOffset: prevLength + text.length,\n };\n } else {\n textNode = document.createTextNode(text);\n this.parent.insertBefore(this.scroll.create(textNode), this);\n range = {\n startNode: textNode,\n startOffset: text.length,\n };\n }\n } else if (node === this.rightGuard) {\n if (this.next instanceof TextBlot) {\n this.next.insertAt(0, text);\n range = {\n startNode: this.next.domNode,\n startOffset: text.length,\n };\n } else {\n textNode = document.createTextNode(text);\n this.parent.insertBefore(this.scroll.create(textNode), this.next);\n range = {\n startNode: textNode,\n startOffset: text.length,\n };\n }\n }\n node.data = GUARD_TEXT;\n return range;\n }\n\n update(mutations: MutationRecord[], context: Record) {\n mutations.forEach((mutation) => {\n if (\n mutation.type === 'characterData' &&\n (mutation.target === this.leftGuard ||\n mutation.target === this.rightGuard)\n ) {\n const range = this.restore(mutation.target as Text);\n if (range) context.range = range;\n }\n });\n }\n}\n\nexport default Embed;\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file diff --git a/public/assets/quill/blots/inline.d.ts b/public/assets/quill/blots/inline.d.ts new file mode 100644 index 0000000..b9ad0ed --- /dev/null +++ b/public/assets/quill/blots/inline.d.ts @@ -0,0 +1,12 @@ +import { InlineBlot } from 'parchment'; +import type { BlotConstructor } from 'parchment'; +declare class Inline extends InlineBlot { + static allowedChildren: BlotConstructor[]; + static order: string[]; + static compare(self: string, other: string): number; + formatAt(index: number, length: number, name: string, value: unknown): void; + optimize(context: { + [key: string]: any; + }): void; +} +export default Inline; diff --git a/public/assets/quill/blots/inline.js b/public/assets/quill/blots/inline.js new file mode 100644 index 0000000..3246259 --- /dev/null +++ b/public/assets/quill/blots/inline.js @@ -0,0 +1,48 @@ +import { EmbedBlot, InlineBlot, Scope } from 'parchment'; +import Break from './break.js'; +import Text from './text.js'; +class Inline extends InlineBlot { + static allowedChildren = [Inline, Break, EmbedBlot, Text]; + // Lower index means deeper in the DOM tree, since not found (-1) is for embeds + static order = ['cursor', 'inline', + // Must be lower + 'link', + // Chrome wants to be lower + 'underline', 'strike', 'italic', 'bold', 'script', 'code' // Must be higher + ]; + static compare(self, other) { + const selfIndex = Inline.order.indexOf(self); + const otherIndex = Inline.order.indexOf(other); + if (selfIndex >= 0 || otherIndex >= 0) { + return selfIndex - otherIndex; + } + if (self === other) { + return 0; + } + if (self < other) { + return -1; + } + return 1; + } + formatAt(index, length, name, value) { + if (Inline.compare(this.statics.blotName, name) < 0 && this.scroll.query(name, Scope.BLOT)) { + const blot = this.isolate(index, length); + if (value) { + blot.wrap(name, value); + } + } else { + super.formatAt(index, length, name, value); + } + } + optimize(context) { + super.optimize(context); + if (this.parent instanceof Inline && Inline.compare(this.statics.blotName, this.parent.statics.blotName) > 0) { + const parent = this.parent.isolate(this.offset(), this.length()); + // @ts-expect-error TODO: make isolate generic + this.moveChildren(parent); + parent.wrap(this); + } + } +} +export default Inline; +//# sourceMappingURL=inline.js.map \ No newline at end of file diff --git a/public/assets/quill/blots/inline.js.map b/public/assets/quill/blots/inline.js.map new file mode 100644 index 0000000..977a43c --- /dev/null +++ b/public/assets/quill/blots/inline.js.map @@ -0,0 +1 @@ +{"version":3,"file":"inline.js","names":["EmbedBlot","InlineBlot","Scope","Break","Text","Inline","allowedChildren","order","compare","self","other","selfIndex","indexOf","otherIndex","formatAt","index","length","name","value","statics","blotName","scroll","query","BLOT","blot","isolate","wrap","optimize","context","parent","offset","moveChildren"],"sources":["../../src/blots/inline.ts"],"sourcesContent":["import { EmbedBlot, InlineBlot, Scope } from 'parchment';\nimport type { BlotConstructor } from 'parchment';\nimport Break from './break.js';\nimport Text from './text.js';\n\nclass Inline extends InlineBlot {\n static allowedChildren: BlotConstructor[] = [Inline, Break, EmbedBlot, Text];\n // Lower index means deeper in the DOM tree, since not found (-1) is for embeds\n static order = [\n 'cursor',\n 'inline', // Must be lower\n 'link', // Chrome wants to be lower\n 'underline',\n 'strike',\n 'italic',\n 'bold',\n 'script',\n 'code', // Must be higher\n ];\n\n static compare(self: string, other: string) {\n const selfIndex = Inline.order.indexOf(self);\n const otherIndex = Inline.order.indexOf(other);\n if (selfIndex >= 0 || otherIndex >= 0) {\n return selfIndex - otherIndex;\n }\n if (self === other) {\n return 0;\n }\n if (self < other) {\n return -1;\n }\n return 1;\n }\n\n formatAt(index: number, length: number, name: string, value: unknown) {\n if (\n Inline.compare(this.statics.blotName, name) < 0 &&\n this.scroll.query(name, Scope.BLOT)\n ) {\n const blot = this.isolate(index, length);\n if (value) {\n blot.wrap(name, value);\n }\n } else {\n super.formatAt(index, length, name, value);\n }\n }\n\n optimize(context: { [key: string]: any }) {\n super.optimize(context);\n if (\n this.parent instanceof Inline &&\n Inline.compare(this.statics.blotName, this.parent.statics.blotName) > 0\n ) {\n const parent = this.parent.isolate(this.offset(), this.length());\n // @ts-expect-error TODO: make isolate generic\n this.moveChildren(parent);\n parent.wrap(this);\n }\n }\n}\n\nexport default Inline;\n"],"mappings":"AAAA,SAASA,SAAS,EAAEC,UAAU,EAAEC,KAAK,QAAQ,WAAW;AAExD,OAAOC,KAAK,MAAM,YAAY;AAC9B,OAAOC,IAAI,MAAM,WAAW;AAE5B,MAAMC,MAAM,SAASJ,UAAU,CAAC;EAC9B,OAAOK,eAAe,GAAsB,CAACD,MAAM,EAAEF,KAAK,EAAEH,SAAS,EAAEI,IAAI,CAAC;EAC5E;EACA,OAAOG,KAAK,GAAG,CACb,QAAQ,EACR,QAAQ;EAAE;EACV,MAAM;EAAE;EACR,WAAW,EACX,QAAQ,EACR,QAAQ,EACR,MAAM,EACN,QAAQ,EACR,MAAM,CAAE;EAAA,CACT;EAED,OAAOC,OAAOA,CAACC,IAAY,EAAEC,KAAa,EAAE;IAC1C,MAAMC,SAAS,GAAGN,MAAM,CAACE,KAAK,CAACK,OAAO,CAACH,IAAI,CAAC;IAC5C,MAAMI,UAAU,GAAGR,MAAM,CAACE,KAAK,CAACK,OAAO,CAACF,KAAK,CAAC;IAC9C,IAAIC,SAAS,IAAI,CAAC,IAAIE,UAAU,IAAI,CAAC,EAAE;MACrC,OAAOF,SAAS,GAAGE,UAAU;IAC/B;IACA,IAAIJ,IAAI,KAAKC,KAAK,EAAE;MAClB,OAAO,CAAC;IACV;IACA,IAAID,IAAI,GAAGC,KAAK,EAAE;MAChB,OAAO,CAAC,CAAC;IACX;IACA,OAAO,CAAC;EACV;EAEAI,QAAQA,CAACC,KAAa,EAAEC,MAAc,EAAEC,IAAY,EAAEC,KAAc,EAAE;IACpE,IACEb,MAAM,CAACG,OAAO,CAAC,IAAI,CAACW,OAAO,CAACC,QAAQ,EAAEH,IAAI,CAAC,GAAG,CAAC,IAC/C,IAAI,CAACI,MAAM,CAACC,KAAK,CAACL,IAAI,EAAEf,KAAK,CAACqB,IAAI,CAAC,EACnC;MACA,MAAMC,IAAI,GAAG,IAAI,CAACC,OAAO,CAACV,KAAK,EAAEC,MAAM,CAAC;MACxC,IAAIE,KAAK,EAAE;QACTM,IAAI,CAACE,IAAI,CAACT,IAAI,EAAEC,KAAK,CAAC;MACxB;IACF,CAAC,MAAM;MACL,KAAK,CAACJ,QAAQ,CAACC,KAAK,EAAEC,MAAM,EAAEC,IAAI,EAAEC,KAAK,CAAC;IAC5C;EACF;EAEAS,QAAQA,CAACC,OAA+B,EAAE;IACxC,KAAK,CAACD,QAAQ,CAACC,OAAO,CAAC;IACvB,IACE,IAAI,CAACC,MAAM,YAAYxB,MAAM,IAC7BA,MAAM,CAACG,OAAO,CAAC,IAAI,CAACW,OAAO,CAACC,QAAQ,EAAE,IAAI,CAACS,MAAM,CAACV,OAAO,CAACC,QAAQ,CAAC,GAAG,CAAC,EACvE;MACA,MAAMS,MAAM,GAAG,IAAI,CAACA,MAAM,CAACJ,OAAO,CAAC,IAAI,CAACK,MAAM,CAAC,CAAC,EAAE,IAAI,CAACd,MAAM,CAAC,CAAC,CAAC;MAChE;MACA,IAAI,CAACe,YAAY,CAACF,MAAM,CAAC;MACzBA,MAAM,CAACH,IAAI,CAAC,IAAI,CAAC;IACnB;EACF;AACF;AAEA,eAAerB,MAAM","ignoreList":[]} \ No newline at end of file diff --git a/public/assets/quill/blots/scroll.d.ts b/public/assets/quill/blots/scroll.d.ts new file mode 100644 index 0000000..fe6a98b --- /dev/null +++ b/public/assets/quill/blots/scroll.d.ts @@ -0,0 +1,49 @@ +import { LeafBlot, ScrollBlot } from 'parchment'; +import type { Blot, Registry } from 'parchment'; +import Delta from 'quill-delta'; +import Emitter from '../core/emitter.js'; +import type { EmitterSource } from '../core/emitter.js'; +import Block, { BlockEmbed } from './block.js'; +import Container from './container.js'; +declare class Scroll extends ScrollBlot { + static blotName: string; + static className: string; + static tagName: string; + static defaultChild: typeof Block; + static allowedChildren: (typeof Block | typeof BlockEmbed | typeof Container)[]; + emitter: Emitter; + batch: false | MutationRecord[]; + constructor(registry: Registry, domNode: HTMLDivElement, { emitter }: { + emitter: Emitter; + }); + batchStart(): void; + batchEnd(): void; + emitMount(blot: Blot): void; + emitUnmount(blot: Blot): void; + emitEmbedUpdate(blot: Blot, change: unknown): void; + deleteAt(index: number, length: number): void; + enable(enabled?: boolean): void; + formatAt(index: number, length: number, format: string, value: unknown): void; + insertAt(index: number, value: string, def?: unknown): void; + insertBefore(blot: Blot, ref?: Blot | null): void; + insertContents(index: number, delta: Delta): void; + isEnabled(): boolean; + leaf(index: number): [LeafBlot | null, number]; + line(index: number): [Block | BlockEmbed | null, number]; + lines(index?: number, length?: number): (Block | BlockEmbed)[]; + optimize(context?: { + [key: string]: any; + }): void; + optimize(mutations?: MutationRecord[], context?: { + [key: string]: any; + }): void; + path(index: number): [Blot, number][]; + remove(): void; + update(source?: EmitterSource): void; + update(mutations?: MutationRecord[]): void; + updateEmbedAt(index: number, key: string, change: unknown): void; + protected handleDragStart(event: DragEvent): void; + private deltaToRenderBlocks; + private createBlock; +} +export default Scroll; diff --git a/public/assets/quill/blots/scroll.js b/public/assets/quill/blots/scroll.js new file mode 100644 index 0000000..e2f045c --- /dev/null +++ b/public/assets/quill/blots/scroll.js @@ -0,0 +1,349 @@ +import { ContainerBlot, LeafBlot, Scope, ScrollBlot } from 'parchment'; +import Delta, { AttributeMap, Op } from 'quill-delta'; +import Emitter from '../core/emitter.js'; +import Block, { BlockEmbed, bubbleFormats } from './block.js'; +import Break from './break.js'; +import Container from './container.js'; +function isLine(blot) { + return blot instanceof Block || blot instanceof BlockEmbed; +} +function isUpdatable(blot) { + return typeof blot.updateContent === 'function'; +} +class Scroll extends ScrollBlot { + static blotName = 'scroll'; + static className = 'ql-editor'; + static tagName = 'DIV'; + static defaultChild = Block; + static allowedChildren = [Block, BlockEmbed, Container]; + constructor(registry, domNode, _ref) { + let { + emitter + } = _ref; + super(registry, domNode); + this.emitter = emitter; + this.batch = false; + this.optimize(); + this.enable(); + this.domNode.addEventListener('dragstart', e => this.handleDragStart(e)); + } + batchStart() { + if (!Array.isArray(this.batch)) { + this.batch = []; + } + } + batchEnd() { + if (!this.batch) return; + const mutations = this.batch; + this.batch = false; + this.update(mutations); + } + emitMount(blot) { + this.emitter.emit(Emitter.events.SCROLL_BLOT_MOUNT, blot); + } + emitUnmount(blot) { + this.emitter.emit(Emitter.events.SCROLL_BLOT_UNMOUNT, blot); + } + emitEmbedUpdate(blot, change) { + this.emitter.emit(Emitter.events.SCROLL_EMBED_UPDATE, blot, change); + } + deleteAt(index, length) { + const [first, offset] = this.line(index); + const [last] = this.line(index + length); + super.deleteAt(index, length); + if (last != null && first !== last && offset > 0) { + if (first instanceof BlockEmbed || last instanceof BlockEmbed) { + this.optimize(); + return; + } + const ref = last.children.head instanceof Break ? null : last.children.head; + // @ts-expect-error + first.moveChildren(last, ref); + // @ts-expect-error + first.remove(); + } + this.optimize(); + } + enable() { + let enabled = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true; + this.domNode.setAttribute('contenteditable', enabled ? 'true' : 'false'); + } + formatAt(index, length, format, value) { + super.formatAt(index, length, format, value); + this.optimize(); + } + insertAt(index, value, def) { + if (index >= this.length()) { + if (def == null || this.scroll.query(value, Scope.BLOCK) == null) { + const blot = this.scroll.create(this.statics.defaultChild.blotName); + this.appendChild(blot); + if (def == null && value.endsWith('\n')) { + blot.insertAt(0, value.slice(0, -1), def); + } else { + blot.insertAt(0, value, def); + } + } else { + const embed = this.scroll.create(value, def); + this.appendChild(embed); + } + } else { + super.insertAt(index, value, def); + } + this.optimize(); + } + insertBefore(blot, ref) { + if (blot.statics.scope === Scope.INLINE_BLOT) { + const wrapper = this.scroll.create(this.statics.defaultChild.blotName); + wrapper.appendChild(blot); + super.insertBefore(wrapper, ref); + } else { + super.insertBefore(blot, ref); + } + } + insertContents(index, delta) { + const renderBlocks = this.deltaToRenderBlocks(delta.concat(new Delta().insert('\n'))); + const last = renderBlocks.pop(); + if (last == null) return; + this.batchStart(); + const first = renderBlocks.shift(); + if (first) { + const shouldInsertNewlineChar = first.type === 'block' && (first.delta.length() === 0 || !this.descendant(BlockEmbed, index)[0] && index < this.length()); + const delta = first.type === 'block' ? first.delta : new Delta().insert({ + [first.key]: first.value + }); + insertInlineContents(this, index, delta); + const newlineCharLength = first.type === 'block' ? 1 : 0; + const lineEndIndex = index + delta.length() + newlineCharLength; + if (shouldInsertNewlineChar) { + this.insertAt(lineEndIndex - 1, '\n'); + } + const formats = bubbleFormats(this.line(index)[0]); + const attributes = AttributeMap.diff(formats, first.attributes) || {}; + Object.keys(attributes).forEach(name => { + this.formatAt(lineEndIndex - 1, 1, name, attributes[name]); + }); + index = lineEndIndex; + } + let [refBlot, refBlotOffset] = this.children.find(index); + if (renderBlocks.length) { + if (refBlot) { + refBlot = refBlot.split(refBlotOffset); + refBlotOffset = 0; + } + renderBlocks.forEach(renderBlock => { + if (renderBlock.type === 'block') { + const block = this.createBlock(renderBlock.attributes, refBlot || undefined); + insertInlineContents(block, 0, renderBlock.delta); + } else { + const blockEmbed = this.create(renderBlock.key, renderBlock.value); + this.insertBefore(blockEmbed, refBlot || undefined); + Object.keys(renderBlock.attributes).forEach(name => { + blockEmbed.format(name, renderBlock.attributes[name]); + }); + } + }); + } + if (last.type === 'block' && last.delta.length()) { + const offset = refBlot ? refBlot.offset(refBlot.scroll) + refBlotOffset : this.length(); + insertInlineContents(this, offset, last.delta); + } + this.batchEnd(); + this.optimize(); + } + isEnabled() { + return this.domNode.getAttribute('contenteditable') === 'true'; + } + leaf(index) { + const last = this.path(index).pop(); + if (!last) { + return [null, -1]; + } + const [blot, offset] = last; + return blot instanceof LeafBlot ? [blot, offset] : [null, -1]; + } + line(index) { + if (index === this.length()) { + return this.line(index - 1); + } + // @ts-expect-error TODO: make descendant() generic + return this.descendant(isLine, index); + } + lines() { + let index = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0; + let length = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : Number.MAX_VALUE; + const getLines = (blot, blotIndex, blotLength) => { + let lines = []; + let lengthLeft = blotLength; + blot.children.forEachAt(blotIndex, blotLength, (child, childIndex, childLength) => { + if (isLine(child)) { + lines.push(child); + } else if (child instanceof ContainerBlot) { + lines = lines.concat(getLines(child, childIndex, lengthLeft)); + } + lengthLeft -= childLength; + }); + return lines; + }; + return getLines(this, index, length); + } + optimize() { + let mutations = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; + let context = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + if (this.batch) return; + super.optimize(mutations, context); + if (mutations.length > 0) { + this.emitter.emit(Emitter.events.SCROLL_OPTIMIZE, mutations, context); + } + } + path(index) { + return super.path(index).slice(1); // Exclude self + } + remove() { + // Never remove self + } + update(mutations) { + if (this.batch) { + if (Array.isArray(mutations)) { + this.batch = this.batch.concat(mutations); + } + return; + } + let source = Emitter.sources.USER; + if (typeof mutations === 'string') { + source = mutations; + } + if (!Array.isArray(mutations)) { + mutations = this.observer.takeRecords(); + } + mutations = mutations.filter(_ref2 => { + let { + target + } = _ref2; + const blot = this.find(target, true); + return blot && !isUpdatable(blot); + }); + if (mutations.length > 0) { + this.emitter.emit(Emitter.events.SCROLL_BEFORE_UPDATE, source, mutations); + } + super.update(mutations.concat([])); // pass copy + if (mutations.length > 0) { + this.emitter.emit(Emitter.events.SCROLL_UPDATE, source, mutations); + } + } + updateEmbedAt(index, key, change) { + // Currently it only supports top-level embeds (BlockEmbed). + // We can update `ParentBlot` in parchment to support inline embeds. + const [blot] = this.descendant(b => b instanceof BlockEmbed, index); + if (blot && blot.statics.blotName === key && isUpdatable(blot)) { + blot.updateContent(change); + } + } + handleDragStart(event) { + event.preventDefault(); + } + deltaToRenderBlocks(delta) { + const renderBlocks = []; + let currentBlockDelta = new Delta(); + delta.forEach(op => { + const insert = op?.insert; + if (!insert) return; + if (typeof insert === 'string') { + const splitted = insert.split('\n'); + splitted.slice(0, -1).forEach(text => { + currentBlockDelta.insert(text, op.attributes); + renderBlocks.push({ + type: 'block', + delta: currentBlockDelta, + attributes: op.attributes ?? {} + }); + currentBlockDelta = new Delta(); + }); + const last = splitted[splitted.length - 1]; + if (last) { + currentBlockDelta.insert(last, op.attributes); + } + } else { + const key = Object.keys(insert)[0]; + if (!key) return; + if (this.query(key, Scope.INLINE)) { + currentBlockDelta.push(op); + } else { + if (currentBlockDelta.length()) { + renderBlocks.push({ + type: 'block', + delta: currentBlockDelta, + attributes: {} + }); + } + currentBlockDelta = new Delta(); + renderBlocks.push({ + type: 'blockEmbed', + key, + value: insert[key], + attributes: op.attributes ?? {} + }); + } + } + }); + if (currentBlockDelta.length()) { + renderBlocks.push({ + type: 'block', + delta: currentBlockDelta, + attributes: {} + }); + } + return renderBlocks; + } + createBlock(attributes, refBlot) { + let blotName; + const formats = {}; + Object.entries(attributes).forEach(_ref3 => { + let [key, value] = _ref3; + const isBlockBlot = this.query(key, Scope.BLOCK & Scope.BLOT) != null; + if (isBlockBlot) { + blotName = key; + } else { + formats[key] = value; + } + }); + const block = this.create(blotName || this.statics.defaultChild.blotName, blotName ? attributes[blotName] : undefined); + this.insertBefore(block, refBlot || undefined); + const length = block.length(); + Object.entries(formats).forEach(_ref4 => { + let [key, value] = _ref4; + block.formatAt(0, length, key, value); + }); + return block; + } +} +function insertInlineContents(parent, index, inlineContents) { + inlineContents.reduce((index, op) => { + const length = Op.length(op); + let attributes = op.attributes || {}; + if (op.insert != null) { + if (typeof op.insert === 'string') { + const text = op.insert; + parent.insertAt(index, text); + const [leaf] = parent.descendant(LeafBlot, index); + const formats = bubbleFormats(leaf); + attributes = AttributeMap.diff(formats, attributes) || {}; + } else if (typeof op.insert === 'object') { + const key = Object.keys(op.insert)[0]; // There should only be one key + if (key == null) return index; + parent.insertAt(index, key, op.insert[key]); + const isInlineEmbed = parent.scroll.query(key, Scope.INLINE) != null; + if (isInlineEmbed) { + const [leaf] = parent.descendant(LeafBlot, index); + const formats = bubbleFormats(leaf); + attributes = AttributeMap.diff(formats, attributes) || {}; + } + } + } + Object.keys(attributes).forEach(key => { + parent.formatAt(index, length, key, attributes[key]); + }); + return index + length; + }, index); +} +export default Scroll; +//# sourceMappingURL=scroll.js.map \ No newline at end of file diff --git a/public/assets/quill/blots/scroll.js.map b/public/assets/quill/blots/scroll.js.map new file mode 100644 index 0000000..f1eee44 --- /dev/null +++ b/public/assets/quill/blots/scroll.js.map @@ -0,0 +1 @@ +{"version":3,"file":"scroll.js","names":["ContainerBlot","LeafBlot","Scope","ScrollBlot","Delta","AttributeMap","Op","Emitter","Block","BlockEmbed","bubbleFormats","Break","Container","isLine","blot","isUpdatable","updateContent","Scroll","blotName","className","tagName","defaultChild","allowedChildren","constructor","registry","domNode","_ref","emitter","batch","optimize","enable","addEventListener","e","handleDragStart","batchStart","Array","isArray","batchEnd","mutations","update","emitMount","emit","events","SCROLL_BLOT_MOUNT","emitUnmount","SCROLL_BLOT_UNMOUNT","emitEmbedUpdate","change","SCROLL_EMBED_UPDATE","deleteAt","index","length","first","offset","line","last","ref","children","head","moveChildren","remove","enabled","arguments","undefined","setAttribute","formatAt","format","value","insertAt","def","scroll","query","BLOCK","create","statics","appendChild","endsWith","slice","embed","insertBefore","scope","INLINE_BLOT","wrapper","insertContents","delta","renderBlocks","deltaToRenderBlocks","concat","insert","pop","shift","shouldInsertNewlineChar","type","descendant","key","insertInlineContents","newlineCharLength","lineEndIndex","formats","attributes","diff","Object","keys","forEach","name","refBlot","refBlotOffset","find","split","renderBlock","block","createBlock","blockEmbed","isEnabled","getAttribute","leaf","path","lines","Number","MAX_VALUE","getLines","blotIndex","blotLength","lengthLeft","forEachAt","child","childIndex","childLength","push","context","SCROLL_OPTIMIZE","source","sources","USER","observer","takeRecords","filter","_ref2","target","SCROLL_BEFORE_UPDATE","SCROLL_UPDATE","updateEmbedAt","b","event","preventDefault","currentBlockDelta","op","splitted","text","INLINE","entries","_ref3","isBlockBlot","BLOT","_ref4","parent","inlineContents","reduce","isInlineEmbed"],"sources":["../../src/blots/scroll.ts"],"sourcesContent":["import { ContainerBlot, LeafBlot, Scope, ScrollBlot } from 'parchment';\nimport type { Blot, Parent, EmbedBlot, ParentBlot, Registry } from 'parchment';\nimport Delta, { AttributeMap, Op } from 'quill-delta';\nimport Emitter from '../core/emitter.js';\nimport type { EmitterSource } from '../core/emitter.js';\nimport Block, { BlockEmbed, bubbleFormats } from './block.js';\nimport Break from './break.js';\nimport Container from './container.js';\n\ntype RenderBlock =\n | {\n type: 'blockEmbed';\n attributes: AttributeMap;\n key: string;\n value: unknown;\n }\n | { type: 'block'; attributes: AttributeMap; delta: Delta };\n\nfunction isLine(blot: unknown): blot is Block | BlockEmbed {\n return blot instanceof Block || blot instanceof BlockEmbed;\n}\n\ninterface UpdatableEmbed {\n updateContent(change: unknown): void;\n}\n\nfunction isUpdatable(blot: Blot): blot is Blot & UpdatableEmbed {\n return typeof (blot as unknown as any).updateContent === 'function';\n}\n\nclass Scroll extends ScrollBlot {\n static blotName = 'scroll';\n static className = 'ql-editor';\n static tagName = 'DIV';\n static defaultChild = Block;\n static allowedChildren = [Block, BlockEmbed, Container];\n\n emitter: Emitter;\n batch: false | MutationRecord[];\n\n constructor(\n registry: Registry,\n domNode: HTMLDivElement,\n { emitter }: { emitter: Emitter },\n ) {\n super(registry, domNode);\n this.emitter = emitter;\n this.batch = false;\n this.optimize();\n this.enable();\n this.domNode.addEventListener('dragstart', (e) => this.handleDragStart(e));\n }\n\n batchStart() {\n if (!Array.isArray(this.batch)) {\n this.batch = [];\n }\n }\n\n batchEnd() {\n if (!this.batch) return;\n const mutations = this.batch;\n this.batch = false;\n this.update(mutations);\n }\n\n emitMount(blot: Blot) {\n this.emitter.emit(Emitter.events.SCROLL_BLOT_MOUNT, blot);\n }\n\n emitUnmount(blot: Blot) {\n this.emitter.emit(Emitter.events.SCROLL_BLOT_UNMOUNT, blot);\n }\n\n emitEmbedUpdate(blot: Blot, change: unknown) {\n this.emitter.emit(Emitter.events.SCROLL_EMBED_UPDATE, blot, change);\n }\n\n deleteAt(index: number, length: number) {\n const [first, offset] = this.line(index);\n const [last] = this.line(index + length);\n super.deleteAt(index, length);\n if (last != null && first !== last && offset > 0) {\n if (first instanceof BlockEmbed || last instanceof BlockEmbed) {\n this.optimize();\n return;\n }\n const ref =\n last.children.head instanceof Break ? null : last.children.head;\n // @ts-expect-error\n first.moveChildren(last, ref);\n // @ts-expect-error\n first.remove();\n }\n this.optimize();\n }\n\n enable(enabled = true) {\n this.domNode.setAttribute('contenteditable', enabled ? 'true' : 'false');\n }\n\n formatAt(index: number, length: number, format: string, value: unknown) {\n super.formatAt(index, length, format, value);\n this.optimize();\n }\n\n insertAt(index: number, value: string, def?: unknown) {\n if (index >= this.length()) {\n if (def == null || this.scroll.query(value, Scope.BLOCK) == null) {\n const blot = this.scroll.create(this.statics.defaultChild.blotName);\n this.appendChild(blot);\n if (def == null && value.endsWith('\\n')) {\n blot.insertAt(0, value.slice(0, -1), def);\n } else {\n blot.insertAt(0, value, def);\n }\n } else {\n const embed = this.scroll.create(value, def);\n this.appendChild(embed);\n }\n } else {\n super.insertAt(index, value, def);\n }\n this.optimize();\n }\n\n insertBefore(blot: Blot, ref?: Blot | null) {\n if (blot.statics.scope === Scope.INLINE_BLOT) {\n const wrapper = this.scroll.create(\n this.statics.defaultChild.blotName,\n ) as Parent;\n wrapper.appendChild(blot);\n super.insertBefore(wrapper, ref);\n } else {\n super.insertBefore(blot, ref);\n }\n }\n\n insertContents(index: number, delta: Delta) {\n const renderBlocks = this.deltaToRenderBlocks(\n delta.concat(new Delta().insert('\\n')),\n );\n const last = renderBlocks.pop();\n if (last == null) return;\n\n this.batchStart();\n\n const first = renderBlocks.shift();\n if (first) {\n const shouldInsertNewlineChar =\n first.type === 'block' &&\n (first.delta.length() === 0 ||\n (!this.descendant(BlockEmbed, index)[0] && index < this.length()));\n const delta =\n first.type === 'block'\n ? first.delta\n : new Delta().insert({ [first.key]: first.value });\n insertInlineContents(this, index, delta);\n const newlineCharLength = first.type === 'block' ? 1 : 0;\n const lineEndIndex = index + delta.length() + newlineCharLength;\n if (shouldInsertNewlineChar) {\n this.insertAt(lineEndIndex - 1, '\\n');\n }\n\n const formats = bubbleFormats(this.line(index)[0]);\n const attributes = AttributeMap.diff(formats, first.attributes) || {};\n Object.keys(attributes).forEach((name) => {\n this.formatAt(lineEndIndex - 1, 1, name, attributes[name]);\n });\n\n index = lineEndIndex;\n }\n\n let [refBlot, refBlotOffset] = this.children.find(index);\n if (renderBlocks.length) {\n if (refBlot) {\n refBlot = refBlot.split(refBlotOffset);\n refBlotOffset = 0;\n }\n\n renderBlocks.forEach((renderBlock) => {\n if (renderBlock.type === 'block') {\n const block = this.createBlock(\n renderBlock.attributes,\n refBlot || undefined,\n );\n insertInlineContents(block, 0, renderBlock.delta);\n } else {\n const blockEmbed = this.create(\n renderBlock.key,\n renderBlock.value,\n ) as EmbedBlot;\n this.insertBefore(blockEmbed, refBlot || undefined);\n Object.keys(renderBlock.attributes).forEach((name) => {\n blockEmbed.format(name, renderBlock.attributes[name]);\n });\n }\n });\n }\n\n if (last.type === 'block' && last.delta.length()) {\n const offset = refBlot\n ? refBlot.offset(refBlot.scroll) + refBlotOffset\n : this.length();\n insertInlineContents(this, offset, last.delta);\n }\n\n this.batchEnd();\n this.optimize();\n }\n\n isEnabled() {\n return this.domNode.getAttribute('contenteditable') === 'true';\n }\n\n leaf(index: number): [LeafBlot | null, number] {\n const last = this.path(index).pop();\n if (!last) {\n return [null, -1];\n }\n\n const [blot, offset] = last;\n return blot instanceof LeafBlot ? [blot, offset] : [null, -1];\n }\n\n line(index: number): [Block | BlockEmbed | null, number] {\n if (index === this.length()) {\n return this.line(index - 1);\n }\n // @ts-expect-error TODO: make descendant() generic\n return this.descendant(isLine, index);\n }\n\n lines(index = 0, length = Number.MAX_VALUE): (Block | BlockEmbed)[] {\n const getLines = (\n blot: ParentBlot,\n blotIndex: number,\n blotLength: number,\n ) => {\n let lines: (Block | BlockEmbed)[] = [];\n let lengthLeft = blotLength;\n blot.children.forEachAt(\n blotIndex,\n blotLength,\n (child, childIndex, childLength) => {\n if (isLine(child)) {\n lines.push(child);\n } else if (child instanceof ContainerBlot) {\n lines = lines.concat(getLines(child, childIndex, lengthLeft));\n }\n lengthLeft -= childLength;\n },\n );\n return lines;\n };\n return getLines(this, index, length);\n }\n\n optimize(context?: { [key: string]: any }): void;\n optimize(\n mutations?: MutationRecord[],\n context?: { [key: string]: any },\n ): void;\n optimize(mutations = [], context = {}) {\n if (this.batch) return;\n super.optimize(mutations, context);\n if (mutations.length > 0) {\n this.emitter.emit(Emitter.events.SCROLL_OPTIMIZE, mutations, context);\n }\n }\n\n path(index: number) {\n return super.path(index).slice(1); // Exclude self\n }\n\n remove() {\n // Never remove self\n }\n\n update(source?: EmitterSource): void;\n update(mutations?: MutationRecord[]): void;\n update(mutations?: MutationRecord[] | EmitterSource): void {\n if (this.batch) {\n if (Array.isArray(mutations)) {\n this.batch = this.batch.concat(mutations);\n }\n return;\n }\n let source: EmitterSource = Emitter.sources.USER;\n if (typeof mutations === 'string') {\n source = mutations;\n }\n if (!Array.isArray(mutations)) {\n mutations = this.observer.takeRecords();\n }\n mutations = mutations.filter(({ target }) => {\n const blot = this.find(target, true);\n return blot && !isUpdatable(blot);\n });\n if (mutations.length > 0) {\n this.emitter.emit(Emitter.events.SCROLL_BEFORE_UPDATE, source, mutations);\n }\n super.update(mutations.concat([])); // pass copy\n if (mutations.length > 0) {\n this.emitter.emit(Emitter.events.SCROLL_UPDATE, source, mutations);\n }\n }\n\n updateEmbedAt(index: number, key: string, change: unknown) {\n // Currently it only supports top-level embeds (BlockEmbed).\n // We can update `ParentBlot` in parchment to support inline embeds.\n const [blot] = this.descendant((b: Blot) => b instanceof BlockEmbed, index);\n if (blot && blot.statics.blotName === key && isUpdatable(blot)) {\n blot.updateContent(change);\n }\n }\n\n protected handleDragStart(event: DragEvent) {\n event.preventDefault();\n }\n\n private deltaToRenderBlocks(delta: Delta) {\n const renderBlocks: RenderBlock[] = [];\n\n let currentBlockDelta = new Delta();\n delta.forEach((op) => {\n const insert = op?.insert;\n if (!insert) return;\n if (typeof insert === 'string') {\n const splitted = insert.split('\\n');\n splitted.slice(0, -1).forEach((text) => {\n currentBlockDelta.insert(text, op.attributes);\n renderBlocks.push({\n type: 'block',\n delta: currentBlockDelta,\n attributes: op.attributes ?? {},\n });\n currentBlockDelta = new Delta();\n });\n const last = splitted[splitted.length - 1];\n if (last) {\n currentBlockDelta.insert(last, op.attributes);\n }\n } else {\n const key = Object.keys(insert)[0];\n if (!key) return;\n if (this.query(key, Scope.INLINE)) {\n currentBlockDelta.push(op);\n } else {\n if (currentBlockDelta.length()) {\n renderBlocks.push({\n type: 'block',\n delta: currentBlockDelta,\n attributes: {},\n });\n }\n currentBlockDelta = new Delta();\n renderBlocks.push({\n type: 'blockEmbed',\n key,\n value: insert[key],\n attributes: op.attributes ?? {},\n });\n }\n }\n });\n\n if (currentBlockDelta.length()) {\n renderBlocks.push({\n type: 'block',\n delta: currentBlockDelta,\n attributes: {},\n });\n }\n\n return renderBlocks;\n }\n\n private createBlock(attributes: AttributeMap, refBlot?: Blot) {\n let blotName: string | undefined;\n const formats: AttributeMap = {};\n\n Object.entries(attributes).forEach(([key, value]) => {\n const isBlockBlot = this.query(key, Scope.BLOCK & Scope.BLOT) != null;\n if (isBlockBlot) {\n blotName = key;\n } else {\n formats[key] = value;\n }\n });\n\n const block = this.create(\n blotName || this.statics.defaultChild.blotName,\n blotName ? attributes[blotName] : undefined,\n ) as ParentBlot;\n\n this.insertBefore(block, refBlot || undefined);\n\n const length = block.length();\n Object.entries(formats).forEach(([key, value]) => {\n block.formatAt(0, length, key, value);\n });\n\n return block;\n }\n}\n\nfunction insertInlineContents(\n parent: ParentBlot,\n index: number,\n inlineContents: Delta,\n) {\n inlineContents.reduce((index, op) => {\n const length = Op.length(op);\n let attributes = op.attributes || {};\n if (op.insert != null) {\n if (typeof op.insert === 'string') {\n const text = op.insert;\n parent.insertAt(index, text);\n const [leaf] = parent.descendant(LeafBlot, index);\n const formats = bubbleFormats(leaf);\n attributes = AttributeMap.diff(formats, attributes) || {};\n } else if (typeof op.insert === 'object') {\n const key = Object.keys(op.insert)[0]; // There should only be one key\n if (key == null) return index;\n parent.insertAt(index, key, op.insert[key]);\n const isInlineEmbed = parent.scroll.query(key, Scope.INLINE) != null;\n if (isInlineEmbed) {\n const [leaf] = parent.descendant(LeafBlot, index);\n const formats = bubbleFormats(leaf);\n attributes = AttributeMap.diff(formats, attributes) || {};\n }\n }\n }\n Object.keys(attributes).forEach((key) => {\n parent.formatAt(index, length, key, attributes[key]);\n });\n return index + length;\n }, index);\n}\n\nexport default Scroll;\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file diff --git a/public/assets/quill/blots/text.d.ts b/public/assets/quill/blots/text.d.ts new file mode 100644 index 0000000..a95f657 --- /dev/null +++ b/public/assets/quill/blots/text.d.ts @@ -0,0 +1,5 @@ +import { TextBlot } from 'parchment'; +declare class Text extends TextBlot { +} +declare function escapeText(text: string): string; +export { Text as default, escapeText }; diff --git a/public/assets/quill/blots/text.js b/public/assets/quill/blots/text.js new file mode 100644 index 0000000..2131b17 --- /dev/null +++ b/public/assets/quill/blots/text.js @@ -0,0 +1,16 @@ +import { TextBlot } from 'parchment'; +class Text extends TextBlot {} + +// https://lodash.com/docs#escape +const entityMap = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + "'": ''' +}; +function escapeText(text) { + return text.replace(/[&<>"']/g, s => entityMap[s]); +} +export { Text as default, escapeText }; +//# sourceMappingURL=text.js.map \ No newline at end of file diff --git a/public/assets/quill/blots/text.js.map b/public/assets/quill/blots/text.js.map new file mode 100644 index 0000000..c859b4d --- /dev/null +++ b/public/assets/quill/blots/text.js.map @@ -0,0 +1 @@ +{"version":3,"file":"text.js","names":["TextBlot","Text","entityMap","escapeText","text","replace","s","default"],"sources":["../../src/blots/text.ts"],"sourcesContent":["import { TextBlot } from 'parchment';\n\nclass Text extends TextBlot {}\n\n// https://lodash.com/docs#escape\nconst entityMap: Record = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": ''',\n};\n\nfunction escapeText(text: string) {\n return text.replace(/[&<>\"']/g, (s) => entityMap[s]);\n}\n\nexport { Text as default, escapeText };\n"],"mappings":"AAAA,SAASA,QAAQ,QAAQ,WAAW;AAEpC,MAAMC,IAAI,SAASD,QAAQ,CAAC;;AAE5B;AACA,MAAME,SAAiC,GAAG;EACxC,GAAG,EAAE,OAAO;EACZ,GAAG,EAAE,MAAM;EACX,GAAG,EAAE,MAAM;EACX,GAAG,EAAE,QAAQ;EACb,GAAG,EAAE;AACP,CAAC;AAED,SAASC,UAAUA,CAACC,IAAY,EAAE;EAChC,OAAOA,IAAI,CAACC,OAAO,CAAC,UAAU,EAAGC,CAAC,IAAKJ,SAAS,CAACI,CAAC,CAAC,CAAC;AACtD;AAEA,SAASL,IAAI,IAAIM,OAAO,EAAEJ,UAAU","ignoreList":[]} \ No newline at end of file diff --git a/public/assets/quill/core.d.ts b/public/assets/quill/core.d.ts new file mode 100644 index 0000000..55f4e68 --- /dev/null +++ b/public/assets/quill/core.d.ts @@ -0,0 +1,7 @@ +import Quill, { Parchment, Range } from './core/quill.js'; +import type { Bounds, DebugLevel, EmitterSource, ExpandedQuillOptions, QuillOptions } from './core/quill.js'; +import Delta, { Op, OpIterator, AttributeMap } from 'quill-delta'; +export { default as Module } from './core/module.js'; +export { Delta, Op, OpIterator, AttributeMap, Parchment, Range }; +export type { Bounds, DebugLevel, EmitterSource, ExpandedQuillOptions, QuillOptions, }; +export default Quill; diff --git a/public/assets/quill/core.js b/public/assets/quill/core.js new file mode 100644 index 0000000..457d9bd --- /dev/null +++ b/public/assets/quill/core.js @@ -0,0 +1,37 @@ +import Quill, { Parchment, Range } from './core/quill.js'; +import Block, { BlockEmbed } from './blots/block.js'; +import Break from './blots/break.js'; +import Container from './blots/container.js'; +import Cursor from './blots/cursor.js'; +import Embed from './blots/embed.js'; +import Inline from './blots/inline.js'; +import Scroll from './blots/scroll.js'; +import TextBlot from './blots/text.js'; +import Clipboard from './modules/clipboard.js'; +import History from './modules/history.js'; +import Keyboard from './modules/keyboard.js'; +import Uploader from './modules/uploader.js'; +import Delta, { Op, OpIterator, AttributeMap } from 'quill-delta'; +import Input from './modules/input.js'; +import UINode from './modules/uiNode.js'; +export { default as Module } from './core/module.js'; +export { Delta, Op, OpIterator, AttributeMap, Parchment, Range }; +Quill.register({ + 'blots/block': Block, + 'blots/block/embed': BlockEmbed, + 'blots/break': Break, + 'blots/container': Container, + 'blots/cursor': Cursor, + 'blots/embed': Embed, + 'blots/inline': Inline, + 'blots/scroll': Scroll, + 'blots/text': TextBlot, + 'modules/clipboard': Clipboard, + 'modules/history': History, + 'modules/keyboard': Keyboard, + 'modules/uploader': Uploader, + 'modules/input': Input, + 'modules/uiNode': UINode +}); +export default Quill; +//# sourceMappingURL=core.js.map \ No newline at end of file diff --git a/public/assets/quill/core.js.map b/public/assets/quill/core.js.map new file mode 100644 index 0000000..b75dfe9 --- /dev/null +++ b/public/assets/quill/core.js.map @@ -0,0 +1 @@ +{"version":3,"file":"core.js","names":["Quill","Parchment","Range","Block","BlockEmbed","Break","Container","Cursor","Embed","Inline","Scroll","TextBlot","Clipboard","History","Keyboard","Uploader","Delta","Op","OpIterator","AttributeMap","Input","UINode","default","Module","register"],"sources":["../src/core.ts"],"sourcesContent":["import Quill, { Parchment, Range } from './core/quill.js';\nimport type {\n Bounds,\n DebugLevel,\n EmitterSource,\n ExpandedQuillOptions,\n QuillOptions,\n} from './core/quill.js';\n\nimport Block, { BlockEmbed } from './blots/block.js';\nimport Break from './blots/break.js';\nimport Container from './blots/container.js';\nimport Cursor from './blots/cursor.js';\nimport Embed from './blots/embed.js';\nimport Inline from './blots/inline.js';\nimport Scroll from './blots/scroll.js';\nimport TextBlot from './blots/text.js';\n\nimport Clipboard from './modules/clipboard.js';\nimport History from './modules/history.js';\nimport Keyboard from './modules/keyboard.js';\nimport Uploader from './modules/uploader.js';\nimport Delta, { Op, OpIterator, AttributeMap } from 'quill-delta';\nimport Input from './modules/input.js';\nimport UINode from './modules/uiNode.js';\n\nexport { default as Module } from './core/module.js';\nexport { Delta, Op, OpIterator, AttributeMap, Parchment, Range };\nexport type {\n Bounds,\n DebugLevel,\n EmitterSource,\n ExpandedQuillOptions,\n QuillOptions,\n};\n\nQuill.register({\n 'blots/block': Block,\n 'blots/block/embed': BlockEmbed,\n 'blots/break': Break,\n 'blots/container': Container,\n 'blots/cursor': Cursor,\n 'blots/embed': Embed,\n 'blots/inline': Inline,\n 'blots/scroll': Scroll,\n 'blots/text': TextBlot,\n\n 'modules/clipboard': Clipboard,\n 'modules/history': History,\n 'modules/keyboard': Keyboard,\n 'modules/uploader': Uploader,\n 'modules/input': Input,\n 'modules/uiNode': UINode,\n});\n\nexport default Quill;\n"],"mappings":"AAAA,OAAOA,KAAK,IAAIC,SAAS,EAAEC,KAAK,QAAQ,iBAAiB;AASzD,OAAOC,KAAK,IAAIC,UAAU,QAAQ,kBAAkB;AACpD,OAAOC,KAAK,MAAM,kBAAkB;AACpC,OAAOC,SAAS,MAAM,sBAAsB;AAC5C,OAAOC,MAAM,MAAM,mBAAmB;AACtC,OAAOC,KAAK,MAAM,kBAAkB;AACpC,OAAOC,MAAM,MAAM,mBAAmB;AACtC,OAAOC,MAAM,MAAM,mBAAmB;AACtC,OAAOC,QAAQ,MAAM,iBAAiB;AAEtC,OAAOC,SAAS,MAAM,wBAAwB;AAC9C,OAAOC,OAAO,MAAM,sBAAsB;AAC1C,OAAOC,QAAQ,MAAM,uBAAuB;AAC5C,OAAOC,QAAQ,MAAM,uBAAuB;AAC5C,OAAOC,KAAK,IAAIC,EAAE,EAAEC,UAAU,EAAEC,YAAY,QAAQ,aAAa;AACjE,OAAOC,KAAK,MAAM,oBAAoB;AACtC,OAAOC,MAAM,MAAM,qBAAqB;AAExC,SAASC,OAAO,IAAIC,MAAM,QAAQ,kBAAkB;AACpD,SAASP,KAAK,EAAEC,EAAE,EAAEC,UAAU,EAAEC,YAAY,EAAElB,SAAS,EAAEC,KAAK;AAS9DF,KAAK,CAACwB,QAAQ,CAAC;EACb,aAAa,EAAErB,KAAK;EACpB,mBAAmB,EAAEC,UAAU;EAC/B,aAAa,EAAEC,KAAK;EACpB,iBAAiB,EAAEC,SAAS;EAC5B,cAAc,EAAEC,MAAM;EACtB,aAAa,EAAEC,KAAK;EACpB,cAAc,EAAEC,MAAM;EACtB,cAAc,EAAEC,MAAM;EACtB,YAAY,EAAEC,QAAQ;EAEtB,mBAAmB,EAAEC,SAAS;EAC9B,iBAAiB,EAAEC,OAAO;EAC1B,kBAAkB,EAAEC,QAAQ;EAC5B,kBAAkB,EAAEC,QAAQ;EAC5B,eAAe,EAAEK,KAAK;EACtB,gBAAgB,EAAEC;AACpB,CAAC,CAAC;AAEF,eAAerB,KAAK","ignoreList":[]} \ No newline at end of file diff --git a/public/assets/quill/core/composition.d.ts b/public/assets/quill/core/composition.d.ts new file mode 100644 index 0000000..b27eea7 --- /dev/null +++ b/public/assets/quill/core/composition.d.ts @@ -0,0 +1,12 @@ +import type Scroll from '../blots/scroll.js'; +import Emitter from './emitter.js'; +declare class Composition { + private scroll; + private emitter; + isComposing: boolean; + constructor(scroll: Scroll, emitter: Emitter); + private setupListeners; + private handleCompositionStart; + private handleCompositionEnd; +} +export default Composition; diff --git a/public/assets/quill/core/composition.js b/public/assets/quill/core/composition.js new file mode 100644 index 0000000..9984cc4 --- /dev/null +++ b/public/assets/quill/core/composition.js @@ -0,0 +1,44 @@ +import Embed from '../blots/embed.js'; +import Emitter from './emitter.js'; +class Composition { + isComposing = false; + constructor(scroll, emitter) { + this.scroll = scroll; + this.emitter = emitter; + this.setupListeners(); + } + setupListeners() { + this.scroll.domNode.addEventListener('compositionstart', event => { + if (!this.isComposing) { + this.handleCompositionStart(event); + } + }); + this.scroll.domNode.addEventListener('compositionend', event => { + if (this.isComposing) { + // Webkit makes DOM changes after compositionend, so we use microtask to + // ensure the order. + // https://bugs.webkit.org/show_bug.cgi?id=31902 + queueMicrotask(() => { + this.handleCompositionEnd(event); + }); + } + }); + } + handleCompositionStart(event) { + const blot = event.target instanceof Node ? this.scroll.find(event.target, true) : null; + if (blot && !(blot instanceof Embed)) { + this.emitter.emit(Emitter.events.COMPOSITION_BEFORE_START, event); + this.scroll.batchStart(); + this.emitter.emit(Emitter.events.COMPOSITION_START, event); + this.isComposing = true; + } + } + handleCompositionEnd(event) { + this.emitter.emit(Emitter.events.COMPOSITION_BEFORE_END, event); + this.scroll.batchEnd(); + this.emitter.emit(Emitter.events.COMPOSITION_END, event); + this.isComposing = false; + } +} +export default Composition; +//# sourceMappingURL=composition.js.map \ No newline at end of file diff --git a/public/assets/quill/core/composition.js.map b/public/assets/quill/core/composition.js.map new file mode 100644 index 0000000..3ea23a3 --- /dev/null +++ b/public/assets/quill/core/composition.js.map @@ -0,0 +1 @@ +{"version":3,"file":"composition.js","names":["Embed","Emitter","Composition","isComposing","constructor","scroll","emitter","setupListeners","domNode","addEventListener","event","handleCompositionStart","queueMicrotask","handleCompositionEnd","blot","target","Node","find","emit","events","COMPOSITION_BEFORE_START","batchStart","COMPOSITION_START","COMPOSITION_BEFORE_END","batchEnd","COMPOSITION_END"],"sources":["../../src/core/composition.ts"],"sourcesContent":["import Embed from '../blots/embed.js';\nimport type Scroll from '../blots/scroll.js';\nimport Emitter from './emitter.js';\n\nclass Composition {\n isComposing = false;\n\n constructor(\n private scroll: Scroll,\n private emitter: Emitter,\n ) {\n this.setupListeners();\n }\n\n private setupListeners() {\n this.scroll.domNode.addEventListener('compositionstart', (event) => {\n if (!this.isComposing) {\n this.handleCompositionStart(event);\n }\n });\n\n this.scroll.domNode.addEventListener('compositionend', (event) => {\n if (this.isComposing) {\n // Webkit makes DOM changes after compositionend, so we use microtask to\n // ensure the order.\n // https://bugs.webkit.org/show_bug.cgi?id=31902\n queueMicrotask(() => {\n this.handleCompositionEnd(event);\n });\n }\n });\n }\n\n private handleCompositionStart(event: CompositionEvent) {\n const blot =\n event.target instanceof Node\n ? this.scroll.find(event.target, true)\n : null;\n\n if (blot && !(blot instanceof Embed)) {\n this.emitter.emit(Emitter.events.COMPOSITION_BEFORE_START, event);\n this.scroll.batchStart();\n this.emitter.emit(Emitter.events.COMPOSITION_START, event);\n this.isComposing = true;\n }\n }\n\n private handleCompositionEnd(event: CompositionEvent) {\n this.emitter.emit(Emitter.events.COMPOSITION_BEFORE_END, event);\n this.scroll.batchEnd();\n this.emitter.emit(Emitter.events.COMPOSITION_END, event);\n this.isComposing = false;\n }\n}\n\nexport default Composition;\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,mBAAmB;AAErC,OAAOC,OAAO,MAAM,cAAc;AAElC,MAAMC,WAAW,CAAC;EAChBC,WAAW,GAAG,KAAK;EAEnBC,WAAWA,CACDC,MAAc,EACdC,OAAgB,EACxB;IAAA,KAFQD,MAAc,GAAdA,MAAc;IAAA,KACdC,OAAgB,GAAhBA,OAAgB;IAExB,IAAI,CAACC,cAAc,CAAC,CAAC;EACvB;EAEQA,cAAcA,CAAA,EAAG;IACvB,IAAI,CAACF,MAAM,CAACG,OAAO,CAACC,gBAAgB,CAAC,kBAAkB,EAAGC,KAAK,IAAK;MAClE,IAAI,CAAC,IAAI,CAACP,WAAW,EAAE;QACrB,IAAI,CAACQ,sBAAsB,CAACD,KAAK,CAAC;MACpC;IACF,CAAC,CAAC;IAEF,IAAI,CAACL,MAAM,CAACG,OAAO,CAACC,gBAAgB,CAAC,gBAAgB,EAAGC,KAAK,IAAK;MAChE,IAAI,IAAI,CAACP,WAAW,EAAE;QACpB;QACA;QACA;QACAS,cAAc,CAAC,MAAM;UACnB,IAAI,CAACC,oBAAoB,CAACH,KAAK,CAAC;QAClC,CAAC,CAAC;MACJ;IACF,CAAC,CAAC;EACJ;EAEQC,sBAAsBA,CAACD,KAAuB,EAAE;IACtD,MAAMI,IAAI,GACRJ,KAAK,CAACK,MAAM,YAAYC,IAAI,GACxB,IAAI,CAACX,MAAM,CAACY,IAAI,CAACP,KAAK,CAACK,MAAM,EAAE,IAAI,CAAC,GACpC,IAAI;IAEV,IAAID,IAAI,IAAI,EAAEA,IAAI,YAAYd,KAAK,CAAC,EAAE;MACpC,IAAI,CAACM,OAAO,CAACY,IAAI,CAACjB,OAAO,CAACkB,MAAM,CAACC,wBAAwB,EAAEV,KAAK,CAAC;MACjE,IAAI,CAACL,MAAM,CAACgB,UAAU,CAAC,CAAC;MACxB,IAAI,CAACf,OAAO,CAACY,IAAI,CAACjB,OAAO,CAACkB,MAAM,CAACG,iBAAiB,EAAEZ,KAAK,CAAC;MAC1D,IAAI,CAACP,WAAW,GAAG,IAAI;IACzB;EACF;EAEQU,oBAAoBA,CAACH,KAAuB,EAAE;IACpD,IAAI,CAACJ,OAAO,CAACY,IAAI,CAACjB,OAAO,CAACkB,MAAM,CAACI,sBAAsB,EAAEb,KAAK,CAAC;IAC/D,IAAI,CAACL,MAAM,CAACmB,QAAQ,CAAC,CAAC;IACtB,IAAI,CAAClB,OAAO,CAACY,IAAI,CAACjB,OAAO,CAACkB,MAAM,CAACM,eAAe,EAAEf,KAAK,CAAC;IACxD,IAAI,CAACP,WAAW,GAAG,KAAK;EAC1B;AACF;AAEA,eAAeD,WAAW","ignoreList":[]} \ No newline at end of file diff --git a/public/assets/quill/core/editor.d.ts b/public/assets/quill/core/editor.d.ts new file mode 100644 index 0000000..ad23a31 --- /dev/null +++ b/public/assets/quill/core/editor.d.ts @@ -0,0 +1,28 @@ +import Delta from 'quill-delta'; +import type Scroll from '../blots/scroll.js'; +import { Range } from './selection.js'; +type SelectionInfo = { + newRange: Range; + oldRange: Range; +}; +declare class Editor { + scroll: Scroll; + delta: Delta; + constructor(scroll: Scroll); + applyDelta(delta: Delta): Delta; + deleteText(index: number, length: number): Delta; + formatLine(index: number, length: number, formats?: Record): Delta; + formatText(index: number, length: number, formats?: Record): Delta; + getContents(index: number, length: number): Delta; + getDelta(): Delta; + getFormat(index: number, length?: number): Record; + getHTML(index: number, length: number): string; + getText(index: number, length: number): string; + insertContents(index: number, contents: Delta): Delta; + insertEmbed(index: number, embed: string, value: unknown): Delta; + insertText(index: number, text: string, formats?: Record): Delta; + isBlank(): boolean; + removeFormat(index: number, length: number): Delta; + update(change: Delta | null, mutations?: MutationRecord[], selectionInfo?: SelectionInfo | undefined): Delta; +} +export default Editor; diff --git a/public/assets/quill/core/editor.js b/public/assets/quill/core/editor.js new file mode 100644 index 0000000..07fd544 --- /dev/null +++ b/public/assets/quill/core/editor.js @@ -0,0 +1,404 @@ +import { cloneDeep, isEqual, merge } from 'lodash-es'; +import { LeafBlot, EmbedBlot, Scope, ParentBlot } from 'parchment'; +import Delta, { AttributeMap, Op } from 'quill-delta'; +import Block, { BlockEmbed, bubbleFormats } from '../blots/block.js'; +import Break from '../blots/break.js'; +import CursorBlot from '../blots/cursor.js'; +import TextBlot, { escapeText } from '../blots/text.js'; +import { Range } from './selection.js'; +const ASCII = /^[ -~]*$/; +class Editor { + constructor(scroll) { + this.scroll = scroll; + this.delta = this.getDelta(); + } + applyDelta(delta) { + this.scroll.update(); + let scrollLength = this.scroll.length(); + this.scroll.batchStart(); + const normalizedDelta = normalizeDelta(delta); + const deleteDelta = new Delta(); + const normalizedOps = splitOpLines(normalizedDelta.ops.slice()); + normalizedOps.reduce((index, op) => { + const length = Op.length(op); + let attributes = op.attributes || {}; + let isImplicitNewlinePrepended = false; + let isImplicitNewlineAppended = false; + if (op.insert != null) { + deleteDelta.retain(length); + if (typeof op.insert === 'string') { + const text = op.insert; + isImplicitNewlineAppended = !text.endsWith('\n') && (scrollLength <= index || !!this.scroll.descendant(BlockEmbed, index)[0]); + this.scroll.insertAt(index, text); + const [line, offset] = this.scroll.line(index); + let formats = merge({}, bubbleFormats(line)); + if (line instanceof Block) { + const [leaf] = line.descendant(LeafBlot, offset); + if (leaf) { + formats = merge(formats, bubbleFormats(leaf)); + } + } + attributes = AttributeMap.diff(formats, attributes) || {}; + } else if (typeof op.insert === 'object') { + const key = Object.keys(op.insert)[0]; // There should only be one key + if (key == null) return index; + const isInlineEmbed = this.scroll.query(key, Scope.INLINE) != null; + if (isInlineEmbed) { + if (scrollLength <= index || !!this.scroll.descendant(BlockEmbed, index)[0]) { + isImplicitNewlineAppended = true; + } + } else if (index > 0) { + const [leaf, offset] = this.scroll.descendant(LeafBlot, index - 1); + if (leaf instanceof TextBlot) { + const text = leaf.value(); + if (text[offset] !== '\n') { + isImplicitNewlinePrepended = true; + } + } else if (leaf instanceof EmbedBlot && leaf.statics.scope === Scope.INLINE_BLOT) { + isImplicitNewlinePrepended = true; + } + } + this.scroll.insertAt(index, key, op.insert[key]); + if (isInlineEmbed) { + const [leaf] = this.scroll.descendant(LeafBlot, index); + if (leaf) { + const formats = merge({}, bubbleFormats(leaf)); + attributes = AttributeMap.diff(formats, attributes) || {}; + } + } + } + scrollLength += length; + } else { + deleteDelta.push(op); + if (op.retain !== null && typeof op.retain === 'object') { + const key = Object.keys(op.retain)[0]; + if (key == null) return index; + this.scroll.updateEmbedAt(index, key, op.retain[key]); + } + } + Object.keys(attributes).forEach(name => { + this.scroll.formatAt(index, length, name, attributes[name]); + }); + const prependedLength = isImplicitNewlinePrepended ? 1 : 0; + const addedLength = isImplicitNewlineAppended ? 1 : 0; + scrollLength += prependedLength + addedLength; + deleteDelta.retain(prependedLength); + deleteDelta.delete(addedLength); + return index + length + prependedLength + addedLength; + }, 0); + deleteDelta.reduce((index, op) => { + if (typeof op.delete === 'number') { + this.scroll.deleteAt(index, op.delete); + return index; + } + return index + Op.length(op); + }, 0); + this.scroll.batchEnd(); + this.scroll.optimize(); + return this.update(normalizedDelta); + } + deleteText(index, length) { + this.scroll.deleteAt(index, length); + return this.update(new Delta().retain(index).delete(length)); + } + formatLine(index, length) { + let formats = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + this.scroll.update(); + Object.keys(formats).forEach(format => { + this.scroll.lines(index, Math.max(length, 1)).forEach(line => { + line.format(format, formats[format]); + }); + }); + this.scroll.optimize(); + const delta = new Delta().retain(index).retain(length, cloneDeep(formats)); + return this.update(delta); + } + formatText(index, length) { + let formats = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + Object.keys(formats).forEach(format => { + this.scroll.formatAt(index, length, format, formats[format]); + }); + const delta = new Delta().retain(index).retain(length, cloneDeep(formats)); + return this.update(delta); + } + getContents(index, length) { + return this.delta.slice(index, index + length); + } + getDelta() { + return this.scroll.lines().reduce((delta, line) => { + return delta.concat(line.delta()); + }, new Delta()); + } + getFormat(index) { + let length = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; + let lines = []; + let leaves = []; + if (length === 0) { + this.scroll.path(index).forEach(path => { + const [blot] = path; + if (blot instanceof Block) { + lines.push(blot); + } else if (blot instanceof LeafBlot) { + leaves.push(blot); + } + }); + } else { + lines = this.scroll.lines(index, length); + leaves = this.scroll.descendants(LeafBlot, index, length); + } + const [lineFormats, leafFormats] = [lines, leaves].map(blots => { + const blot = blots.shift(); + if (blot == null) return {}; + let formats = bubbleFormats(blot); + while (Object.keys(formats).length > 0) { + const blot = blots.shift(); + if (blot == null) return formats; + formats = combineFormats(bubbleFormats(blot), formats); + } + return formats; + }); + return { + ...lineFormats, + ...leafFormats + }; + } + getHTML(index, length) { + const [line, lineOffset] = this.scroll.line(index); + if (line) { + const lineLength = line.length(); + const isWithinLine = line.length() >= lineOffset + length; + if (isWithinLine && !(lineOffset === 0 && length === lineLength)) { + return convertHTML(line, lineOffset, length, true); + } + return convertHTML(this.scroll, index, length, true); + } + return ''; + } + getText(index, length) { + return this.getContents(index, length).filter(op => typeof op.insert === 'string').map(op => op.insert).join(''); + } + insertContents(index, contents) { + const normalizedDelta = normalizeDelta(contents); + const change = new Delta().retain(index).concat(normalizedDelta); + this.scroll.insertContents(index, normalizedDelta); + return this.update(change); + } + insertEmbed(index, embed, value) { + this.scroll.insertAt(index, embed, value); + return this.update(new Delta().retain(index).insert({ + [embed]: value + })); + } + insertText(index, text) { + let formats = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + text = text.replace(/\r\n/g, '\n').replace(/\r/g, '\n'); + this.scroll.insertAt(index, text); + Object.keys(formats).forEach(format => { + this.scroll.formatAt(index, text.length, format, formats[format]); + }); + return this.update(new Delta().retain(index).insert(text, cloneDeep(formats))); + } + isBlank() { + if (this.scroll.children.length === 0) return true; + if (this.scroll.children.length > 1) return false; + const blot = this.scroll.children.head; + if (blot?.statics.blotName !== Block.blotName) return false; + const block = blot; + if (block.children.length > 1) return false; + return block.children.head instanceof Break; + } + removeFormat(index, length) { + const text = this.getText(index, length); + const [line, offset] = this.scroll.line(index + length); + let suffixLength = 0; + let suffix = new Delta(); + if (line != null) { + suffixLength = line.length() - offset; + suffix = line.delta().slice(offset, offset + suffixLength - 1).insert('\n'); + } + const contents = this.getContents(index, length + suffixLength); + const diff = contents.diff(new Delta().insert(text).concat(suffix)); + const delta = new Delta().retain(index).concat(diff); + return this.applyDelta(delta); + } + update(change) { + let mutations = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : []; + let selectionInfo = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : undefined; + const oldDelta = this.delta; + if (mutations.length === 1 && mutations[0].type === 'characterData' && + // @ts-expect-error Fix me later + mutations[0].target.data.match(ASCII) && this.scroll.find(mutations[0].target)) { + // Optimization for character changes + const textBlot = this.scroll.find(mutations[0].target); + const formats = bubbleFormats(textBlot); + const index = textBlot.offset(this.scroll); + // @ts-expect-error Fix me later + const oldValue = mutations[0].oldValue.replace(CursorBlot.CONTENTS, ''); + const oldText = new Delta().insert(oldValue); + // @ts-expect-error + const newText = new Delta().insert(textBlot.value()); + const relativeSelectionInfo = selectionInfo && { + oldRange: shiftRange(selectionInfo.oldRange, -index), + newRange: shiftRange(selectionInfo.newRange, -index) + }; + const diffDelta = new Delta().retain(index).concat(oldText.diff(newText, relativeSelectionInfo)); + change = diffDelta.reduce((delta, op) => { + if (op.insert) { + return delta.insert(op.insert, formats); + } + return delta.push(op); + }, new Delta()); + this.delta = oldDelta.compose(change); + } else { + this.delta = this.getDelta(); + if (!change || !isEqual(oldDelta.compose(change), this.delta)) { + change = oldDelta.diff(this.delta, selectionInfo); + } + } + return change; + } +} +function convertListHTML(items, lastIndent, types) { + if (items.length === 0) { + const [endTag] = getListType(types.pop()); + if (lastIndent <= 0) { + return ``; + } + return `${convertListHTML([], lastIndent - 1, types)}`; + } + const [{ + child, + offset, + length, + indent, + type + }, ...rest] = items; + const [tag, attribute] = getListType(type); + if (indent > lastIndent) { + types.push(type); + if (indent === lastIndent + 1) { + return `<${tag}>${convertHTML(child, offset, length)}${convertListHTML(rest, indent, types)}`; + } + return `<${tag}>
  • ${convertListHTML(items, lastIndent + 1, types)}`; + } + const previousType = types[types.length - 1]; + if (indent === lastIndent && type === previousType) { + return `
  • ${convertHTML(child, offset, length)}${convertListHTML(rest, indent, types)}`; + } + const [endTag] = getListType(types.pop()); + return `${convertListHTML(items, lastIndent - 1, types)}`; +} +function convertHTML(blot, index, length) { + let isRoot = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false; + if ('html' in blot && typeof blot.html === 'function') { + return blot.html(index, length); + } + if (blot instanceof TextBlot) { + const escapedText = escapeText(blot.value().slice(index, index + length)); + return escapedText.replaceAll(' ', ' '); + } + if (blot instanceof ParentBlot) { + // TODO fix API + if (blot.statics.blotName === 'list-container') { + const items = []; + blot.children.forEachAt(index, length, (child, offset, childLength) => { + const formats = 'formats' in child && typeof child.formats === 'function' ? child.formats() : {}; + items.push({ + child, + offset, + length: childLength, + indent: formats.indent || 0, + type: formats.list + }); + }); + return convertListHTML(items, -1, []); + } + const parts = []; + blot.children.forEachAt(index, length, (child, offset, childLength) => { + parts.push(convertHTML(child, offset, childLength)); + }); + if (isRoot || blot.statics.blotName === 'list') { + return parts.join(''); + } + const { + outerHTML, + innerHTML + } = blot.domNode; + const [start, end] = outerHTML.split(`>${innerHTML}<`); + // TODO cleanup + if (start === '${parts.join('')}<${end}`; + } + return `${start}>${parts.join('')}<${end}`; + } + return blot.domNode instanceof Element ? blot.domNode.outerHTML : ''; +} +function combineFormats(formats, combined) { + return Object.keys(combined).reduce((merged, name) => { + if (formats[name] == null) return merged; + const combinedValue = combined[name]; + if (combinedValue === formats[name]) { + merged[name] = combinedValue; + } else if (Array.isArray(combinedValue)) { + if (combinedValue.indexOf(formats[name]) < 0) { + merged[name] = combinedValue.concat([formats[name]]); + } else { + // If style already exists, don't add to an array, but don't lose other styles + merged[name] = combinedValue; + } + } else { + merged[name] = [combinedValue, formats[name]]; + } + return merged; + }, {}); +} +function getListType(type) { + const tag = type === 'ordered' ? 'ol' : 'ul'; + switch (type) { + case 'checked': + return [tag, ' data-list="checked"']; + case 'unchecked': + return [tag, ' data-list="unchecked"']; + default: + return [tag, '']; + } +} +function normalizeDelta(delta) { + return delta.reduce((normalizedDelta, op) => { + if (typeof op.insert === 'string') { + const text = op.insert.replace(/\r\n/g, '\n').replace(/\r/g, '\n'); + return normalizedDelta.insert(text, op.attributes); + } + return normalizedDelta.push(op); + }, new Delta()); +} +function shiftRange(_ref, amount) { + let { + index, + length + } = _ref; + return new Range(index + amount, length); +} +function splitOpLines(ops) { + const split = []; + ops.forEach(op => { + if (typeof op.insert === 'string') { + const lines = op.insert.split('\n'); + lines.forEach((line, index) => { + if (index) split.push({ + insert: '\n', + attributes: op.attributes + }); + if (line) split.push({ + insert: line, + attributes: op.attributes + }); + }); + } else { + split.push(op); + } + }); + return split; +} +export default Editor; +//# sourceMappingURL=editor.js.map \ No newline at end of file diff --git a/public/assets/quill/core/editor.js.map b/public/assets/quill/core/editor.js.map new file mode 100644 index 0000000..3ce0b45 --- /dev/null +++ b/public/assets/quill/core/editor.js.map @@ -0,0 +1 @@ +{"version":3,"file":"editor.js","names":["cloneDeep","isEqual","merge","LeafBlot","EmbedBlot","Scope","ParentBlot","Delta","AttributeMap","Op","Block","BlockEmbed","bubbleFormats","Break","CursorBlot","TextBlot","escapeText","Range","ASCII","Editor","constructor","scroll","delta","getDelta","applyDelta","update","scrollLength","length","batchStart","normalizedDelta","normalizeDelta","deleteDelta","normalizedOps","splitOpLines","ops","slice","reduce","index","op","attributes","isImplicitNewlinePrepended","isImplicitNewlineAppended","insert","retain","text","endsWith","descendant","insertAt","line","offset","formats","leaf","diff","key","Object","keys","isInlineEmbed","query","INLINE","value","statics","scope","INLINE_BLOT","push","updateEmbedAt","forEach","name","formatAt","prependedLength","addedLength","delete","deleteAt","batchEnd","optimize","deleteText","formatLine","arguments","undefined","format","lines","Math","max","formatText","getContents","concat","getFormat","leaves","path","blot","descendants","lineFormats","leafFormats","map","blots","shift","combineFormats","getHTML","lineOffset","lineLength","isWithinLine","convertHTML","getText","filter","join","insertContents","contents","change","insertEmbed","embed","insertText","replace","isBlank","children","head","blotName","block","removeFormat","suffixLength","suffix","mutations","selectionInfo","oldDelta","type","target","data","match","find","textBlot","oldValue","CONTENTS","oldText","newText","relativeSelectionInfo","oldRange","shiftRange","newRange","diffDelta","compose","convertListHTML","items","lastIndent","types","endTag","getListType","pop","child","indent","rest","tag","attribute","previousType","isRoot","html","escapedText","replaceAll","forEachAt","childLength","list","parts","outerHTML","innerHTML","domNode","start","end","split","Element","combined","merged","combinedValue","Array","isArray","indexOf","_ref","amount"],"sources":["../../src/core/editor.ts"],"sourcesContent":["import { cloneDeep, isEqual, merge } from 'lodash-es';\nimport { LeafBlot, EmbedBlot, Scope, ParentBlot } from 'parchment';\nimport type { Blot } from 'parchment';\nimport Delta, { AttributeMap, Op } from 'quill-delta';\nimport Block, { BlockEmbed, bubbleFormats } from '../blots/block.js';\nimport Break from '../blots/break.js';\nimport CursorBlot from '../blots/cursor.js';\nimport type Scroll from '../blots/scroll.js';\nimport TextBlot, { escapeText } from '../blots/text.js';\nimport { Range } from './selection.js';\n\nconst ASCII = /^[ -~]*$/;\n\ntype SelectionInfo = {\n newRange: Range;\n oldRange: Range;\n};\n\nclass Editor {\n scroll: Scroll;\n delta: Delta;\n\n constructor(scroll: Scroll) {\n this.scroll = scroll;\n this.delta = this.getDelta();\n }\n\n applyDelta(delta: Delta): Delta {\n this.scroll.update();\n let scrollLength = this.scroll.length();\n this.scroll.batchStart();\n const normalizedDelta = normalizeDelta(delta);\n const deleteDelta = new Delta();\n const normalizedOps = splitOpLines(normalizedDelta.ops.slice());\n normalizedOps.reduce((index, op) => {\n const length = Op.length(op);\n let attributes = op.attributes || {};\n let isImplicitNewlinePrepended = false;\n let isImplicitNewlineAppended = false;\n if (op.insert != null) {\n deleteDelta.retain(length);\n if (typeof op.insert === 'string') {\n const text = op.insert;\n isImplicitNewlineAppended =\n !text.endsWith('\\n') &&\n (scrollLength <= index ||\n !!this.scroll.descendant(BlockEmbed, index)[0]);\n this.scroll.insertAt(index, text);\n const [line, offset] = this.scroll.line(index);\n let formats = merge({}, bubbleFormats(line));\n if (line instanceof Block) {\n const [leaf] = line.descendant(LeafBlot, offset);\n if (leaf) {\n formats = merge(formats, bubbleFormats(leaf));\n }\n }\n attributes = AttributeMap.diff(formats, attributes) || {};\n } else if (typeof op.insert === 'object') {\n const key = Object.keys(op.insert)[0]; // There should only be one key\n if (key == null) return index;\n const isInlineEmbed = this.scroll.query(key, Scope.INLINE) != null;\n if (isInlineEmbed) {\n if (\n scrollLength <= index ||\n !!this.scroll.descendant(BlockEmbed, index)[0]\n ) {\n isImplicitNewlineAppended = true;\n }\n } else if (index > 0) {\n const [leaf, offset] = this.scroll.descendant(LeafBlot, index - 1);\n if (leaf instanceof TextBlot) {\n const text = leaf.value();\n if (text[offset] !== '\\n') {\n isImplicitNewlinePrepended = true;\n }\n } else if (\n leaf instanceof EmbedBlot &&\n leaf.statics.scope === Scope.INLINE_BLOT\n ) {\n isImplicitNewlinePrepended = true;\n }\n }\n this.scroll.insertAt(index, key, op.insert[key]);\n\n if (isInlineEmbed) {\n const [leaf] = this.scroll.descendant(LeafBlot, index);\n if (leaf) {\n const formats = merge({}, bubbleFormats(leaf));\n attributes = AttributeMap.diff(formats, attributes) || {};\n }\n }\n }\n scrollLength += length;\n } else {\n deleteDelta.push(op);\n\n if (op.retain !== null && typeof op.retain === 'object') {\n const key = Object.keys(op.retain)[0];\n if (key == null) return index;\n this.scroll.updateEmbedAt(index, key, op.retain[key]);\n }\n }\n Object.keys(attributes).forEach((name) => {\n this.scroll.formatAt(index, length, name, attributes[name]);\n });\n const prependedLength = isImplicitNewlinePrepended ? 1 : 0;\n const addedLength = isImplicitNewlineAppended ? 1 : 0;\n scrollLength += prependedLength + addedLength;\n deleteDelta.retain(prependedLength);\n deleteDelta.delete(addedLength);\n return index + length + prependedLength + addedLength;\n }, 0);\n deleteDelta.reduce((index, op) => {\n if (typeof op.delete === 'number') {\n this.scroll.deleteAt(index, op.delete);\n return index;\n }\n return index + Op.length(op);\n }, 0);\n this.scroll.batchEnd();\n this.scroll.optimize();\n return this.update(normalizedDelta);\n }\n\n deleteText(index: number, length: number): Delta {\n this.scroll.deleteAt(index, length);\n return this.update(new Delta().retain(index).delete(length));\n }\n\n formatLine(\n index: number,\n length: number,\n formats: Record = {},\n ): Delta {\n this.scroll.update();\n Object.keys(formats).forEach((format) => {\n this.scroll.lines(index, Math.max(length, 1)).forEach((line) => {\n line.format(format, formats[format]);\n });\n });\n this.scroll.optimize();\n const delta = new Delta().retain(index).retain(length, cloneDeep(formats));\n return this.update(delta);\n }\n\n formatText(\n index: number,\n length: number,\n formats: Record = {},\n ): Delta {\n Object.keys(formats).forEach((format) => {\n this.scroll.formatAt(index, length, format, formats[format]);\n });\n const delta = new Delta().retain(index).retain(length, cloneDeep(formats));\n return this.update(delta);\n }\n\n getContents(index: number, length: number): Delta {\n return this.delta.slice(index, index + length);\n }\n\n getDelta(): Delta {\n return this.scroll.lines().reduce((delta, line) => {\n return delta.concat(line.delta());\n }, new Delta());\n }\n\n getFormat(index: number, length = 0): Record {\n let lines: (Block | BlockEmbed)[] = [];\n let leaves: LeafBlot[] = [];\n if (length === 0) {\n this.scroll.path(index).forEach((path) => {\n const [blot] = path;\n if (blot instanceof Block) {\n lines.push(blot);\n } else if (blot instanceof LeafBlot) {\n leaves.push(blot);\n }\n });\n } else {\n lines = this.scroll.lines(index, length);\n leaves = this.scroll.descendants(LeafBlot, index, length);\n }\n const [lineFormats, leafFormats] = [lines, leaves].map((blots) => {\n const blot = blots.shift();\n if (blot == null) return {};\n let formats = bubbleFormats(blot);\n while (Object.keys(formats).length > 0) {\n const blot = blots.shift();\n if (blot == null) return formats;\n formats = combineFormats(bubbleFormats(blot), formats);\n }\n return formats;\n });\n return { ...lineFormats, ...leafFormats };\n }\n\n getHTML(index: number, length: number): string {\n const [line, lineOffset] = this.scroll.line(index);\n if (line) {\n const lineLength = line.length();\n const isWithinLine = line.length() >= lineOffset + length;\n if (isWithinLine && !(lineOffset === 0 && length === lineLength)) {\n return convertHTML(line, lineOffset, length, true);\n }\n return convertHTML(this.scroll, index, length, true);\n }\n return '';\n }\n\n getText(index: number, length: number): string {\n return this.getContents(index, length)\n .filter((op) => typeof op.insert === 'string')\n .map((op) => op.insert)\n .join('');\n }\n\n insertContents(index: number, contents: Delta): Delta {\n const normalizedDelta = normalizeDelta(contents);\n const change = new Delta().retain(index).concat(normalizedDelta);\n this.scroll.insertContents(index, normalizedDelta);\n return this.update(change);\n }\n\n insertEmbed(index: number, embed: string, value: unknown): Delta {\n this.scroll.insertAt(index, embed, value);\n return this.update(new Delta().retain(index).insert({ [embed]: value }));\n }\n\n insertText(\n index: number,\n text: string,\n formats: Record = {},\n ): Delta {\n text = text.replace(/\\r\\n/g, '\\n').replace(/\\r/g, '\\n');\n this.scroll.insertAt(index, text);\n Object.keys(formats).forEach((format) => {\n this.scroll.formatAt(index, text.length, format, formats[format]);\n });\n return this.update(\n new Delta().retain(index).insert(text, cloneDeep(formats)),\n );\n }\n\n isBlank(): boolean {\n if (this.scroll.children.length === 0) return true;\n if (this.scroll.children.length > 1) return false;\n const blot = this.scroll.children.head;\n if (blot?.statics.blotName !== Block.blotName) return false;\n const block = blot as Block;\n if (block.children.length > 1) return false;\n return block.children.head instanceof Break;\n }\n\n removeFormat(index: number, length: number): Delta {\n const text = this.getText(index, length);\n const [line, offset] = this.scroll.line(index + length);\n let suffixLength = 0;\n let suffix = new Delta();\n if (line != null) {\n suffixLength = line.length() - offset;\n suffix = line\n .delta()\n .slice(offset, offset + suffixLength - 1)\n .insert('\\n');\n }\n const contents = this.getContents(index, length + suffixLength);\n const diff = contents.diff(new Delta().insert(text).concat(suffix));\n const delta = new Delta().retain(index).concat(diff);\n return this.applyDelta(delta);\n }\n\n update(\n change: Delta | null,\n mutations: MutationRecord[] = [],\n selectionInfo: SelectionInfo | undefined = undefined,\n ): Delta {\n const oldDelta = this.delta;\n if (\n mutations.length === 1 &&\n mutations[0].type === 'characterData' &&\n // @ts-expect-error Fix me later\n mutations[0].target.data.match(ASCII) &&\n this.scroll.find(mutations[0].target)\n ) {\n // Optimization for character changes\n const textBlot = this.scroll.find(mutations[0].target) as Blot;\n const formats = bubbleFormats(textBlot);\n const index = textBlot.offset(this.scroll);\n // @ts-expect-error Fix me later\n const oldValue = mutations[0].oldValue.replace(CursorBlot.CONTENTS, '');\n const oldText = new Delta().insert(oldValue);\n // @ts-expect-error\n const newText = new Delta().insert(textBlot.value());\n const relativeSelectionInfo = selectionInfo && {\n oldRange: shiftRange(selectionInfo.oldRange, -index),\n newRange: shiftRange(selectionInfo.newRange, -index),\n };\n const diffDelta = new Delta()\n .retain(index)\n .concat(oldText.diff(newText, relativeSelectionInfo));\n change = diffDelta.reduce((delta, op) => {\n if (op.insert) {\n return delta.insert(op.insert, formats);\n }\n return delta.push(op);\n }, new Delta());\n this.delta = oldDelta.compose(change);\n } else {\n this.delta = this.getDelta();\n if (!change || !isEqual(oldDelta.compose(change), this.delta)) {\n change = oldDelta.diff(this.delta, selectionInfo);\n }\n }\n return change;\n }\n}\n\ninterface ListItem {\n child: Blot;\n offset: number;\n length: number;\n indent: number;\n type: string;\n}\nfunction convertListHTML(\n items: ListItem[],\n lastIndent: number,\n types: string[],\n): string {\n if (items.length === 0) {\n const [endTag] = getListType(types.pop());\n if (lastIndent <= 0) {\n return ``;\n }\n return `${convertListHTML([], lastIndent - 1, types)}`;\n }\n const [{ child, offset, length, indent, type }, ...rest] = items;\n const [tag, attribute] = getListType(type);\n if (indent > lastIndent) {\n types.push(type);\n if (indent === lastIndent + 1) {\n return `<${tag}>${convertHTML(\n child,\n offset,\n length,\n )}${convertListHTML(rest, indent, types)}`;\n }\n return `<${tag}>
  • ${convertListHTML(items, lastIndent + 1, types)}`;\n }\n const previousType = types[types.length - 1];\n if (indent === lastIndent && type === previousType) {\n return `
  • ${convertHTML(\n child,\n offset,\n length,\n )}${convertListHTML(rest, indent, types)}`;\n }\n const [endTag] = getListType(types.pop());\n return `${convertListHTML(items, lastIndent - 1, types)}`;\n}\n\nfunction convertHTML(\n blot: Blot,\n index: number,\n length: number,\n isRoot = false,\n): string {\n if ('html' in blot && typeof blot.html === 'function') {\n return blot.html(index, length);\n }\n if (blot instanceof TextBlot) {\n const escapedText = escapeText(blot.value().slice(index, index + length));\n return escapedText.replaceAll(' ', ' ');\n }\n if (blot instanceof ParentBlot) {\n // TODO fix API\n if (blot.statics.blotName === 'list-container') {\n const items: any[] = [];\n blot.children.forEachAt(index, length, (child, offset, childLength) => {\n const formats =\n 'formats' in child && typeof child.formats === 'function'\n ? child.formats()\n : {};\n items.push({\n child,\n offset,\n length: childLength,\n indent: formats.indent || 0,\n type: formats.list,\n });\n });\n return convertListHTML(items, -1, []);\n }\n const parts: string[] = [];\n blot.children.forEachAt(index, length, (child, offset, childLength) => {\n parts.push(convertHTML(child, offset, childLength));\n });\n if (isRoot || blot.statics.blotName === 'list') {\n return parts.join('');\n }\n const { outerHTML, innerHTML } = blot.domNode as Element;\n const [start, end] = outerHTML.split(`>${innerHTML}<`);\n // TODO cleanup\n if (start === '${parts.join('')}<${end}`;\n }\n return `${start}>${parts.join('')}<${end}`;\n }\n return blot.domNode instanceof Element ? blot.domNode.outerHTML : '';\n}\n\nfunction combineFormats(\n formats: Record,\n combined: Record,\n): Record {\n return Object.keys(combined).reduce(\n (merged, name) => {\n if (formats[name] == null) return merged;\n const combinedValue = combined[name];\n if (combinedValue === formats[name]) {\n merged[name] = combinedValue;\n } else if (Array.isArray(combinedValue)) {\n if (combinedValue.indexOf(formats[name]) < 0) {\n merged[name] = combinedValue.concat([formats[name]]);\n } else {\n // If style already exists, don't add to an array, but don't lose other styles\n merged[name] = combinedValue;\n }\n } else {\n merged[name] = [combinedValue, formats[name]];\n }\n return merged;\n },\n {} as Record,\n );\n}\n\nfunction getListType(type: string | undefined) {\n const tag = type === 'ordered' ? 'ol' : 'ul';\n switch (type) {\n case 'checked':\n return [tag, ' data-list=\"checked\"'];\n case 'unchecked':\n return [tag, ' data-list=\"unchecked\"'];\n default:\n return [tag, ''];\n }\n}\n\nfunction normalizeDelta(delta: Delta) {\n return delta.reduce((normalizedDelta, op) => {\n if (typeof op.insert === 'string') {\n const text = op.insert.replace(/\\r\\n/g, '\\n').replace(/\\r/g, '\\n');\n return normalizedDelta.insert(text, op.attributes);\n }\n return normalizedDelta.push(op);\n }, new Delta());\n}\n\nfunction shiftRange({ index, length }: Range, amount: number) {\n return new Range(index + amount, length);\n}\n\nfunction splitOpLines(ops: Op[]) {\n const split: Op[] = [];\n ops.forEach((op) => {\n if (typeof op.insert === 'string') {\n const lines = op.insert.split('\\n');\n lines.forEach((line, index) => {\n if (index) split.push({ insert: '\\n', attributes: op.attributes });\n if (line) split.push({ insert: line, attributes: op.attributes });\n });\n } else {\n split.push(op);\n }\n });\n\n return split;\n}\n\nexport default Editor;\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file diff --git a/public/assets/quill/core/emitter.d.ts b/public/assets/quill/core/emitter.d.ts new file mode 100644 index 0000000..afa1a5d --- /dev/null +++ b/public/assets/quill/core/emitter.d.ts @@ -0,0 +1,33 @@ +import { EventEmitter } from 'eventemitter3'; +declare class Emitter extends EventEmitter { + static events: { + readonly EDITOR_CHANGE: "editor-change"; + readonly SCROLL_BEFORE_UPDATE: "scroll-before-update"; + readonly SCROLL_BLOT_MOUNT: "scroll-blot-mount"; + readonly SCROLL_BLOT_UNMOUNT: "scroll-blot-unmount"; + readonly SCROLL_OPTIMIZE: "scroll-optimize"; + readonly SCROLL_UPDATE: "scroll-update"; + readonly SCROLL_EMBED_UPDATE: "scroll-embed-update"; + readonly SELECTION_CHANGE: "selection-change"; + readonly TEXT_CHANGE: "text-change"; + readonly COMPOSITION_BEFORE_START: "composition-before-start"; + readonly COMPOSITION_START: "composition-start"; + readonly COMPOSITION_BEFORE_END: "composition-before-end"; + readonly COMPOSITION_END: "composition-end"; + }; + static sources: { + readonly API: "api"; + readonly SILENT: "silent"; + readonly USER: "user"; + }; + protected domListeners: Record; + constructor(); + emit(...args: unknown[]): boolean; + handleDOM(event: Event, ...args: unknown[]): void; + listenDOM(eventName: string, node: Node, handler: EventListener): void; +} +export type EmitterSource = (typeof Emitter.sources)[keyof typeof Emitter.sources]; +export default Emitter; diff --git a/public/assets/quill/core/emitter.js b/public/assets/quill/core/emitter.js new file mode 100644 index 0000000..372b865 --- /dev/null +++ b/public/assets/quill/core/emitter.js @@ -0,0 +1,78 @@ +import { EventEmitter } from 'eventemitter3'; +import instances from './instances.js'; +import logger from './logger.js'; +const debug = logger('quill:events'); +const EVENTS = ['selectionchange', 'mousedown', 'mouseup', 'click']; +EVENTS.forEach(eventName => { + document.addEventListener(eventName, function () { + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + Array.from(document.querySelectorAll('.ql-container')).forEach(node => { + const quill = instances.get(node); + if (quill && quill.emitter) { + quill.emitter.handleDOM(...args); + } + }); + }); +}); +class Emitter extends EventEmitter { + static events = { + EDITOR_CHANGE: 'editor-change', + SCROLL_BEFORE_UPDATE: 'scroll-before-update', + SCROLL_BLOT_MOUNT: 'scroll-blot-mount', + SCROLL_BLOT_UNMOUNT: 'scroll-blot-unmount', + SCROLL_OPTIMIZE: 'scroll-optimize', + SCROLL_UPDATE: 'scroll-update', + SCROLL_EMBED_UPDATE: 'scroll-embed-update', + SELECTION_CHANGE: 'selection-change', + TEXT_CHANGE: 'text-change', + COMPOSITION_BEFORE_START: 'composition-before-start', + COMPOSITION_START: 'composition-start', + COMPOSITION_BEFORE_END: 'composition-before-end', + COMPOSITION_END: 'composition-end' + }; + static sources = { + API: 'api', + SILENT: 'silent', + USER: 'user' + }; + constructor() { + super(); + this.domListeners = {}; + this.on('error', debug.error); + } + emit() { + for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { + args[_key2] = arguments[_key2]; + } + debug.log.call(debug, ...args); + // @ts-expect-error + return super.emit(...args); + } + handleDOM(event) { + for (var _len3 = arguments.length, args = new Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) { + args[_key3 - 1] = arguments[_key3]; + } + (this.domListeners[event.type] || []).forEach(_ref => { + let { + node, + handler + } = _ref; + if (event.target === node || node.contains(event.target)) { + handler(event, ...args); + } + }); + } + listenDOM(eventName, node, handler) { + if (!this.domListeners[eventName]) { + this.domListeners[eventName] = []; + } + this.domListeners[eventName].push({ + node, + handler + }); + } +} +export default Emitter; +//# sourceMappingURL=emitter.js.map \ No newline at end of file diff --git a/public/assets/quill/core/emitter.js.map b/public/assets/quill/core/emitter.js.map new file mode 100644 index 0000000..124ba59 --- /dev/null +++ b/public/assets/quill/core/emitter.js.map @@ -0,0 +1 @@ +{"version":3,"file":"emitter.js","names":["EventEmitter","instances","logger","debug","EVENTS","forEach","eventName","document","addEventListener","_len","arguments","length","args","Array","_key","from","querySelectorAll","node","quill","get","emitter","handleDOM","Emitter","events","EDITOR_CHANGE","SCROLL_BEFORE_UPDATE","SCROLL_BLOT_MOUNT","SCROLL_BLOT_UNMOUNT","SCROLL_OPTIMIZE","SCROLL_UPDATE","SCROLL_EMBED_UPDATE","SELECTION_CHANGE","TEXT_CHANGE","COMPOSITION_BEFORE_START","COMPOSITION_START","COMPOSITION_BEFORE_END","COMPOSITION_END","sources","API","SILENT","USER","constructor","domListeners","on","error","emit","_len2","_key2","log","call","event","_len3","_key3","type","_ref","handler","target","contains","listenDOM","push"],"sources":["../../src/core/emitter.ts"],"sourcesContent":["import { EventEmitter } from 'eventemitter3';\nimport instances from './instances.js';\nimport logger from './logger.js';\n\nconst debug = logger('quill:events');\nconst EVENTS = ['selectionchange', 'mousedown', 'mouseup', 'click'];\n\nEVENTS.forEach((eventName) => {\n document.addEventListener(eventName, (...args) => {\n Array.from(document.querySelectorAll('.ql-container')).forEach((node) => {\n const quill = instances.get(node);\n if (quill && quill.emitter) {\n quill.emitter.handleDOM(...args);\n }\n });\n });\n});\n\nclass Emitter extends EventEmitter {\n static events = {\n EDITOR_CHANGE: 'editor-change',\n SCROLL_BEFORE_UPDATE: 'scroll-before-update',\n SCROLL_BLOT_MOUNT: 'scroll-blot-mount',\n SCROLL_BLOT_UNMOUNT: 'scroll-blot-unmount',\n SCROLL_OPTIMIZE: 'scroll-optimize',\n SCROLL_UPDATE: 'scroll-update',\n SCROLL_EMBED_UPDATE: 'scroll-embed-update',\n SELECTION_CHANGE: 'selection-change',\n TEXT_CHANGE: 'text-change',\n COMPOSITION_BEFORE_START: 'composition-before-start',\n COMPOSITION_START: 'composition-start',\n COMPOSITION_BEFORE_END: 'composition-before-end',\n COMPOSITION_END: 'composition-end',\n } as const;\n\n static sources = {\n API: 'api',\n SILENT: 'silent',\n USER: 'user',\n } as const;\n\n protected domListeners: Record;\n\n constructor() {\n super();\n this.domListeners = {};\n this.on('error', debug.error);\n }\n\n emit(...args: unknown[]): boolean {\n debug.log.call(debug, ...args);\n // @ts-expect-error\n return super.emit(...args);\n }\n\n handleDOM(event: Event, ...args: unknown[]) {\n (this.domListeners[event.type] || []).forEach(({ node, handler }) => {\n if (event.target === node || node.contains(event.target as Node)) {\n handler(event, ...args);\n }\n });\n }\n\n listenDOM(eventName: string, node: Node, handler: EventListener) {\n if (!this.domListeners[eventName]) {\n this.domListeners[eventName] = [];\n }\n this.domListeners[eventName].push({ node, handler });\n }\n}\n\nexport type EmitterSource =\n (typeof Emitter.sources)[keyof typeof Emitter.sources];\n\nexport default Emitter;\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file diff --git a/public/assets/quill/core/instances.d.ts b/public/assets/quill/core/instances.d.ts new file mode 100644 index 0000000..238f468 --- /dev/null +++ b/public/assets/quill/core/instances.d.ts @@ -0,0 +1,3 @@ +import type Quill from '../core.js'; +declare const _default: WeakMap; +export default _default; diff --git a/public/assets/quill/core/instances.js b/public/assets/quill/core/instances.js new file mode 100644 index 0000000..f6e0846 --- /dev/null +++ b/public/assets/quill/core/instances.js @@ -0,0 +1,2 @@ +export default new WeakMap(); +//# sourceMappingURL=instances.js.map \ No newline at end of file diff --git a/public/assets/quill/core/instances.js.map b/public/assets/quill/core/instances.js.map new file mode 100644 index 0000000..ea6fb3c --- /dev/null +++ b/public/assets/quill/core/instances.js.map @@ -0,0 +1 @@ +{"version":3,"file":"instances.js","names":["WeakMap"],"sources":["../../src/core/instances.ts"],"sourcesContent":["import type Quill from '../core.js';\n\nexport default new WeakMap();\n"],"mappings":"AAEA,eAAe,IAAIA,OAAO,CAAc,CAAC","ignoreList":[]} \ No newline at end of file diff --git a/public/assets/quill/core/logger.d.ts b/public/assets/quill/core/logger.d.ts new file mode 100644 index 0000000..8d8c096 --- /dev/null +++ b/public/assets/quill/core/logger.d.ts @@ -0,0 +1,7 @@ +declare const levels: readonly ["error", "warn", "log", "info"]; +export type DebugLevel = (typeof levels)[number]; +declare function namespace(ns: string): Record void>; +declare namespace namespace { + var level: (newLevel: false | "error" | "warn" | "log" | "info") => void; +} +export default namespace; diff --git a/public/assets/quill/core/logger.js b/public/assets/quill/core/logger.js new file mode 100644 index 0000000..8ed45ba --- /dev/null +++ b/public/assets/quill/core/logger.js @@ -0,0 +1,24 @@ +const levels = ['error', 'warn', 'log', 'info']; +let level = 'warn'; +function debug(method) { + if (level) { + if (levels.indexOf(method) <= levels.indexOf(level)) { + for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; + } + console[method](...args); // eslint-disable-line no-console + } + } +} +function namespace(ns) { + return levels.reduce((logger, method) => { + logger[method] = debug.bind(console, method, ns); + return logger; + }, {}); +} +namespace.level = newLevel => { + level = newLevel; +}; +debug.level = namespace.level; +export default namespace; +//# sourceMappingURL=logger.js.map \ No newline at end of file diff --git a/public/assets/quill/core/logger.js.map b/public/assets/quill/core/logger.js.map new file mode 100644 index 0000000..c4c728f --- /dev/null +++ b/public/assets/quill/core/logger.js.map @@ -0,0 +1 @@ +{"version":3,"file":"logger.js","names":["levels","level","debug","method","indexOf","_len","arguments","length","args","Array","_key","console","namespace","ns","reduce","logger","bind","newLevel"],"sources":["../../src/core/logger.ts"],"sourcesContent":["const levels = ['error', 'warn', 'log', 'info'] as const;\nexport type DebugLevel = (typeof levels)[number];\nlet level: DebugLevel | false = 'warn';\n\nfunction debug(method: DebugLevel, ...args: unknown[]) {\n if (level) {\n if (levels.indexOf(method) <= levels.indexOf(level)) {\n console[method](...args); // eslint-disable-line no-console\n }\n }\n}\n\nfunction namespace(\n ns: string,\n): Record void> {\n return levels.reduce(\n (logger, method) => {\n logger[method] = debug.bind(console, method, ns);\n return logger;\n },\n {} as Record void>,\n );\n}\n\nnamespace.level = (newLevel: DebugLevel | false) => {\n level = newLevel;\n};\ndebug.level = namespace.level;\n\nexport default namespace;\n"],"mappings":"AAAA,MAAMA,MAAM,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAU;AAExD,IAAIC,KAAyB,GAAG,MAAM;AAEtC,SAASC,KAAKA,CAACC,MAAkB,EAAsB;EACrD,IAAIF,KAAK,EAAE;IACT,IAAID,MAAM,CAACI,OAAO,CAACD,MAAM,CAAC,IAAIH,MAAM,CAACI,OAAO,CAACH,KAAK,CAAC,EAAE;MAAA,SAAAI,IAAA,GAAAC,SAAA,CAAAC,MAAA,EAFnBC,IAAI,OAAAC,KAAA,CAAAJ,IAAA,OAAAA,IAAA,WAAAK,IAAA,MAAAA,IAAA,GAAAL,IAAA,EAAAK,IAAA;QAAJF,IAAI,CAAAE,IAAA,QAAAJ,SAAA,CAAAI,IAAA;MAAA;MAGpCC,OAAO,CAACR,MAAM,CAAC,CAAC,GAAGK,IAAI,CAAC,CAAC,CAAC;IAC5B;EACF;AACF;AAEA,SAASI,SAASA,CAChBC,EAAU,EACwC;EAClD,OAAOb,MAAM,CAACc,MAAM,CAClB,CAACC,MAAM,EAAEZ,MAAM,KAAK;IAClBY,MAAM,CAACZ,MAAM,CAAC,GAAGD,KAAK,CAACc,IAAI,CAACL,OAAO,EAAER,MAAM,EAAEU,EAAE,CAAC;IAChD,OAAOE,MAAM;EACf,CAAC,EACD,CAAC,CACH,CAAC;AACH;AAEAH,SAAS,CAACX,KAAK,GAAIgB,QAA4B,IAAK;EAClDhB,KAAK,GAAGgB,QAAQ;AAClB,CAAC;AACDf,KAAK,CAACD,KAAK,GAAGW,SAAS,CAACX,KAAK;AAE7B,eAAeW,SAAS","ignoreList":[]} \ No newline at end of file diff --git a/public/assets/quill/core/module.d.ts b/public/assets/quill/core/module.d.ts new file mode 100644 index 0000000..e8bf10e --- /dev/null +++ b/public/assets/quill/core/module.d.ts @@ -0,0 +1,8 @@ +import type Quill from './quill.js'; +declare abstract class Module { + quill: Quill; + protected options: Partial; + static DEFAULTS: {}; + constructor(quill: Quill, options?: Partial); +} +export default Module; diff --git a/public/assets/quill/core/module.js b/public/assets/quill/core/module.js new file mode 100644 index 0000000..d14a59b --- /dev/null +++ b/public/assets/quill/core/module.js @@ -0,0 +1,10 @@ +class Module { + static DEFAULTS = {}; + constructor(quill) { + let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + this.quill = quill; + this.options = options; + } +} +export default Module; +//# sourceMappingURL=module.js.map \ No newline at end of file diff --git a/public/assets/quill/core/module.js.map b/public/assets/quill/core/module.js.map new file mode 100644 index 0000000..94f23b1 --- /dev/null +++ b/public/assets/quill/core/module.js.map @@ -0,0 +1 @@ +{"version":3,"file":"module.js","names":["Module","DEFAULTS","constructor","quill","options","arguments","length","undefined"],"sources":["../../src/core/module.ts"],"sourcesContent":["import type Quill from './quill.js';\n\nabstract class Module {\n static DEFAULTS = {};\n\n constructor(\n public quill: Quill,\n protected options: Partial = {},\n ) {}\n}\n\nexport default Module;\n"],"mappings":"AAEA,MAAeA,MAAM,CAAoB;EACvC,OAAOC,QAAQ,GAAG,CAAC,CAAC;EAEpBC,WAAWA,CACFC,KAAY,EAEnB;IAAA,IADUC,OAAmB,GAAAC,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAE,SAAA,GAAAF,SAAA,MAAG,CAAC,CAAC;IAAA,KAD3BF,KAAY,GAAZA,KAAY;IAAA,KACTC,OAAmB,GAAnBA,OAAmB;EAC5B;AACL;AAEA,eAAeJ,MAAM","ignoreList":[]} \ No newline at end of file diff --git a/public/assets/quill/core/quill.d.ts b/public/assets/quill/core/quill.d.ts new file mode 100644 index 0000000..17cb7a9 --- /dev/null +++ b/public/assets/quill/core/quill.d.ts @@ -0,0 +1,218 @@ +import * as Parchment from 'parchment'; +import type { Op } from 'quill-delta'; +import Delta from 'quill-delta'; +import type { BlockEmbed } from '../blots/block.js'; +import type Block from '../blots/block.js'; +import type Scroll from '../blots/scroll.js'; +import type Clipboard from '../modules/clipboard.js'; +import type History from '../modules/history.js'; +import type Keyboard from '../modules/keyboard.js'; +import type Uploader from '../modules/uploader.js'; +import Editor from './editor.js'; +import Emitter from './emitter.js'; +import type { EmitterSource } from './emitter.js'; +import type { DebugLevel } from './logger.js'; +import Module from './module.js'; +import Selection, { Range } from './selection.js'; +import type { Bounds } from './selection.js'; +import Composition from './composition.js'; +import Theme from './theme.js'; +import type { ThemeConstructor } from './theme.js'; +import type { Rect } from './utils/scrollRectIntoView.js'; +declare const globalRegistry: Parchment.Registry; +/** + * Options for initializing a Quill instance + */ +export interface QuillOptions { + theme?: string; + debug?: DebugLevel | boolean; + registry?: Parchment.Registry; + /** + * Whether to disable the editing + * @default false + */ + readOnly?: boolean; + /** + * Placeholder text to display when the editor is empty + * @default "" + */ + placeholder?: string; + bounds?: HTMLElement | string | null; + modules?: Record; + /** + * A list of formats that are recognized and can exist within the editor contents. + * `null` means all formats are allowed. + * @default null + */ + formats?: string[] | null; +} +/** + * Similar to QuillOptions, but with all properties expanded to their default values, + * and all selectors resolved to HTMLElements. + */ +export interface ExpandedQuillOptions extends Omit { + theme: ThemeConstructor; + registry: Parchment.Registry; + container: HTMLElement; + modules: Record; + bounds?: HTMLElement | null; + readOnly: boolean; +} +declare class Quill { + static DEFAULTS: { + bounds: null; + modules: { + clipboard: boolean; + keyboard: boolean; + history: boolean; + uploader: boolean; + }; + placeholder: string; + readOnly: false; + registry: Parchment.Registry; + theme: string; + }; + static events: { + readonly EDITOR_CHANGE: "editor-change"; + readonly SCROLL_BEFORE_UPDATE: "scroll-before-update"; + readonly SCROLL_BLOT_MOUNT: "scroll-blot-mount"; + readonly SCROLL_BLOT_UNMOUNT: "scroll-blot-unmount"; + readonly SCROLL_OPTIMIZE: "scroll-optimize"; + readonly SCROLL_UPDATE: "scroll-update"; + readonly SCROLL_EMBED_UPDATE: "scroll-embed-update"; + readonly SELECTION_CHANGE: "selection-change"; + readonly TEXT_CHANGE: "text-change"; + readonly COMPOSITION_BEFORE_START: "composition-before-start"; + readonly COMPOSITION_START: "composition-start"; + readonly COMPOSITION_BEFORE_END: "composition-before-end"; + readonly COMPOSITION_END: "composition-end"; + }; + static sources: { + readonly API: "api"; + readonly SILENT: "silent"; + readonly USER: "user"; + }; + static version: string; + static imports: Record; + static debug(limit: DebugLevel | boolean): void; + static find(node: Node, bubble?: boolean): Parchment.Blot | Quill | null; + static import(name: 'core/module'): typeof Module; + static import(name: `themes/${string}`): typeof Theme; + static import(name: 'parchment'): typeof Parchment; + static import(name: 'delta'): typeof Delta; + static import(name: string): unknown; + static register(targets: Record | Theme | Module | Function>, overwrite?: boolean): void; + static register(target: Parchment.RegistryDefinition, overwrite?: boolean): void; + static register(path: string, target: any, overwrite?: boolean): void; + container: HTMLElement; + root: HTMLDivElement; + scroll: Scroll; + emitter: Emitter; + protected allowReadOnlyEdits: boolean; + editor: Editor; + composition: Composition; + selection: Selection; + theme: Theme; + keyboard: Keyboard; + clipboard: Clipboard; + history: History; + uploader: Uploader; + options: ExpandedQuillOptions; + constructor(container: HTMLElement | string, options?: QuillOptions); + addContainer(container: string, refNode?: Node | null): HTMLDivElement; + addContainer(container: HTMLElement, refNode?: Node | null): HTMLElement; + blur(): void; + deleteText(range: Range, source?: EmitterSource): Delta; + deleteText(index: number, length: number, source?: EmitterSource): Delta; + disable(): void; + editReadOnly(modifier: () => T): T; + enable(enabled?: boolean): void; + focus(options?: { + preventScroll?: boolean; + }): void; + format(name: string, value: unknown, source?: EmitterSource): Delta; + formatLine(index: number, length: number, formats: Record, source?: EmitterSource): Delta; + formatLine(index: number, length: number, name: string, value?: unknown, source?: EmitterSource): Delta; + formatText(range: Range, name: string, value: unknown, source?: EmitterSource): Delta; + formatText(index: number, length: number, name: string, value: unknown, source?: EmitterSource): Delta; + formatText(index: number, length: number, formats: Record, source?: EmitterSource): Delta; + getBounds(index: number | Range, length?: number): Bounds | null; + getContents(index?: number, length?: number): Delta; + getFormat(index?: number, length?: number): { + [format: string]: unknown; + }; + getFormat(range?: Range): { + [format: string]: unknown; + }; + getIndex(blot: Parchment.Blot): number; + getLength(): number; + getLeaf(index: number): [Parchment.LeafBlot | null, number]; + getLine(index: number): [Block | BlockEmbed | null, number]; + getLines(range: Range): (Block | BlockEmbed)[]; + getLines(index?: number, length?: number): (Block | BlockEmbed)[]; + getModule(name: string): unknown; + getSelection(focus: true): Range; + getSelection(focus?: boolean): Range | null; + getSemanticHTML(range: Range): string; + getSemanticHTML(index?: number, length?: number): string; + getText(range?: Range): string; + getText(index?: number, length?: number): string; + hasFocus(): boolean; + insertEmbed(index: number, embed: string, value: unknown, source?: EmitterSource): Delta; + insertText(index: number, text: string, source?: EmitterSource): Delta; + insertText(index: number, text: string, formats: Record, source?: EmitterSource): Delta; + insertText(index: number, text: string, name: string, value: unknown, source?: EmitterSource): Delta; + isEnabled(): boolean; + off(...args: Parameters<(typeof Emitter)['prototype']['off']>): Emitter; + on(event: (typeof Emitter)['events']['TEXT_CHANGE'], handler: (delta: Delta, oldContent: Delta, source: EmitterSource) => void): Emitter; + on(event: (typeof Emitter)['events']['SELECTION_CHANGE'], handler: (range: Range, oldRange: Range, source: EmitterSource) => void): Emitter; + on(event: (typeof Emitter)['events']['EDITOR_CHANGE'], handler: (...args: [ + (typeof Emitter)['events']['TEXT_CHANGE'], + Delta, + Delta, + EmitterSource + ] | [ + (typeof Emitter)['events']['SELECTION_CHANGE'], + Range, + Range, + EmitterSource + ]) => void): Emitter; + on(event: string, ...args: unknown[]): Emitter; + once(...args: Parameters<(typeof Emitter)['prototype']['once']>): Emitter; + removeFormat(index: number, length: number, source?: EmitterSource): Delta; + scrollRectIntoView(rect: Rect): void; + /** + * @deprecated Use Quill#scrollSelectionIntoView() instead. + */ + scrollIntoView(): void; + /** + * Scroll the current selection into the visible area. + * If the selection is already visible, no scrolling will occur. + */ + scrollSelectionIntoView(): void; + setContents(delta: Delta | Op[], source?: EmitterSource): Delta; + setSelection(range: Range | null, source?: EmitterSource): void; + setSelection(index: number, source?: EmitterSource): void; + setSelection(index: number, length?: number, source?: EmitterSource): void; + setSelection(index: number, source?: EmitterSource): void; + setText(text: string, source?: EmitterSource): Delta; + update(source?: EmitterSource): void; + updateContents(delta: Delta | Op[], source?: EmitterSource): Delta; +} +declare function expandConfig(containerOrSelector: HTMLElement | string, options: QuillOptions): ExpandedQuillOptions; +type NormalizedIndexLength = [ + number, + number, + Record, + EmitterSource +]; +declare function overload(index: number, source?: EmitterSource): NormalizedIndexLength; +declare function overload(index: number, length: number, source?: EmitterSource): NormalizedIndexLength; +declare function overload(index: number, length: number, format: string, value: unknown, source?: EmitterSource): NormalizedIndexLength; +declare function overload(index: number, length: number, format: Record, source?: EmitterSource): NormalizedIndexLength; +declare function overload(range: Range, source?: EmitterSource): NormalizedIndexLength; +declare function overload(range: Range, format: string, value: unknown, source?: EmitterSource): NormalizedIndexLength; +declare function overload(range: Range, format: Record, source?: EmitterSource): NormalizedIndexLength; +export type { Bounds, DebugLevel, EmitterSource }; +export { Parchment, Range }; +export { globalRegistry, expandConfig, overload, Quill as default }; diff --git a/public/assets/quill/core/quill.js b/public/assets/quill/core/quill.js new file mode 100644 index 0000000..1d39372 --- /dev/null +++ b/public/assets/quill/core/quill.js @@ -0,0 +1,628 @@ +import { merge } from 'lodash-es'; +import * as Parchment from 'parchment'; +import Delta from 'quill-delta'; +import Editor from './editor.js'; +import Emitter from './emitter.js'; +import instances from './instances.js'; +import logger from './logger.js'; +import Module from './module.js'; +import Selection, { Range } from './selection.js'; +import Composition from './composition.js'; +import Theme from './theme.js'; +import scrollRectIntoView from './utils/scrollRectIntoView.js'; +import createRegistryWithFormats from './utils/createRegistryWithFormats.js'; +const debug = logger('quill'); +const globalRegistry = new Parchment.Registry(); +Parchment.ParentBlot.uiClass = 'ql-ui'; + +/** + * Options for initializing a Quill instance + */ + +/** + * Similar to QuillOptions, but with all properties expanded to their default values, + * and all selectors resolved to HTMLElements. + */ + +class Quill { + static DEFAULTS = { + bounds: null, + modules: { + clipboard: true, + keyboard: true, + history: true, + uploader: true + }, + placeholder: '', + readOnly: false, + registry: globalRegistry, + theme: 'default' + }; + static events = Emitter.events; + static sources = Emitter.sources; + static version = typeof "2.0.3" === 'undefined' ? 'dev' : "2.0.3"; + static imports = { + delta: Delta, + parchment: Parchment, + 'core/module': Module, + 'core/theme': Theme + }; + static debug(limit) { + if (limit === true) { + limit = 'log'; + } + logger.level(limit); + } + static find(node) { + let bubble = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + return instances.get(node) || globalRegistry.find(node, bubble); + } + static import(name) { + if (this.imports[name] == null) { + debug.error(`Cannot import ${name}. Are you sure it was registered?`); + } + return this.imports[name]; + } + static register() { + if (typeof (arguments.length <= 0 ? undefined : arguments[0]) !== 'string') { + const target = arguments.length <= 0 ? undefined : arguments[0]; + const overwrite = !!(arguments.length <= 1 ? undefined : arguments[1]); + const name = 'attrName' in target ? target.attrName : target.blotName; + if (typeof name === 'string') { + // Shortcut for formats: + // register(Blot | Attributor, overwrite) + this.register(`formats/${name}`, target, overwrite); + } else { + Object.keys(target).forEach(key => { + this.register(key, target[key], overwrite); + }); + } + } else { + const path = arguments.length <= 0 ? undefined : arguments[0]; + const target = arguments.length <= 1 ? undefined : arguments[1]; + const overwrite = !!(arguments.length <= 2 ? undefined : arguments[2]); + if (this.imports[path] != null && !overwrite) { + debug.warn(`Overwriting ${path} with`, target); + } + this.imports[path] = target; + if ((path.startsWith('blots/') || path.startsWith('formats/')) && target && typeof target !== 'boolean' && target.blotName !== 'abstract') { + globalRegistry.register(target); + } + if (typeof target.register === 'function') { + target.register(globalRegistry); + } + } + } + constructor(container) { + let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + this.options = expandConfig(container, options); + this.container = this.options.container; + if (this.container == null) { + debug.error('Invalid Quill container', container); + return; + } + if (this.options.debug) { + Quill.debug(this.options.debug); + } + const html = this.container.innerHTML.trim(); + this.container.classList.add('ql-container'); + this.container.innerHTML = ''; + instances.set(this.container, this); + this.root = this.addContainer('ql-editor'); + this.root.classList.add('ql-blank'); + this.emitter = new Emitter(); + const scrollBlotName = Parchment.ScrollBlot.blotName; + const ScrollBlot = this.options.registry.query(scrollBlotName); + if (!ScrollBlot || !('blotName' in ScrollBlot)) { + throw new Error(`Cannot initialize Quill without "${scrollBlotName}" blot`); + } + this.scroll = new ScrollBlot(this.options.registry, this.root, { + emitter: this.emitter + }); + this.editor = new Editor(this.scroll); + this.selection = new Selection(this.scroll, this.emitter); + this.composition = new Composition(this.scroll, this.emitter); + this.theme = new this.options.theme(this, this.options); // eslint-disable-line new-cap + this.keyboard = this.theme.addModule('keyboard'); + this.clipboard = this.theme.addModule('clipboard'); + this.history = this.theme.addModule('history'); + this.uploader = this.theme.addModule('uploader'); + this.theme.addModule('input'); + this.theme.addModule('uiNode'); + this.theme.init(); + this.emitter.on(Emitter.events.EDITOR_CHANGE, type => { + if (type === Emitter.events.TEXT_CHANGE) { + this.root.classList.toggle('ql-blank', this.editor.isBlank()); + } + }); + this.emitter.on(Emitter.events.SCROLL_UPDATE, (source, mutations) => { + const oldRange = this.selection.lastRange; + const [newRange] = this.selection.getRange(); + const selectionInfo = oldRange && newRange ? { + oldRange, + newRange + } : undefined; + modify.call(this, () => this.editor.update(null, mutations, selectionInfo), source); + }); + this.emitter.on(Emitter.events.SCROLL_EMBED_UPDATE, (blot, delta) => { + const oldRange = this.selection.lastRange; + const [newRange] = this.selection.getRange(); + const selectionInfo = oldRange && newRange ? { + oldRange, + newRange + } : undefined; + modify.call(this, () => { + const change = new Delta().retain(blot.offset(this)).retain({ + [blot.statics.blotName]: delta + }); + return this.editor.update(change, [], selectionInfo); + }, Quill.sources.USER); + }); + if (html) { + const contents = this.clipboard.convert({ + html: `${html}


    `, + text: '\n' + }); + this.setContents(contents); + } + this.history.clear(); + if (this.options.placeholder) { + this.root.setAttribute('data-placeholder', this.options.placeholder); + } + if (this.options.readOnly) { + this.disable(); + } + this.allowReadOnlyEdits = false; + } + addContainer(container) { + let refNode = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; + if (typeof container === 'string') { + const className = container; + container = document.createElement('div'); + container.classList.add(className); + } + this.container.insertBefore(container, refNode); + return container; + } + blur() { + this.selection.setRange(null); + } + deleteText(index, length, source) { + // @ts-expect-error + [index, length,, source] = overload(index, length, source); + return modify.call(this, () => { + return this.editor.deleteText(index, length); + }, source, index, -1 * length); + } + disable() { + this.enable(false); + } + editReadOnly(modifier) { + this.allowReadOnlyEdits = true; + const value = modifier(); + this.allowReadOnlyEdits = false; + return value; + } + enable() { + let enabled = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true; + this.scroll.enable(enabled); + this.container.classList.toggle('ql-disabled', !enabled); + } + focus() { + let options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + this.selection.focus(); + if (!options.preventScroll) { + this.scrollSelectionIntoView(); + } + } + format(name, value) { + let source = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : Emitter.sources.API; + return modify.call(this, () => { + const range = this.getSelection(true); + let change = new Delta(); + if (range == null) return change; + if (this.scroll.query(name, Parchment.Scope.BLOCK)) { + change = this.editor.formatLine(range.index, range.length, { + [name]: value + }); + } else if (range.length === 0) { + this.selection.format(name, value); + return change; + } else { + change = this.editor.formatText(range.index, range.length, { + [name]: value + }); + } + this.setSelection(range, Emitter.sources.SILENT); + return change; + }, source); + } + formatLine(index, length, name, value, source) { + let formats; + // eslint-disable-next-line prefer-const + [index, length, formats, source] = overload(index, length, + // @ts-expect-error + name, value, source); + return modify.call(this, () => { + return this.editor.formatLine(index, length, formats); + }, source, index, 0); + } + formatText(index, length, name, value, source) { + let formats; + // eslint-disable-next-line prefer-const + [index, length, formats, source] = overload( + // @ts-expect-error + index, length, name, value, source); + return modify.call(this, () => { + return this.editor.formatText(index, length, formats); + }, source, index, 0); + } + getBounds(index) { + let length = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; + let bounds = null; + if (typeof index === 'number') { + bounds = this.selection.getBounds(index, length); + } else { + bounds = this.selection.getBounds(index.index, index.length); + } + if (!bounds) return null; + const containerBounds = this.container.getBoundingClientRect(); + return { + bottom: bounds.bottom - containerBounds.top, + height: bounds.height, + left: bounds.left - containerBounds.left, + right: bounds.right - containerBounds.left, + top: bounds.top - containerBounds.top, + width: bounds.width + }; + } + getContents() { + let index = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0; + let length = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.getLength() - index; + [index, length] = overload(index, length); + return this.editor.getContents(index, length); + } + getFormat() { + let index = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.getSelection(true); + let length = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; + if (typeof index === 'number') { + return this.editor.getFormat(index, length); + } + return this.editor.getFormat(index.index, index.length); + } + getIndex(blot) { + return blot.offset(this.scroll); + } + getLength() { + return this.scroll.length(); + } + getLeaf(index) { + return this.scroll.leaf(index); + } + getLine(index) { + return this.scroll.line(index); + } + getLines() { + let index = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0; + let length = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : Number.MAX_VALUE; + if (typeof index !== 'number') { + return this.scroll.lines(index.index, index.length); + } + return this.scroll.lines(index, length); + } + getModule(name) { + return this.theme.modules[name]; + } + getSelection() { + let focus = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + if (focus) this.focus(); + this.update(); // Make sure we access getRange with editor in consistent state + return this.selection.getRange()[0]; + } + getSemanticHTML() { + let index = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0; + let length = arguments.length > 1 ? arguments[1] : undefined; + if (typeof index === 'number') { + length = length ?? this.getLength() - index; + } + // @ts-expect-error + [index, length] = overload(index, length); + return this.editor.getHTML(index, length); + } + getText() { + let index = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0; + let length = arguments.length > 1 ? arguments[1] : undefined; + if (typeof index === 'number') { + length = length ?? this.getLength() - index; + } + // @ts-expect-error + [index, length] = overload(index, length); + return this.editor.getText(index, length); + } + hasFocus() { + return this.selection.hasFocus(); + } + insertEmbed(index, embed, value) { + let source = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : Quill.sources.API; + return modify.call(this, () => { + return this.editor.insertEmbed(index, embed, value); + }, source, index); + } + insertText(index, text, name, value, source) { + let formats; + // eslint-disable-next-line prefer-const + // @ts-expect-error + [index,, formats, source] = overload(index, 0, name, value, source); + return modify.call(this, () => { + return this.editor.insertText(index, text, formats); + }, source, index, text.length); + } + isEnabled() { + return this.scroll.isEnabled(); + } + off() { + return this.emitter.off(...arguments); + } + on() { + return this.emitter.on(...arguments); + } + once() { + return this.emitter.once(...arguments); + } + removeFormat(index, length, source) { + [index, length,, source] = overload(index, length, source); + return modify.call(this, () => { + return this.editor.removeFormat(index, length); + }, source, index); + } + scrollRectIntoView(rect) { + scrollRectIntoView(this.root, rect); + } + + /** + * @deprecated Use Quill#scrollSelectionIntoView() instead. + */ + scrollIntoView() { + console.warn('Quill#scrollIntoView() has been deprecated and will be removed in the near future. Please use Quill#scrollSelectionIntoView() instead.'); + this.scrollSelectionIntoView(); + } + + /** + * Scroll the current selection into the visible area. + * If the selection is already visible, no scrolling will occur. + */ + scrollSelectionIntoView() { + const range = this.selection.lastRange; + const bounds = range && this.selection.getBounds(range.index, range.length); + if (bounds) { + this.scrollRectIntoView(bounds); + } + } + setContents(delta) { + let source = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : Emitter.sources.API; + return modify.call(this, () => { + delta = new Delta(delta); + const length = this.getLength(); + // Quill will set empty editor to \n + const delete1 = this.editor.deleteText(0, length); + const applied = this.editor.insertContents(0, delta); + // Remove extra \n from empty editor initialization + const delete2 = this.editor.deleteText(this.getLength() - 1, 1); + return delete1.compose(applied).compose(delete2); + }, source); + } + setSelection(index, length, source) { + if (index == null) { + // @ts-expect-error https://github.com/microsoft/TypeScript/issues/22609 + this.selection.setRange(null, length || Quill.sources.API); + } else { + // @ts-expect-error + [index, length,, source] = overload(index, length, source); + this.selection.setRange(new Range(Math.max(0, index), length), source); + if (source !== Emitter.sources.SILENT) { + this.scrollSelectionIntoView(); + } + } + } + setText(text) { + let source = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : Emitter.sources.API; + const delta = new Delta().insert(text); + return this.setContents(delta, source); + } + update() { + let source = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : Emitter.sources.USER; + const change = this.scroll.update(source); // Will update selection before selection.update() does if text changes + this.selection.update(source); + // TODO this is usually undefined + return change; + } + updateContents(delta) { + let source = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : Emitter.sources.API; + return modify.call(this, () => { + delta = new Delta(delta); + return this.editor.applyDelta(delta); + }, source, true); + } +} +function resolveSelector(selector) { + return typeof selector === 'string' ? document.querySelector(selector) : selector; +} +function expandModuleConfig(config) { + return Object.entries(config ?? {}).reduce((expanded, _ref) => { + let [key, value] = _ref; + return { + ...expanded, + [key]: value === true ? {} : value + }; + }, {}); +} +function omitUndefinedValuesFromOptions(obj) { + return Object.fromEntries(Object.entries(obj).filter(entry => entry[1] !== undefined)); +} +function expandConfig(containerOrSelector, options) { + const container = resolveSelector(containerOrSelector); + if (!container) { + throw new Error('Invalid Quill container'); + } + const shouldUseDefaultTheme = !options.theme || options.theme === Quill.DEFAULTS.theme; + const theme = shouldUseDefaultTheme ? Theme : Quill.import(`themes/${options.theme}`); + if (!theme) { + throw new Error(`Invalid theme ${options.theme}. Did you register it?`); + } + const { + modules: quillModuleDefaults, + ...quillDefaults + } = Quill.DEFAULTS; + const { + modules: themeModuleDefaults, + ...themeDefaults + } = theme.DEFAULTS; + let userModuleOptions = expandModuleConfig(options.modules); + // Special case toolbar shorthand + if (userModuleOptions != null && userModuleOptions.toolbar && userModuleOptions.toolbar.constructor !== Object) { + userModuleOptions = { + ...userModuleOptions, + toolbar: { + container: userModuleOptions.toolbar + } + }; + } + const modules = merge({}, expandModuleConfig(quillModuleDefaults), expandModuleConfig(themeModuleDefaults), userModuleOptions); + const config = { + ...quillDefaults, + ...omitUndefinedValuesFromOptions(themeDefaults), + ...omitUndefinedValuesFromOptions(options) + }; + let registry = options.registry; + if (registry) { + if (options.formats) { + debug.warn('Ignoring "formats" option because "registry" is specified'); + } + } else { + registry = options.formats ? createRegistryWithFormats(options.formats, config.registry, debug) : config.registry; + } + return { + ...config, + registry, + container, + theme, + modules: Object.entries(modules).reduce((modulesWithDefaults, _ref2) => { + let [name, value] = _ref2; + if (!value) return modulesWithDefaults; + const moduleClass = Quill.import(`modules/${name}`); + if (moduleClass == null) { + debug.error(`Cannot load ${name} module. Are you sure you registered it?`); + return modulesWithDefaults; + } + return { + ...modulesWithDefaults, + // @ts-expect-error + [name]: merge({}, moduleClass.DEFAULTS || {}, value) + }; + }, {}), + bounds: resolveSelector(config.bounds) + }; +} + +// Handle selection preservation and TEXT_CHANGE emission +// common to modification APIs +function modify(modifier, source, index, shift) { + if (!this.isEnabled() && source === Emitter.sources.USER && !this.allowReadOnlyEdits) { + return new Delta(); + } + let range = index == null ? null : this.getSelection(); + const oldDelta = this.editor.delta; + const change = modifier(); + if (range != null) { + if (index === true) { + index = range.index; // eslint-disable-line prefer-destructuring + } + if (shift == null) { + range = shiftRange(range, change, source); + } else if (shift !== 0) { + // @ts-expect-error index should always be number + range = shiftRange(range, index, shift, source); + } + this.setSelection(range, Emitter.sources.SILENT); + } + if (change.length() > 0) { + const args = [Emitter.events.TEXT_CHANGE, change, oldDelta, source]; + this.emitter.emit(Emitter.events.EDITOR_CHANGE, ...args); + if (source !== Emitter.sources.SILENT) { + this.emitter.emit(...args); + } + } + return change; +} +function overload(index, length, name, value, source) { + let formats = {}; + // @ts-expect-error + if (typeof index.index === 'number' && typeof index.length === 'number') { + // Allow for throwaway end (used by insertText/insertEmbed) + if (typeof length !== 'number') { + // @ts-expect-error + source = value; + value = name; + name = length; + // @ts-expect-error + length = index.length; // eslint-disable-line prefer-destructuring + // @ts-expect-error + index = index.index; // eslint-disable-line prefer-destructuring + } else { + // @ts-expect-error + length = index.length; // eslint-disable-line prefer-destructuring + // @ts-expect-error + index = index.index; // eslint-disable-line prefer-destructuring + } + } else if (typeof length !== 'number') { + // @ts-expect-error + source = value; + value = name; + name = length; + length = 0; + } + // Handle format being object, two format name/value strings or excluded + if (typeof name === 'object') { + // @ts-expect-error Fix me later + formats = name; + // @ts-expect-error + source = value; + } else if (typeof name === 'string') { + if (value != null) { + formats[name] = value; + } else { + // @ts-expect-error + source = name; + } + } + // Handle optional source + source = source || Emitter.sources.API; + // @ts-expect-error + return [index, length, formats, source]; +} +function shiftRange(range, index, lengthOrSource, source) { + const length = typeof lengthOrSource === 'number' ? lengthOrSource : 0; + if (range == null) return null; + let start; + let end; + // @ts-expect-error -- TODO: add a better type guard around `index` + if (index && typeof index.transformPosition === 'function') { + [start, end] = [range.index, range.index + range.length].map(pos => + // @ts-expect-error -- TODO: add a better type guard around `index` + index.transformPosition(pos, source !== Emitter.sources.USER)); + } else { + [start, end] = [range.index, range.index + range.length].map(pos => { + // @ts-expect-error -- TODO: add a better type guard around `index` + if (pos < index || pos === index && source === Emitter.sources.USER) return pos; + if (length >= 0) { + return pos + length; + } + // @ts-expect-error -- TODO: add a better type guard around `index` + return Math.max(index, pos + length); + }); + } + return new Range(start, end - start); +} +export { Parchment, Range }; +export { globalRegistry, expandConfig, overload, Quill as default }; +//# sourceMappingURL=quill.js.map \ No newline at end of file diff --git a/public/assets/quill/core/quill.js.map b/public/assets/quill/core/quill.js.map new file mode 100644 index 0000000..fb3072f --- /dev/null +++ b/public/assets/quill/core/quill.js.map @@ -0,0 +1 @@ +{"version":3,"file":"quill.js","names":["merge","Parchment","Delta","Editor","Emitter","instances","logger","Module","Selection","Range","Composition","Theme","scrollRectIntoView","createRegistryWithFormats","debug","globalRegistry","Registry","ParentBlot","uiClass","Quill","DEFAULTS","bounds","modules","clipboard","keyboard","history","uploader","placeholder","readOnly","registry","theme","events","sources","version","imports","delta","parchment","limit","level","find","node","bubble","arguments","length","undefined","get","import","name","error","register","target","overwrite","attrName","blotName","Object","keys","forEach","key","path","warn","startsWith","constructor","container","options","expandConfig","html","innerHTML","trim","classList","add","set","root","addContainer","emitter","scrollBlotName","ScrollBlot","query","Error","scroll","editor","selection","composition","addModule","init","on","EDITOR_CHANGE","type","TEXT_CHANGE","toggle","isBlank","SCROLL_UPDATE","source","mutations","oldRange","lastRange","newRange","getRange","selectionInfo","modify","call","update","SCROLL_EMBED_UPDATE","blot","change","retain","offset","statics","USER","contents","convert","text","setContents","clear","setAttribute","disable","allowReadOnlyEdits","refNode","className","document","createElement","insertBefore","blur","setRange","deleteText","index","overload","enable","editReadOnly","modifier","value","enabled","focus","preventScroll","scrollSelectionIntoView","format","API","range","getSelection","Scope","BLOCK","formatLine","formatText","setSelection","SILENT","formats","getBounds","containerBounds","getBoundingClientRect","bottom","top","height","left","right","width","getContents","getLength","getFormat","getIndex","getLeaf","leaf","getLine","line","getLines","Number","MAX_VALUE","lines","getModule","getSemanticHTML","getHTML","getText","hasFocus","insertEmbed","embed","insertText","isEnabled","off","once","removeFormat","rect","scrollIntoView","console","delete1","applied","insertContents","delete2","compose","Math","max","setText","insert","updateContents","applyDelta","resolveSelector","selector","querySelector","expandModuleConfig","config","entries","reduce","expanded","_ref","omitUndefinedValuesFromOptions","obj","fromEntries","filter","entry","containerOrSelector","shouldUseDefaultTheme","quillModuleDefaults","quillDefaults","themeModuleDefaults","themeDefaults","userModuleOptions","toolbar","modulesWithDefaults","_ref2","moduleClass","shift","oldDelta","shiftRange","args","emit","lengthOrSource","start","end","transformPosition","map","pos","default"],"sources":["../../src/core/quill.ts"],"sourcesContent":["import { merge } from 'lodash-es';\nimport * as Parchment from 'parchment';\nimport type { Op } from 'quill-delta';\nimport Delta from 'quill-delta';\nimport type { BlockEmbed } from '../blots/block.js';\nimport type Block from '../blots/block.js';\nimport type Scroll from '../blots/scroll.js';\nimport type Clipboard from '../modules/clipboard.js';\nimport type History from '../modules/history.js';\nimport type Keyboard from '../modules/keyboard.js';\nimport type Uploader from '../modules/uploader.js';\nimport Editor from './editor.js';\nimport Emitter from './emitter.js';\nimport type { EmitterSource } from './emitter.js';\nimport instances from './instances.js';\nimport logger from './logger.js';\nimport type { DebugLevel } from './logger.js';\nimport Module from './module.js';\nimport Selection, { Range } from './selection.js';\nimport type { Bounds } from './selection.js';\nimport Composition from './composition.js';\nimport Theme from './theme.js';\nimport type { ThemeConstructor } from './theme.js';\nimport scrollRectIntoView from './utils/scrollRectIntoView.js';\nimport type { Rect } from './utils/scrollRectIntoView.js';\nimport createRegistryWithFormats from './utils/createRegistryWithFormats.js';\n\nconst debug = logger('quill');\n\nconst globalRegistry = new Parchment.Registry();\nParchment.ParentBlot.uiClass = 'ql-ui';\n\n/**\n * Options for initializing a Quill instance\n */\nexport interface QuillOptions {\n theme?: string;\n debug?: DebugLevel | boolean;\n registry?: Parchment.Registry;\n /**\n * Whether to disable the editing\n * @default false\n */\n readOnly?: boolean;\n\n /**\n * Placeholder text to display when the editor is empty\n * @default \"\"\n */\n placeholder?: string;\n bounds?: HTMLElement | string | null;\n modules?: Record;\n\n /**\n * A list of formats that are recognized and can exist within the editor contents.\n * `null` means all formats are allowed.\n * @default null\n */\n formats?: string[] | null;\n}\n\n/**\n * Similar to QuillOptions, but with all properties expanded to their default values,\n * and all selectors resolved to HTMLElements.\n */\nexport interface ExpandedQuillOptions\n extends Omit {\n theme: ThemeConstructor;\n registry: Parchment.Registry;\n container: HTMLElement;\n modules: Record;\n bounds?: HTMLElement | null;\n readOnly: boolean;\n}\n\nclass Quill {\n static DEFAULTS = {\n bounds: null,\n modules: {\n clipboard: true,\n keyboard: true,\n history: true,\n uploader: true,\n },\n placeholder: '',\n readOnly: false,\n registry: globalRegistry,\n theme: 'default',\n } satisfies Partial;\n static events = Emitter.events;\n static sources = Emitter.sources;\n static version = typeof QUILL_VERSION === 'undefined' ? 'dev' : QUILL_VERSION;\n\n static imports: Record = {\n delta: Delta,\n parchment: Parchment,\n 'core/module': Module,\n 'core/theme': Theme,\n };\n\n static debug(limit: DebugLevel | boolean) {\n if (limit === true) {\n limit = 'log';\n }\n logger.level(limit);\n }\n\n static find(node: Node, bubble = false) {\n return instances.get(node) || globalRegistry.find(node, bubble);\n }\n\n static import(name: 'core/module'): typeof Module;\n static import(name: `themes/${string}`): typeof Theme;\n static import(name: 'parchment'): typeof Parchment;\n static import(name: 'delta'): typeof Delta;\n static import(name: string): unknown;\n static import(name: string) {\n if (this.imports[name] == null) {\n debug.error(`Cannot import ${name}. Are you sure it was registered?`);\n }\n return this.imports[name];\n }\n\n static register(\n targets: Record<\n string,\n | Parchment.RegistryDefinition\n | Record // any objects\n | Theme\n | Module\n | Function // ES5 constructors\n >,\n overwrite?: boolean,\n ): void;\n static register(\n target: Parchment.RegistryDefinition,\n overwrite?: boolean,\n ): void;\n static register(path: string, target: any, overwrite?: boolean): void;\n static register(...args: any[]): void {\n if (typeof args[0] !== 'string') {\n const target = args[0];\n const overwrite = !!args[1];\n\n const name = 'attrName' in target ? target.attrName : target.blotName;\n if (typeof name === 'string') {\n // Shortcut for formats:\n // register(Blot | Attributor, overwrite)\n this.register(`formats/${name}`, target, overwrite);\n } else {\n Object.keys(target).forEach((key) => {\n this.register(key, target[key], overwrite);\n });\n }\n } else {\n const path = args[0];\n const target = args[1];\n const overwrite = !!args[2];\n\n if (this.imports[path] != null && !overwrite) {\n debug.warn(`Overwriting ${path} with`, target);\n }\n this.imports[path] = target;\n if (\n (path.startsWith('blots/') || path.startsWith('formats/')) &&\n target &&\n typeof target !== 'boolean' &&\n target.blotName !== 'abstract'\n ) {\n globalRegistry.register(target);\n }\n if (typeof target.register === 'function') {\n target.register(globalRegistry);\n }\n }\n }\n\n container: HTMLElement;\n root: HTMLDivElement;\n scroll: Scroll;\n emitter: Emitter;\n protected allowReadOnlyEdits: boolean;\n editor: Editor;\n composition: Composition;\n selection: Selection;\n\n theme: Theme;\n keyboard: Keyboard;\n clipboard: Clipboard;\n history: History;\n uploader: Uploader;\n\n options: ExpandedQuillOptions;\n\n constructor(container: HTMLElement | string, options: QuillOptions = {}) {\n this.options = expandConfig(container, options);\n this.container = this.options.container;\n if (this.container == null) {\n debug.error('Invalid Quill container', container);\n return;\n }\n if (this.options.debug) {\n Quill.debug(this.options.debug);\n }\n const html = this.container.innerHTML.trim();\n this.container.classList.add('ql-container');\n this.container.innerHTML = '';\n instances.set(this.container, this);\n this.root = this.addContainer('ql-editor');\n this.root.classList.add('ql-blank');\n this.emitter = new Emitter();\n const scrollBlotName = Parchment.ScrollBlot.blotName;\n const ScrollBlot = this.options.registry.query(scrollBlotName);\n if (!ScrollBlot || !('blotName' in ScrollBlot)) {\n throw new Error(\n `Cannot initialize Quill without \"${scrollBlotName}\" blot`,\n );\n }\n this.scroll = new ScrollBlot(this.options.registry, this.root, {\n emitter: this.emitter,\n }) as Scroll;\n this.editor = new Editor(this.scroll);\n this.selection = new Selection(this.scroll, this.emitter);\n this.composition = new Composition(this.scroll, this.emitter);\n this.theme = new this.options.theme(this, this.options); // eslint-disable-line new-cap\n this.keyboard = this.theme.addModule('keyboard');\n this.clipboard = this.theme.addModule('clipboard');\n this.history = this.theme.addModule('history');\n this.uploader = this.theme.addModule('uploader');\n this.theme.addModule('input');\n this.theme.addModule('uiNode');\n this.theme.init();\n this.emitter.on(Emitter.events.EDITOR_CHANGE, (type) => {\n if (type === Emitter.events.TEXT_CHANGE) {\n this.root.classList.toggle('ql-blank', this.editor.isBlank());\n }\n });\n this.emitter.on(Emitter.events.SCROLL_UPDATE, (source, mutations) => {\n const oldRange = this.selection.lastRange;\n const [newRange] = this.selection.getRange();\n const selectionInfo =\n oldRange && newRange ? { oldRange, newRange } : undefined;\n modify.call(\n this,\n () => this.editor.update(null, mutations, selectionInfo),\n source,\n );\n });\n this.emitter.on(Emitter.events.SCROLL_EMBED_UPDATE, (blot, delta) => {\n const oldRange = this.selection.lastRange;\n const [newRange] = this.selection.getRange();\n const selectionInfo =\n oldRange && newRange ? { oldRange, newRange } : undefined;\n modify.call(\n this,\n () => {\n const change = new Delta()\n .retain(blot.offset(this))\n .retain({ [blot.statics.blotName]: delta });\n return this.editor.update(change, [], selectionInfo);\n },\n Quill.sources.USER,\n );\n });\n if (html) {\n const contents = this.clipboard.convert({\n html: `${html}


    `,\n text: '\\n',\n });\n this.setContents(contents);\n }\n this.history.clear();\n if (this.options.placeholder) {\n this.root.setAttribute('data-placeholder', this.options.placeholder);\n }\n if (this.options.readOnly) {\n this.disable();\n }\n this.allowReadOnlyEdits = false;\n }\n\n addContainer(container: string, refNode?: Node | null): HTMLDivElement;\n addContainer(container: HTMLElement, refNode?: Node | null): HTMLElement;\n addContainer(\n container: string | HTMLElement,\n refNode: Node | null = null,\n ): HTMLDivElement | HTMLElement {\n if (typeof container === 'string') {\n const className = container;\n container = document.createElement('div');\n container.classList.add(className);\n }\n this.container.insertBefore(container, refNode);\n return container;\n }\n\n blur() {\n this.selection.setRange(null);\n }\n\n deleteText(range: Range, source?: EmitterSource): Delta;\n deleteText(index: number, length: number, source?: EmitterSource): Delta;\n deleteText(\n index: number | Range,\n length?: number | EmitterSource,\n source?: EmitterSource,\n ): Delta {\n // @ts-expect-error\n [index, length, , source] = overload(index, length, source);\n return modify.call(\n this,\n () => {\n return this.editor.deleteText(index, length);\n },\n source,\n index,\n -1 * length,\n );\n }\n\n disable() {\n this.enable(false);\n }\n\n editReadOnly(modifier: () => T): T {\n this.allowReadOnlyEdits = true;\n const value = modifier();\n this.allowReadOnlyEdits = false;\n return value;\n }\n\n enable(enabled = true) {\n this.scroll.enable(enabled);\n this.container.classList.toggle('ql-disabled', !enabled);\n }\n\n focus(options: { preventScroll?: boolean } = {}) {\n this.selection.focus();\n if (!options.preventScroll) {\n this.scrollSelectionIntoView();\n }\n }\n\n format(\n name: string,\n value: unknown,\n source: EmitterSource = Emitter.sources.API,\n ): Delta {\n return modify.call(\n this,\n () => {\n const range = this.getSelection(true);\n let change = new Delta();\n if (range == null) return change;\n if (this.scroll.query(name, Parchment.Scope.BLOCK)) {\n change = this.editor.formatLine(range.index, range.length, {\n [name]: value,\n });\n } else if (range.length === 0) {\n this.selection.format(name, value);\n return change;\n } else {\n change = this.editor.formatText(range.index, range.length, {\n [name]: value,\n });\n }\n this.setSelection(range, Emitter.sources.SILENT);\n return change;\n },\n source,\n );\n }\n\n formatLine(\n index: number,\n length: number,\n formats: Record,\n source?: EmitterSource,\n ): Delta;\n formatLine(\n index: number,\n length: number,\n name: string,\n value?: unknown,\n source?: EmitterSource,\n ): Delta;\n formatLine(\n index: number,\n length: number,\n name: string | Record,\n value?: unknown | EmitterSource,\n source?: EmitterSource,\n ): Delta {\n let formats: Record;\n // eslint-disable-next-line prefer-const\n [index, length, formats, source] = overload(\n index,\n length,\n // @ts-expect-error\n name,\n value,\n source,\n );\n return modify.call(\n this,\n () => {\n return this.editor.formatLine(index, length, formats);\n },\n source,\n index,\n 0,\n );\n }\n\n formatText(\n range: Range,\n name: string,\n value: unknown,\n source?: EmitterSource,\n ): Delta;\n formatText(\n index: number,\n length: number,\n name: string,\n value: unknown,\n source?: EmitterSource,\n ): Delta;\n formatText(\n index: number,\n length: number,\n formats: Record,\n source?: EmitterSource,\n ): Delta;\n formatText(\n index: number | Range,\n length: number | string,\n name: string | unknown,\n value?: unknown | EmitterSource,\n source?: EmitterSource,\n ): Delta {\n let formats: Record;\n // eslint-disable-next-line prefer-const\n [index, length, formats, source] = overload(\n // @ts-expect-error\n index,\n length,\n name,\n value,\n source,\n );\n return modify.call(\n this,\n () => {\n return this.editor.formatText(index, length, formats);\n },\n source,\n index,\n 0,\n );\n }\n\n getBounds(index: number | Range, length = 0): Bounds | null {\n let bounds: Bounds | null = null;\n if (typeof index === 'number') {\n bounds = this.selection.getBounds(index, length);\n } else {\n bounds = this.selection.getBounds(index.index, index.length);\n }\n if (!bounds) return null;\n const containerBounds = this.container.getBoundingClientRect();\n return {\n bottom: bounds.bottom - containerBounds.top,\n height: bounds.height,\n left: bounds.left - containerBounds.left,\n right: bounds.right - containerBounds.left,\n top: bounds.top - containerBounds.top,\n width: bounds.width,\n };\n }\n\n getContents(index = 0, length = this.getLength() - index) {\n [index, length] = overload(index, length);\n return this.editor.getContents(index, length);\n }\n\n getFormat(index?: number, length?: number): { [format: string]: unknown };\n getFormat(range?: Range): {\n [format: string]: unknown;\n };\n getFormat(\n index: Range | number = this.getSelection(true),\n length = 0,\n ): { [format: string]: unknown } {\n if (typeof index === 'number') {\n return this.editor.getFormat(index, length);\n }\n return this.editor.getFormat(index.index, index.length);\n }\n\n getIndex(blot: Parchment.Blot) {\n return blot.offset(this.scroll);\n }\n\n getLength() {\n return this.scroll.length();\n }\n\n getLeaf(index: number) {\n return this.scroll.leaf(index);\n }\n\n getLine(index: number) {\n return this.scroll.line(index);\n }\n\n getLines(range: Range): (Block | BlockEmbed)[];\n getLines(index?: number, length?: number): (Block | BlockEmbed)[];\n getLines(\n index: Range | number = 0,\n length = Number.MAX_VALUE,\n ): (Block | BlockEmbed)[] {\n if (typeof index !== 'number') {\n return this.scroll.lines(index.index, index.length);\n }\n return this.scroll.lines(index, length);\n }\n\n getModule(name: string) {\n return this.theme.modules[name];\n }\n\n getSelection(focus: true): Range;\n getSelection(focus?: boolean): Range | null;\n getSelection(focus = false): Range | null {\n if (focus) this.focus();\n this.update(); // Make sure we access getRange with editor in consistent state\n return this.selection.getRange()[0];\n }\n\n getSemanticHTML(range: Range): string;\n getSemanticHTML(index?: number, length?: number): string;\n getSemanticHTML(index: Range | number = 0, length?: number) {\n if (typeof index === 'number') {\n length = length ?? this.getLength() - index;\n }\n // @ts-expect-error\n [index, length] = overload(index, length);\n return this.editor.getHTML(index, length);\n }\n\n getText(range?: Range): string;\n getText(index?: number, length?: number): string;\n getText(index: Range | number = 0, length?: number): string {\n if (typeof index === 'number') {\n length = length ?? this.getLength() - index;\n }\n // @ts-expect-error\n [index, length] = overload(index, length);\n return this.editor.getText(index, length);\n }\n\n hasFocus() {\n return this.selection.hasFocus();\n }\n\n insertEmbed(\n index: number,\n embed: string,\n value: unknown,\n source: EmitterSource = Quill.sources.API,\n ): Delta {\n return modify.call(\n this,\n () => {\n return this.editor.insertEmbed(index, embed, value);\n },\n source,\n index,\n );\n }\n\n insertText(index: number, text: string, source?: EmitterSource): Delta;\n insertText(\n index: number,\n text: string,\n formats: Record,\n source?: EmitterSource,\n ): Delta;\n insertText(\n index: number,\n text: string,\n name: string,\n value: unknown,\n source?: EmitterSource,\n ): Delta;\n insertText(\n index: number,\n text: string,\n name?: string | Record | EmitterSource,\n value?: unknown,\n source?: EmitterSource,\n ): Delta {\n let formats: Record;\n // eslint-disable-next-line prefer-const\n // @ts-expect-error\n [index, , formats, source] = overload(index, 0, name, value, source);\n return modify.call(\n this,\n () => {\n return this.editor.insertText(index, text, formats);\n },\n source,\n index,\n text.length,\n );\n }\n\n isEnabled() {\n return this.scroll.isEnabled();\n }\n\n off(...args: Parameters<(typeof Emitter)['prototype']['off']>) {\n return this.emitter.off(...args);\n }\n\n on(\n event: (typeof Emitter)['events']['TEXT_CHANGE'],\n handler: (delta: Delta, oldContent: Delta, source: EmitterSource) => void,\n ): Emitter;\n on(\n event: (typeof Emitter)['events']['SELECTION_CHANGE'],\n handler: (range: Range, oldRange: Range, source: EmitterSource) => void,\n ): Emitter;\n on(\n event: (typeof Emitter)['events']['EDITOR_CHANGE'],\n handler: (\n ...args:\n | [\n (typeof Emitter)['events']['TEXT_CHANGE'],\n Delta,\n Delta,\n EmitterSource,\n ]\n | [\n (typeof Emitter)['events']['SELECTION_CHANGE'],\n Range,\n Range,\n EmitterSource,\n ]\n ) => void,\n ): Emitter;\n on(event: string, ...args: unknown[]): Emitter;\n on(...args: Parameters<(typeof Emitter)['prototype']['on']>): Emitter {\n return this.emitter.on(...args);\n }\n\n once(...args: Parameters<(typeof Emitter)['prototype']['once']>) {\n return this.emitter.once(...args);\n }\n\n removeFormat(index: number, length: number, source?: EmitterSource): Delta {\n [index, length, , source] = overload(index, length, source);\n return modify.call(\n this,\n () => {\n return this.editor.removeFormat(index, length);\n },\n source,\n index,\n );\n }\n\n scrollRectIntoView(rect: Rect) {\n scrollRectIntoView(this.root, rect);\n }\n\n /**\n * @deprecated Use Quill#scrollSelectionIntoView() instead.\n */\n scrollIntoView() {\n console.warn(\n 'Quill#scrollIntoView() has been deprecated and will be removed in the near future. Please use Quill#scrollSelectionIntoView() instead.',\n );\n this.scrollSelectionIntoView();\n }\n\n /**\n * Scroll the current selection into the visible area.\n * If the selection is already visible, no scrolling will occur.\n */\n scrollSelectionIntoView() {\n const range = this.selection.lastRange;\n const bounds = range && this.selection.getBounds(range.index, range.length);\n if (bounds) {\n this.scrollRectIntoView(bounds);\n }\n }\n\n setContents(\n delta: Delta | Op[],\n source: EmitterSource = Emitter.sources.API,\n ): Delta {\n return modify.call(\n this,\n () => {\n delta = new Delta(delta);\n const length = this.getLength();\n // Quill will set empty editor to \\n\n const delete1 = this.editor.deleteText(0, length);\n const applied = this.editor.insertContents(0, delta);\n // Remove extra \\n from empty editor initialization\n const delete2 = this.editor.deleteText(this.getLength() - 1, 1);\n return delete1.compose(applied).compose(delete2);\n },\n source,\n );\n }\n setSelection(range: Range | null, source?: EmitterSource): void;\n setSelection(index: number, source?: EmitterSource): void;\n setSelection(index: number, length?: number, source?: EmitterSource): void;\n setSelection(index: number, source?: EmitterSource): void;\n setSelection(\n index: Range | null | number,\n length?: EmitterSource | number,\n source?: EmitterSource,\n ): void {\n if (index == null) {\n // @ts-expect-error https://github.com/microsoft/TypeScript/issues/22609\n this.selection.setRange(null, length || Quill.sources.API);\n } else {\n // @ts-expect-error\n [index, length, , source] = overload(index, length, source);\n this.selection.setRange(new Range(Math.max(0, index), length), source);\n if (source !== Emitter.sources.SILENT) {\n this.scrollSelectionIntoView();\n }\n }\n }\n\n setText(text: string, source: EmitterSource = Emitter.sources.API) {\n const delta = new Delta().insert(text);\n return this.setContents(delta, source);\n }\n\n update(source: EmitterSource = Emitter.sources.USER) {\n const change = this.scroll.update(source); // Will update selection before selection.update() does if text changes\n this.selection.update(source);\n // TODO this is usually undefined\n return change;\n }\n\n updateContents(\n delta: Delta | Op[],\n source: EmitterSource = Emitter.sources.API,\n ): Delta {\n return modify.call(\n this,\n () => {\n delta = new Delta(delta);\n return this.editor.applyDelta(delta);\n },\n source,\n true,\n );\n }\n}\n\nfunction resolveSelector(selector: string | HTMLElement | null | undefined) {\n return typeof selector === 'string'\n ? document.querySelector(selector)\n : selector;\n}\n\nfunction expandModuleConfig(config: Record | undefined) {\n return Object.entries(config ?? {}).reduce(\n (expanded, [key, value]) => ({\n ...expanded,\n [key]: value === true ? {} : value,\n }),\n {} as Record,\n );\n}\n\nfunction omitUndefinedValuesFromOptions(obj: QuillOptions) {\n return Object.fromEntries(\n Object.entries(obj).filter((entry) => entry[1] !== undefined),\n );\n}\n\nfunction expandConfig(\n containerOrSelector: HTMLElement | string,\n options: QuillOptions,\n): ExpandedQuillOptions {\n const container = resolveSelector(containerOrSelector);\n if (!container) {\n throw new Error('Invalid Quill container');\n }\n\n const shouldUseDefaultTheme =\n !options.theme || options.theme === Quill.DEFAULTS.theme;\n const theme = shouldUseDefaultTheme\n ? Theme\n : Quill.import(`themes/${options.theme}`);\n if (!theme) {\n throw new Error(`Invalid theme ${options.theme}. Did you register it?`);\n }\n\n const { modules: quillModuleDefaults, ...quillDefaults } = Quill.DEFAULTS;\n const { modules: themeModuleDefaults, ...themeDefaults } = theme.DEFAULTS;\n\n let userModuleOptions = expandModuleConfig(options.modules);\n // Special case toolbar shorthand\n if (\n userModuleOptions != null &&\n userModuleOptions.toolbar &&\n userModuleOptions.toolbar.constructor !== Object\n ) {\n userModuleOptions = {\n ...userModuleOptions,\n toolbar: { container: userModuleOptions.toolbar },\n };\n }\n\n const modules: ExpandedQuillOptions['modules'] = merge(\n {},\n expandModuleConfig(quillModuleDefaults),\n expandModuleConfig(themeModuleDefaults),\n userModuleOptions,\n );\n\n const config = {\n ...quillDefaults,\n ...omitUndefinedValuesFromOptions(themeDefaults),\n ...omitUndefinedValuesFromOptions(options),\n };\n\n let registry = options.registry;\n if (registry) {\n if (options.formats) {\n debug.warn('Ignoring \"formats\" option because \"registry\" is specified');\n }\n } else {\n registry = options.formats\n ? createRegistryWithFormats(options.formats, config.registry, debug)\n : config.registry;\n }\n\n return {\n ...config,\n registry,\n container,\n theme,\n modules: Object.entries(modules).reduce(\n (modulesWithDefaults, [name, value]) => {\n if (!value) return modulesWithDefaults;\n\n const moduleClass = Quill.import(`modules/${name}`);\n if (moduleClass == null) {\n debug.error(\n `Cannot load ${name} module. Are you sure you registered it?`,\n );\n return modulesWithDefaults;\n }\n return {\n ...modulesWithDefaults,\n // @ts-expect-error\n [name]: merge({}, moduleClass.DEFAULTS || {}, value),\n };\n },\n {},\n ),\n bounds: resolveSelector(config.bounds),\n };\n}\n\n// Handle selection preservation and TEXT_CHANGE emission\n// common to modification APIs\nfunction modify(\n modifier: () => Delta,\n source: EmitterSource,\n index: number | boolean,\n shift: number | null,\n) {\n if (\n !this.isEnabled() &&\n source === Emitter.sources.USER &&\n !this.allowReadOnlyEdits\n ) {\n return new Delta();\n }\n let range = index == null ? null : this.getSelection();\n const oldDelta = this.editor.delta;\n const change = modifier();\n if (range != null) {\n if (index === true) {\n index = range.index; // eslint-disable-line prefer-destructuring\n }\n if (shift == null) {\n range = shiftRange(range, change, source);\n } else if (shift !== 0) {\n // @ts-expect-error index should always be number\n range = shiftRange(range, index, shift, source);\n }\n this.setSelection(range, Emitter.sources.SILENT);\n }\n if (change.length() > 0) {\n const args = [Emitter.events.TEXT_CHANGE, change, oldDelta, source];\n this.emitter.emit(Emitter.events.EDITOR_CHANGE, ...args);\n if (source !== Emitter.sources.SILENT) {\n this.emitter.emit(...args);\n }\n }\n return change;\n}\n\ntype NormalizedIndexLength = [\n number,\n number,\n Record,\n EmitterSource,\n];\nfunction overload(index: number, source?: EmitterSource): NormalizedIndexLength;\nfunction overload(\n index: number,\n length: number,\n source?: EmitterSource,\n): NormalizedIndexLength;\nfunction overload(\n index: number,\n length: number,\n format: string,\n value: unknown,\n source?: EmitterSource,\n): NormalizedIndexLength;\nfunction overload(\n index: number,\n length: number,\n format: Record,\n source?: EmitterSource,\n): NormalizedIndexLength;\nfunction overload(range: Range, source?: EmitterSource): NormalizedIndexLength;\nfunction overload(\n range: Range,\n format: string,\n value: unknown,\n source?: EmitterSource,\n): NormalizedIndexLength;\nfunction overload(\n range: Range,\n format: Record,\n source?: EmitterSource,\n): NormalizedIndexLength;\nfunction overload(\n index: Range | number,\n length?: number | string | Record | EmitterSource,\n name?: string | unknown | Record | EmitterSource,\n value?: unknown | EmitterSource,\n source?: EmitterSource,\n): NormalizedIndexLength {\n let formats: Record = {};\n // @ts-expect-error\n if (typeof index.index === 'number' && typeof index.length === 'number') {\n // Allow for throwaway end (used by insertText/insertEmbed)\n if (typeof length !== 'number') {\n // @ts-expect-error\n source = value;\n value = name;\n name = length;\n // @ts-expect-error\n length = index.length; // eslint-disable-line prefer-destructuring\n // @ts-expect-error\n index = index.index; // eslint-disable-line prefer-destructuring\n } else {\n // @ts-expect-error\n length = index.length; // eslint-disable-line prefer-destructuring\n // @ts-expect-error\n index = index.index; // eslint-disable-line prefer-destructuring\n }\n } else if (typeof length !== 'number') {\n // @ts-expect-error\n source = value;\n value = name;\n name = length;\n length = 0;\n }\n // Handle format being object, two format name/value strings or excluded\n if (typeof name === 'object') {\n // @ts-expect-error Fix me later\n formats = name;\n // @ts-expect-error\n source = value;\n } else if (typeof name === 'string') {\n if (value != null) {\n formats[name] = value;\n } else {\n // @ts-expect-error\n source = name;\n }\n }\n // Handle optional source\n source = source || Emitter.sources.API;\n // @ts-expect-error\n return [index, length, formats, source];\n}\n\nfunction shiftRange(range: Range, change: Delta, source?: EmitterSource): Range;\nfunction shiftRange(\n range: Range,\n index: number,\n length?: number,\n source?: EmitterSource,\n): Range;\nfunction shiftRange(\n range: Range,\n index: number | Delta,\n lengthOrSource?: number | EmitterSource,\n source?: EmitterSource,\n) {\n const length = typeof lengthOrSource === 'number' ? lengthOrSource : 0;\n if (range == null) return null;\n let start;\n let end;\n // @ts-expect-error -- TODO: add a better type guard around `index`\n if (index && typeof index.transformPosition === 'function') {\n [start, end] = [range.index, range.index + range.length].map((pos) =>\n // @ts-expect-error -- TODO: add a better type guard around `index`\n index.transformPosition(pos, source !== Emitter.sources.USER),\n );\n } else {\n [start, end] = [range.index, range.index + range.length].map((pos) => {\n // @ts-expect-error -- TODO: add a better type guard around `index`\n if (pos < index || (pos === index && source === Emitter.sources.USER))\n return pos;\n if (length >= 0) {\n return pos + length;\n }\n // @ts-expect-error -- TODO: add a better type guard around `index`\n return Math.max(index, pos + length);\n });\n }\n return new Range(start, end - start);\n}\n\nexport type { Bounds, DebugLevel, EmitterSource };\nexport { Parchment, Range };\n\nexport { globalRegistry, expandConfig, overload, Quill as default };\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file diff --git a/public/assets/quill/core/selection.d.ts b/public/assets/quill/core/selection.d.ts new file mode 100644 index 0000000..b8c3e63 --- /dev/null +++ b/public/assets/quill/core/selection.d.ts @@ -0,0 +1,74 @@ +import Emitter from './emitter.js'; +import type { EmitterSource } from './emitter.js'; +import type Cursor from '../blots/cursor.js'; +import type Scroll from '../blots/scroll.js'; +type NativeRange = AbstractRange; +interface NormalizedRange { + start: { + node: NativeRange['startContainer']; + offset: NativeRange['startOffset']; + }; + end: { + node: NativeRange['endContainer']; + offset: NativeRange['endOffset']; + }; + native: NativeRange; +} +export interface Bounds { + bottom: number; + height: number; + left: number; + right: number; + top: number; + width: number; +} +export declare class Range { + index: number; + length: number; + constructor(index: number, length?: number); +} +declare class Selection { + scroll: Scroll; + emitter: Emitter; + composing: boolean; + mouseDown: boolean; + root: HTMLElement; + cursor: Cursor; + savedRange: Range; + lastRange: Range | null; + lastNative: NormalizedRange | null; + constructor(scroll: Scroll, emitter: Emitter); + handleComposition(): void; + handleDragging(): void; + focus(): void; + format(format: string, value: unknown): void; + getBounds(index: number, length?: number): DOMRect | { + bottom: number; + height: number; + left: number; + right: number; + top: number; + width: number; + } | null; + getNativeRange(): NormalizedRange | null; + getRange(): [Range, NormalizedRange] | [null, null]; + hasFocus(): boolean; + normalizedToRange(range: NormalizedRange): Range; + normalizeNative(nativeRange: NativeRange): { + start: { + node: Node; + offset: number; + }; + end: { + node: Node; + offset: number; + }; + native: AbstractRange; + } | null; + rangeToNative(range: Range): [Node | null, number, Node | null, number]; + setNativeRange(startNode: Node | null, startOffset?: number, endNode?: Node | null, endOffset?: number | undefined, force?: boolean): void; + setRange(range: Range | null, force: boolean, source?: EmitterSource): void; + setRange(range: Range | null, source?: EmitterSource): void; + update(source?: EmitterSource): void; +} +export default Selection; diff --git a/public/assets/quill/core/selection.js b/public/assets/quill/core/selection.js new file mode 100644 index 0000000..a240b77 --- /dev/null +++ b/public/assets/quill/core/selection.js @@ -0,0 +1,374 @@ +import { LeafBlot, Scope } from 'parchment'; +import { cloneDeep, isEqual } from 'lodash-es'; +import Emitter from './emitter.js'; +import logger from './logger.js'; +const debug = logger('quill:selection'); +export class Range { + constructor(index) { + let length = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; + this.index = index; + this.length = length; + } +} +class Selection { + constructor(scroll, emitter) { + this.emitter = emitter; + this.scroll = scroll; + this.composing = false; + this.mouseDown = false; + this.root = this.scroll.domNode; + // @ts-expect-error + this.cursor = this.scroll.create('cursor', this); + // savedRange is last non-null range + this.savedRange = new Range(0, 0); + this.lastRange = this.savedRange; + this.lastNative = null; + this.handleComposition(); + this.handleDragging(); + this.emitter.listenDOM('selectionchange', document, () => { + if (!this.mouseDown && !this.composing) { + setTimeout(this.update.bind(this, Emitter.sources.USER), 1); + } + }); + this.emitter.on(Emitter.events.SCROLL_BEFORE_UPDATE, () => { + if (!this.hasFocus()) return; + const native = this.getNativeRange(); + if (native == null) return; + if (native.start.node === this.cursor.textNode) return; // cursor.restore() will handle + this.emitter.once(Emitter.events.SCROLL_UPDATE, (source, mutations) => { + try { + if (this.root.contains(native.start.node) && this.root.contains(native.end.node)) { + this.setNativeRange(native.start.node, native.start.offset, native.end.node, native.end.offset); + } + const triggeredByTyping = mutations.some(mutation => mutation.type === 'characterData' || mutation.type === 'childList' || mutation.type === 'attributes' && mutation.target === this.root); + this.update(triggeredByTyping ? Emitter.sources.SILENT : source); + } catch (ignored) { + // ignore + } + }); + }); + this.emitter.on(Emitter.events.SCROLL_OPTIMIZE, (mutations, context) => { + if (context.range) { + const { + startNode, + startOffset, + endNode, + endOffset + } = context.range; + this.setNativeRange(startNode, startOffset, endNode, endOffset); + this.update(Emitter.sources.SILENT); + } + }); + this.update(Emitter.sources.SILENT); + } + handleComposition() { + this.emitter.on(Emitter.events.COMPOSITION_BEFORE_START, () => { + this.composing = true; + }); + this.emitter.on(Emitter.events.COMPOSITION_END, () => { + this.composing = false; + if (this.cursor.parent) { + const range = this.cursor.restore(); + if (!range) return; + setTimeout(() => { + this.setNativeRange(range.startNode, range.startOffset, range.endNode, range.endOffset); + }, 1); + } + }); + } + handleDragging() { + this.emitter.listenDOM('mousedown', document.body, () => { + this.mouseDown = true; + }); + this.emitter.listenDOM('mouseup', document.body, () => { + this.mouseDown = false; + this.update(Emitter.sources.USER); + }); + } + focus() { + if (this.hasFocus()) return; + this.root.focus({ + preventScroll: true + }); + this.setRange(this.savedRange); + } + format(format, value) { + this.scroll.update(); + const nativeRange = this.getNativeRange(); + if (nativeRange == null || !nativeRange.native.collapsed || this.scroll.query(format, Scope.BLOCK)) return; + if (nativeRange.start.node !== this.cursor.textNode) { + const blot = this.scroll.find(nativeRange.start.node, false); + if (blot == null) return; + // TODO Give blot ability to not split + if (blot instanceof LeafBlot) { + const after = blot.split(nativeRange.start.offset); + blot.parent.insertBefore(this.cursor, after); + } else { + // @ts-expect-error TODO: nativeRange.start.node doesn't seem to match function signature + blot.insertBefore(this.cursor, nativeRange.start.node); // Should never happen + } + this.cursor.attach(); + } + this.cursor.format(format, value); + this.scroll.optimize(); + this.setNativeRange(this.cursor.textNode, this.cursor.textNode.data.length); + this.update(); + } + getBounds(index) { + let length = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; + const scrollLength = this.scroll.length(); + index = Math.min(index, scrollLength - 1); + length = Math.min(index + length, scrollLength - 1) - index; + let node; + let [leaf, offset] = this.scroll.leaf(index); + if (leaf == null) return null; + if (length > 0 && offset === leaf.length()) { + const [next] = this.scroll.leaf(index + 1); + if (next) { + const [line] = this.scroll.line(index); + const [nextLine] = this.scroll.line(index + 1); + if (line === nextLine) { + leaf = next; + offset = 0; + } + } + } + [node, offset] = leaf.position(offset, true); + const range = document.createRange(); + if (length > 0) { + range.setStart(node, offset); + [leaf, offset] = this.scroll.leaf(index + length); + if (leaf == null) return null; + [node, offset] = leaf.position(offset, true); + range.setEnd(node, offset); + return range.getBoundingClientRect(); + } + let side = 'left'; + let rect; + if (node instanceof Text) { + // Return null if the text node is empty because it is + // not able to get a useful client rect: + // https://github.com/w3c/csswg-drafts/issues/2514. + // Empty text nodes are most likely caused by TextBlot#optimize() + // not getting called when editor content changes. + if (!node.data.length) { + return null; + } + if (offset < node.data.length) { + range.setStart(node, offset); + range.setEnd(node, offset + 1); + } else { + range.setStart(node, offset - 1); + range.setEnd(node, offset); + side = 'right'; + } + rect = range.getBoundingClientRect(); + } else { + if (!(leaf.domNode instanceof Element)) return null; + rect = leaf.domNode.getBoundingClientRect(); + if (offset > 0) side = 'right'; + } + return { + bottom: rect.top + rect.height, + height: rect.height, + left: rect[side], + right: rect[side], + top: rect.top, + width: 0 + }; + } + getNativeRange() { + const selection = document.getSelection(); + if (selection == null || selection.rangeCount <= 0) return null; + const nativeRange = selection.getRangeAt(0); + if (nativeRange == null) return null; + const range = this.normalizeNative(nativeRange); + debug.info('getNativeRange', range); + return range; + } + getRange() { + const root = this.scroll.domNode; + if ('isConnected' in root && !root.isConnected) { + // document.getSelection() forces layout on Blink, so we trend to + // not calling it. + return [null, null]; + } + const normalized = this.getNativeRange(); + if (normalized == null) return [null, null]; + const range = this.normalizedToRange(normalized); + return [range, normalized]; + } + hasFocus() { + return document.activeElement === this.root || document.activeElement != null && contains(this.root, document.activeElement); + } + normalizedToRange(range) { + const positions = [[range.start.node, range.start.offset]]; + if (!range.native.collapsed) { + positions.push([range.end.node, range.end.offset]); + } + const indexes = positions.map(position => { + const [node, offset] = position; + const blot = this.scroll.find(node, true); + // @ts-expect-error Fix me later + const index = blot.offset(this.scroll); + if (offset === 0) { + return index; + } + if (blot instanceof LeafBlot) { + return index + blot.index(node, offset); + } + // @ts-expect-error Fix me later + return index + blot.length(); + }); + const end = Math.min(Math.max(...indexes), this.scroll.length() - 1); + const start = Math.min(end, ...indexes); + return new Range(start, end - start); + } + normalizeNative(nativeRange) { + if (!contains(this.root, nativeRange.startContainer) || !nativeRange.collapsed && !contains(this.root, nativeRange.endContainer)) { + return null; + } + const range = { + start: { + node: nativeRange.startContainer, + offset: nativeRange.startOffset + }, + end: { + node: nativeRange.endContainer, + offset: nativeRange.endOffset + }, + native: nativeRange + }; + [range.start, range.end].forEach(position => { + let { + node, + offset + } = position; + while (!(node instanceof Text) && node.childNodes.length > 0) { + if (node.childNodes.length > offset) { + node = node.childNodes[offset]; + offset = 0; + } else if (node.childNodes.length === offset) { + // @ts-expect-error Fix me later + node = node.lastChild; + if (node instanceof Text) { + offset = node.data.length; + } else if (node.childNodes.length > 0) { + // Container case + offset = node.childNodes.length; + } else { + // Embed case + offset = node.childNodes.length + 1; + } + } else { + break; + } + } + position.node = node; + position.offset = offset; + }); + return range; + } + rangeToNative(range) { + const scrollLength = this.scroll.length(); + const getPosition = (index, inclusive) => { + index = Math.min(scrollLength - 1, index); + const [leaf, leafOffset] = this.scroll.leaf(index); + return leaf ? leaf.position(leafOffset, inclusive) : [null, -1]; + }; + return [...getPosition(range.index, false), ...getPosition(range.index + range.length, true)]; + } + setNativeRange(startNode, startOffset) { + let endNode = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : startNode; + let endOffset = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : startOffset; + let force = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false; + debug.info('setNativeRange', startNode, startOffset, endNode, endOffset); + if (startNode != null && (this.root.parentNode == null || startNode.parentNode == null || + // @ts-expect-error Fix me later + endNode.parentNode == null)) { + return; + } + const selection = document.getSelection(); + if (selection == null) return; + if (startNode != null) { + if (!this.hasFocus()) this.root.focus({ + preventScroll: true + }); + const { + native + } = this.getNativeRange() || {}; + if (native == null || force || startNode !== native.startContainer || startOffset !== native.startOffset || endNode !== native.endContainer || endOffset !== native.endOffset) { + if (startNode instanceof Element && startNode.tagName === 'BR') { + // @ts-expect-error Fix me later + startOffset = Array.from(startNode.parentNode.childNodes).indexOf(startNode); + startNode = startNode.parentNode; + } + if (endNode instanceof Element && endNode.tagName === 'BR') { + // @ts-expect-error Fix me later + endOffset = Array.from(endNode.parentNode.childNodes).indexOf(endNode); + endNode = endNode.parentNode; + } + const range = document.createRange(); + // @ts-expect-error Fix me later + range.setStart(startNode, startOffset); + // @ts-expect-error Fix me later + range.setEnd(endNode, endOffset); + selection.removeAllRanges(); + selection.addRange(range); + } + } else { + selection.removeAllRanges(); + this.root.blur(); + } + } + setRange(range) { + let force = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + let source = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : Emitter.sources.API; + if (typeof force === 'string') { + source = force; + force = false; + } + debug.info('setRange', range); + if (range != null) { + const args = this.rangeToNative(range); + this.setNativeRange(...args, force); + } else { + this.setNativeRange(null); + } + this.update(source); + } + update() { + let source = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : Emitter.sources.USER; + const oldRange = this.lastRange; + const [lastRange, nativeRange] = this.getRange(); + this.lastRange = lastRange; + this.lastNative = nativeRange; + if (this.lastRange != null) { + this.savedRange = this.lastRange; + } + if (!isEqual(oldRange, this.lastRange)) { + if (!this.composing && nativeRange != null && nativeRange.native.collapsed && nativeRange.start.node !== this.cursor.textNode) { + const range = this.cursor.restore(); + if (range) { + this.setNativeRange(range.startNode, range.startOffset, range.endNode, range.endOffset); + } + } + const args = [Emitter.events.SELECTION_CHANGE, cloneDeep(this.lastRange), cloneDeep(oldRange), source]; + this.emitter.emit(Emitter.events.EDITOR_CHANGE, ...args); + if (source !== Emitter.sources.SILENT) { + this.emitter.emit(...args); + } + } + } +} +function contains(parent, descendant) { + try { + // Firefox inserts inaccessible nodes around video elements + descendant.parentNode; // eslint-disable-line @typescript-eslint/no-unused-expressions + } catch (e) { + return false; + } + return parent.contains(descendant); +} +export default Selection; +//# sourceMappingURL=selection.js.map \ No newline at end of file diff --git a/public/assets/quill/core/selection.js.map b/public/assets/quill/core/selection.js.map new file mode 100644 index 0000000..bbe76a9 --- /dev/null +++ b/public/assets/quill/core/selection.js.map @@ -0,0 +1 @@ +{"version":3,"file":"selection.js","names":["LeafBlot","Scope","cloneDeep","isEqual","Emitter","logger","debug","Range","constructor","index","length","arguments","undefined","Selection","scroll","emitter","composing","mouseDown","root","domNode","cursor","create","savedRange","lastRange","lastNative","handleComposition","handleDragging","listenDOM","document","setTimeout","update","bind","sources","USER","on","events","SCROLL_BEFORE_UPDATE","hasFocus","native","getNativeRange","start","node","textNode","once","SCROLL_UPDATE","source","mutations","contains","end","setNativeRange","offset","triggeredByTyping","some","mutation","type","target","SILENT","ignored","SCROLL_OPTIMIZE","context","range","startNode","startOffset","endNode","endOffset","COMPOSITION_BEFORE_START","COMPOSITION_END","parent","restore","body","focus","preventScroll","setRange","format","value","nativeRange","collapsed","query","BLOCK","blot","find","after","split","insertBefore","attach","optimize","data","getBounds","scrollLength","Math","min","leaf","next","line","nextLine","position","createRange","setStart","setEnd","getBoundingClientRect","side","rect","Text","Element","bottom","top","height","left","right","width","selection","getSelection","rangeCount","getRangeAt","normalizeNative","info","getRange","isConnected","normalized","normalizedToRange","activeElement","positions","push","indexes","map","max","startContainer","endContainer","forEach","childNodes","lastChild","rangeToNative","getPosition","inclusive","leafOffset","force","parentNode","tagName","Array","from","indexOf","removeAllRanges","addRange","blur","API","args","oldRange","SELECTION_CHANGE","emit","EDITOR_CHANGE","descendant","e"],"sources":["../../src/core/selection.ts"],"sourcesContent":["import { LeafBlot, Scope } from 'parchment';\nimport { cloneDeep, isEqual } from 'lodash-es';\nimport Emitter from './emitter.js';\nimport type { EmitterSource } from './emitter.js';\nimport logger from './logger.js';\nimport type Cursor from '../blots/cursor.js';\nimport type Scroll from '../blots/scroll.js';\n\nconst debug = logger('quill:selection');\n\ntype NativeRange = AbstractRange;\n\ninterface NormalizedRange {\n start: {\n node: NativeRange['startContainer'];\n offset: NativeRange['startOffset'];\n };\n end: { node: NativeRange['endContainer']; offset: NativeRange['endOffset'] };\n native: NativeRange;\n}\n\nexport interface Bounds {\n bottom: number;\n height: number;\n left: number;\n right: number;\n top: number;\n width: number;\n}\n\nexport class Range {\n constructor(\n public index: number,\n public length = 0,\n ) {}\n}\n\nclass Selection {\n scroll: Scroll;\n emitter: Emitter;\n composing: boolean;\n mouseDown: boolean;\n\n root: HTMLElement;\n cursor: Cursor;\n savedRange: Range;\n lastRange: Range | null;\n lastNative: NormalizedRange | null;\n\n constructor(scroll: Scroll, emitter: Emitter) {\n this.emitter = emitter;\n this.scroll = scroll;\n this.composing = false;\n this.mouseDown = false;\n this.root = this.scroll.domNode;\n // @ts-expect-error\n this.cursor = this.scroll.create('cursor', this);\n // savedRange is last non-null range\n this.savedRange = new Range(0, 0);\n this.lastRange = this.savedRange;\n this.lastNative = null;\n this.handleComposition();\n this.handleDragging();\n this.emitter.listenDOM('selectionchange', document, () => {\n if (!this.mouseDown && !this.composing) {\n setTimeout(this.update.bind(this, Emitter.sources.USER), 1);\n }\n });\n this.emitter.on(Emitter.events.SCROLL_BEFORE_UPDATE, () => {\n if (!this.hasFocus()) return;\n const native = this.getNativeRange();\n if (native == null) return;\n if (native.start.node === this.cursor.textNode) return; // cursor.restore() will handle\n this.emitter.once(\n Emitter.events.SCROLL_UPDATE,\n (source, mutations: MutationRecord[]) => {\n try {\n if (\n this.root.contains(native.start.node) &&\n this.root.contains(native.end.node)\n ) {\n this.setNativeRange(\n native.start.node,\n native.start.offset,\n native.end.node,\n native.end.offset,\n );\n }\n const triggeredByTyping = mutations.some(\n (mutation) =>\n mutation.type === 'characterData' ||\n mutation.type === 'childList' ||\n (mutation.type === 'attributes' &&\n mutation.target === this.root),\n );\n this.update(triggeredByTyping ? Emitter.sources.SILENT : source);\n } catch (ignored) {\n // ignore\n }\n },\n );\n });\n this.emitter.on(Emitter.events.SCROLL_OPTIMIZE, (mutations, context) => {\n if (context.range) {\n const { startNode, startOffset, endNode, endOffset } = context.range;\n this.setNativeRange(startNode, startOffset, endNode, endOffset);\n this.update(Emitter.sources.SILENT);\n }\n });\n this.update(Emitter.sources.SILENT);\n }\n\n handleComposition() {\n this.emitter.on(Emitter.events.COMPOSITION_BEFORE_START, () => {\n this.composing = true;\n });\n this.emitter.on(Emitter.events.COMPOSITION_END, () => {\n this.composing = false;\n if (this.cursor.parent) {\n const range = this.cursor.restore();\n if (!range) return;\n setTimeout(() => {\n this.setNativeRange(\n range.startNode,\n range.startOffset,\n range.endNode,\n range.endOffset,\n );\n }, 1);\n }\n });\n }\n\n handleDragging() {\n this.emitter.listenDOM('mousedown', document.body, () => {\n this.mouseDown = true;\n });\n this.emitter.listenDOM('mouseup', document.body, () => {\n this.mouseDown = false;\n this.update(Emitter.sources.USER);\n });\n }\n\n focus() {\n if (this.hasFocus()) return;\n this.root.focus({ preventScroll: true });\n this.setRange(this.savedRange);\n }\n\n format(format: string, value: unknown) {\n this.scroll.update();\n const nativeRange = this.getNativeRange();\n if (\n nativeRange == null ||\n !nativeRange.native.collapsed ||\n this.scroll.query(format, Scope.BLOCK)\n )\n return;\n if (nativeRange.start.node !== this.cursor.textNode) {\n const blot = this.scroll.find(nativeRange.start.node, false);\n if (blot == null) return;\n // TODO Give blot ability to not split\n if (blot instanceof LeafBlot) {\n const after = blot.split(nativeRange.start.offset);\n blot.parent.insertBefore(this.cursor, after);\n } else {\n // @ts-expect-error TODO: nativeRange.start.node doesn't seem to match function signature\n blot.insertBefore(this.cursor, nativeRange.start.node); // Should never happen\n }\n this.cursor.attach();\n }\n this.cursor.format(format, value);\n this.scroll.optimize();\n this.setNativeRange(this.cursor.textNode, this.cursor.textNode.data.length);\n this.update();\n }\n\n getBounds(index: number, length = 0) {\n const scrollLength = this.scroll.length();\n index = Math.min(index, scrollLength - 1);\n length = Math.min(index + length, scrollLength - 1) - index;\n let node: Node;\n let [leaf, offset] = this.scroll.leaf(index);\n if (leaf == null) return null;\n if (length > 0 && offset === leaf.length()) {\n const [next] = this.scroll.leaf(index + 1);\n if (next) {\n const [line] = this.scroll.line(index);\n const [nextLine] = this.scroll.line(index + 1);\n if (line === nextLine) {\n leaf = next;\n offset = 0;\n }\n }\n }\n [node, offset] = leaf.position(offset, true);\n const range = document.createRange();\n if (length > 0) {\n range.setStart(node, offset);\n [leaf, offset] = this.scroll.leaf(index + length);\n if (leaf == null) return null;\n [node, offset] = leaf.position(offset, true);\n range.setEnd(node, offset);\n return range.getBoundingClientRect();\n }\n let side: 'left' | 'right' = 'left';\n let rect: DOMRect;\n if (node instanceof Text) {\n // Return null if the text node is empty because it is\n // not able to get a useful client rect:\n // https://github.com/w3c/csswg-drafts/issues/2514.\n // Empty text nodes are most likely caused by TextBlot#optimize()\n // not getting called when editor content changes.\n if (!node.data.length) {\n return null;\n }\n if (offset < node.data.length) {\n range.setStart(node, offset);\n range.setEnd(node, offset + 1);\n } else {\n range.setStart(node, offset - 1);\n range.setEnd(node, offset);\n side = 'right';\n }\n rect = range.getBoundingClientRect();\n } else {\n if (!(leaf.domNode instanceof Element)) return null;\n rect = leaf.domNode.getBoundingClientRect();\n if (offset > 0) side = 'right';\n }\n return {\n bottom: rect.top + rect.height,\n height: rect.height,\n left: rect[side],\n right: rect[side],\n top: rect.top,\n width: 0,\n };\n }\n\n getNativeRange(): NormalizedRange | null {\n const selection = document.getSelection();\n if (selection == null || selection.rangeCount <= 0) return null;\n const nativeRange = selection.getRangeAt(0);\n if (nativeRange == null) return null;\n const range = this.normalizeNative(nativeRange);\n debug.info('getNativeRange', range);\n return range;\n }\n\n getRange(): [Range, NormalizedRange] | [null, null] {\n const root = this.scroll.domNode;\n if ('isConnected' in root && !root.isConnected) {\n // document.getSelection() forces layout on Blink, so we trend to\n // not calling it.\n return [null, null];\n }\n const normalized = this.getNativeRange();\n if (normalized == null) return [null, null];\n const range = this.normalizedToRange(normalized);\n return [range, normalized];\n }\n\n hasFocus(): boolean {\n return (\n document.activeElement === this.root ||\n (document.activeElement != null &&\n contains(this.root, document.activeElement))\n );\n }\n\n normalizedToRange(range: NormalizedRange) {\n const positions: [Node, number][] = [\n [range.start.node, range.start.offset],\n ];\n if (!range.native.collapsed) {\n positions.push([range.end.node, range.end.offset]);\n }\n const indexes = positions.map((position) => {\n const [node, offset] = position;\n const blot = this.scroll.find(node, true);\n // @ts-expect-error Fix me later\n const index = blot.offset(this.scroll);\n if (offset === 0) {\n return index;\n }\n if (blot instanceof LeafBlot) {\n return index + blot.index(node, offset);\n }\n // @ts-expect-error Fix me later\n return index + blot.length();\n });\n const end = Math.min(Math.max(...indexes), this.scroll.length() - 1);\n const start = Math.min(end, ...indexes);\n return new Range(start, end - start);\n }\n\n normalizeNative(nativeRange: NativeRange) {\n if (\n !contains(this.root, nativeRange.startContainer) ||\n (!nativeRange.collapsed && !contains(this.root, nativeRange.endContainer))\n ) {\n return null;\n }\n const range = {\n start: {\n node: nativeRange.startContainer,\n offset: nativeRange.startOffset,\n },\n end: { node: nativeRange.endContainer, offset: nativeRange.endOffset },\n native: nativeRange,\n };\n [range.start, range.end].forEach((position) => {\n let { node, offset } = position;\n while (!(node instanceof Text) && node.childNodes.length > 0) {\n if (node.childNodes.length > offset) {\n node = node.childNodes[offset];\n offset = 0;\n } else if (node.childNodes.length === offset) {\n // @ts-expect-error Fix me later\n node = node.lastChild;\n if (node instanceof Text) {\n offset = node.data.length;\n } else if (node.childNodes.length > 0) {\n // Container case\n offset = node.childNodes.length;\n } else {\n // Embed case\n offset = node.childNodes.length + 1;\n }\n } else {\n break;\n }\n }\n position.node = node;\n position.offset = offset;\n });\n return range;\n }\n\n rangeToNative(range: Range): [Node | null, number, Node | null, number] {\n const scrollLength = this.scroll.length();\n\n const getPosition = (\n index: number,\n inclusive: boolean,\n ): [Node | null, number] => {\n index = Math.min(scrollLength - 1, index);\n const [leaf, leafOffset] = this.scroll.leaf(index);\n return leaf ? leaf.position(leafOffset, inclusive) : [null, -1];\n };\n return [\n ...getPosition(range.index, false),\n ...getPosition(range.index + range.length, true),\n ];\n }\n\n setNativeRange(\n startNode: Node | null,\n startOffset?: number,\n endNode = startNode,\n endOffset = startOffset,\n force = false,\n ) {\n debug.info('setNativeRange', startNode, startOffset, endNode, endOffset);\n if (\n startNode != null &&\n (this.root.parentNode == null ||\n startNode.parentNode == null ||\n // @ts-expect-error Fix me later\n endNode.parentNode == null)\n ) {\n return;\n }\n const selection = document.getSelection();\n if (selection == null) return;\n if (startNode != null) {\n if (!this.hasFocus()) this.root.focus({ preventScroll: true });\n const { native } = this.getNativeRange() || {};\n if (\n native == null ||\n force ||\n startNode !== native.startContainer ||\n startOffset !== native.startOffset ||\n endNode !== native.endContainer ||\n endOffset !== native.endOffset\n ) {\n if (startNode instanceof Element && startNode.tagName === 'BR') {\n // @ts-expect-error Fix me later\n startOffset = Array.from(startNode.parentNode.childNodes).indexOf(\n startNode,\n );\n startNode = startNode.parentNode;\n }\n if (endNode instanceof Element && endNode.tagName === 'BR') {\n // @ts-expect-error Fix me later\n endOffset = Array.from(endNode.parentNode.childNodes).indexOf(\n endNode,\n );\n endNode = endNode.parentNode;\n }\n const range = document.createRange();\n // @ts-expect-error Fix me later\n range.setStart(startNode, startOffset);\n // @ts-expect-error Fix me later\n range.setEnd(endNode, endOffset);\n selection.removeAllRanges();\n selection.addRange(range);\n }\n } else {\n selection.removeAllRanges();\n this.root.blur();\n }\n }\n\n setRange(range: Range | null, force: boolean, source?: EmitterSource): void;\n setRange(range: Range | null, source?: EmitterSource): void;\n setRange(\n range: Range | null,\n force: boolean | EmitterSource = false,\n source: EmitterSource = Emitter.sources.API,\n ): void {\n if (typeof force === 'string') {\n source = force;\n force = false;\n }\n debug.info('setRange', range);\n if (range != null) {\n const args = this.rangeToNative(range);\n this.setNativeRange(...args, force);\n } else {\n this.setNativeRange(null);\n }\n this.update(source);\n }\n\n update(source: EmitterSource = Emitter.sources.USER) {\n const oldRange = this.lastRange;\n const [lastRange, nativeRange] = this.getRange();\n this.lastRange = lastRange;\n this.lastNative = nativeRange;\n if (this.lastRange != null) {\n this.savedRange = this.lastRange;\n }\n if (!isEqual(oldRange, this.lastRange)) {\n if (\n !this.composing &&\n nativeRange != null &&\n nativeRange.native.collapsed &&\n nativeRange.start.node !== this.cursor.textNode\n ) {\n const range = this.cursor.restore();\n if (range) {\n this.setNativeRange(\n range.startNode,\n range.startOffset,\n range.endNode,\n range.endOffset,\n );\n }\n }\n const args = [\n Emitter.events.SELECTION_CHANGE,\n cloneDeep(this.lastRange),\n cloneDeep(oldRange),\n source,\n ];\n this.emitter.emit(Emitter.events.EDITOR_CHANGE, ...args);\n if (source !== Emitter.sources.SILENT) {\n this.emitter.emit(...args);\n }\n }\n }\n}\n\nfunction contains(parent: Node, descendant: Node) {\n try {\n // Firefox inserts inaccessible nodes around video elements\n descendant.parentNode; // eslint-disable-line @typescript-eslint/no-unused-expressions\n } catch (e) {\n return false;\n }\n return parent.contains(descendant);\n}\n\nexport default Selection;\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file diff --git a/public/assets/quill/core/theme.d.ts b/public/assets/quill/core/theme.d.ts new file mode 100644 index 0000000..8368a57 --- /dev/null +++ b/public/assets/quill/core/theme.d.ts @@ -0,0 +1,32 @@ +import type Quill from '../core.js'; +import type Clipboard from '../modules/clipboard.js'; +import type History from '../modules/history.js'; +import type Keyboard from '../modules/keyboard.js'; +import type { ToolbarProps } from '../modules/toolbar.js'; +import type Uploader from '../modules/uploader.js'; +export interface ThemeOptions { + modules: Record & { + toolbar?: null | ToolbarProps; + }; +} +declare class Theme { + protected quill: Quill; + protected options: ThemeOptions; + static DEFAULTS: ThemeOptions; + static themes: { + default: typeof Theme; + }; + modules: ThemeOptions['modules']; + constructor(quill: Quill, options: ThemeOptions); + init(): void; + addModule(name: 'clipboard'): Clipboard; + addModule(name: 'keyboard'): Keyboard; + addModule(name: 'uploader'): Uploader; + addModule(name: 'history'): History; + addModule(name: string): unknown; +} +export interface ThemeConstructor { + new (quill: Quill, options: unknown): Theme; + DEFAULTS: ThemeOptions; +} +export default Theme; diff --git a/public/assets/quill/core/theme.js b/public/assets/quill/core/theme.js new file mode 100644 index 0000000..240c2c6 --- /dev/null +++ b/public/assets/quill/core/theme.js @@ -0,0 +1,28 @@ +class Theme { + static DEFAULTS = { + modules: {} + }; + static themes = { + default: Theme + }; + modules = {}; + constructor(quill, options) { + this.quill = quill; + this.options = options; + } + init() { + Object.keys(this.options.modules).forEach(name => { + if (this.modules[name] == null) { + this.addModule(name); + } + }); + } + addModule(name) { + // @ts-expect-error + const ModuleClass = this.quill.constructor.import(`modules/${name}`); + this.modules[name] = new ModuleClass(this.quill, this.options.modules[name] || {}); + return this.modules[name]; + } +} +export default Theme; +//# sourceMappingURL=theme.js.map \ No newline at end of file diff --git a/public/assets/quill/core/theme.js.map b/public/assets/quill/core/theme.js.map new file mode 100644 index 0000000..1a6016d --- /dev/null +++ b/public/assets/quill/core/theme.js.map @@ -0,0 +1 @@ +{"version":3,"file":"theme.js","names":["Theme","DEFAULTS","modules","themes","default","constructor","quill","options","init","Object","keys","forEach","name","addModule","ModuleClass","import"],"sources":["../../src/core/theme.ts"],"sourcesContent":["import type Quill from '../core.js';\nimport type Clipboard from '../modules/clipboard.js';\nimport type History from '../modules/history.js';\nimport type Keyboard from '../modules/keyboard.js';\nimport type { ToolbarProps } from '../modules/toolbar.js';\nimport type Uploader from '../modules/uploader.js';\n\nexport interface ThemeOptions {\n modules: Record & {\n toolbar?: null | ToolbarProps;\n };\n}\n\nclass Theme {\n static DEFAULTS: ThemeOptions = {\n modules: {},\n };\n\n static themes = {\n default: Theme,\n };\n\n modules: ThemeOptions['modules'] = {};\n\n constructor(\n protected quill: Quill,\n protected options: ThemeOptions,\n ) {}\n\n init() {\n Object.keys(this.options.modules).forEach((name) => {\n if (this.modules[name] == null) {\n this.addModule(name);\n }\n });\n }\n\n addModule(name: 'clipboard'): Clipboard;\n addModule(name: 'keyboard'): Keyboard;\n addModule(name: 'uploader'): Uploader;\n addModule(name: 'history'): History;\n addModule(name: string): unknown;\n addModule(name: string) {\n // @ts-expect-error\n const ModuleClass = this.quill.constructor.import(`modules/${name}`);\n this.modules[name] = new ModuleClass(\n this.quill,\n this.options.modules[name] || {},\n );\n return this.modules[name];\n }\n}\n\nexport interface ThemeConstructor {\n new (quill: Quill, options: unknown): Theme;\n DEFAULTS: ThemeOptions;\n}\n\nexport default Theme;\n"],"mappings":"AAaA,MAAMA,KAAK,CAAC;EACV,OAAOC,QAAQ,GAAiB;IAC9BC,OAAO,EAAE,CAAC;EACZ,CAAC;EAED,OAAOC,MAAM,GAAG;IACdC,OAAO,EAAEJ;EACX,CAAC;EAEDE,OAAO,GAA4B,CAAC,CAAC;EAErCG,WAAWA,CACCC,KAAY,EACZC,OAAqB,EAC/B;IAAA,KAFUD,KAAY,GAAZA,KAAY;IAAA,KACZC,OAAqB,GAArBA,OAAqB;EAC9B;EAEHC,IAAIA,CAAA,EAAG;IACLC,MAAM,CAACC,IAAI,CAAC,IAAI,CAACH,OAAO,CAACL,OAAO,CAAC,CAACS,OAAO,CAAEC,IAAI,IAAK;MAClD,IAAI,IAAI,CAACV,OAAO,CAACU,IAAI,CAAC,IAAI,IAAI,EAAE;QAC9B,IAAI,CAACC,SAAS,CAACD,IAAI,CAAC;MACtB;IACF,CAAC,CAAC;EACJ;EAOAC,SAASA,CAACD,IAAY,EAAE;IACtB;IACA,MAAME,WAAW,GAAG,IAAI,CAACR,KAAK,CAACD,WAAW,CAACU,MAAM,CAAE,WAAUH,IAAK,EAAC,CAAC;IACpE,IAAI,CAACV,OAAO,CAACU,IAAI,CAAC,GAAG,IAAIE,WAAW,CAClC,IAAI,CAACR,KAAK,EACV,IAAI,CAACC,OAAO,CAACL,OAAO,CAACU,IAAI,CAAC,IAAI,CAAC,CACjC,CAAC;IACD,OAAO,IAAI,CAACV,OAAO,CAACU,IAAI,CAAC;EAC3B;AACF;AAOA,eAAeZ,KAAK","ignoreList":[]} \ No newline at end of file diff --git a/public/assets/quill/core/utils/createRegistryWithFormats.d.ts b/public/assets/quill/core/utils/createRegistryWithFormats.d.ts new file mode 100644 index 0000000..31c1e9f --- /dev/null +++ b/public/assets/quill/core/utils/createRegistryWithFormats.d.ts @@ -0,0 +1,5 @@ +import { Registry } from 'parchment'; +declare const createRegistryWithFormats: (formats: string[], sourceRegistry: Registry, debug: { + error: (errorMessage: string) => void; +}) => Registry; +export default createRegistryWithFormats; diff --git a/public/assets/quill/core/utils/createRegistryWithFormats.js b/public/assets/quill/core/utils/createRegistryWithFormats.js new file mode 100644 index 0000000..dd273c5 --- /dev/null +++ b/public/assets/quill/core/utils/createRegistryWithFormats.js @@ -0,0 +1,29 @@ +import { Registry } from 'parchment'; +const MAX_REGISTER_ITERATIONS = 100; +const CORE_FORMATS = ['block', 'break', 'cursor', 'inline', 'scroll', 'text']; +const createRegistryWithFormats = (formats, sourceRegistry, debug) => { + const registry = new Registry(); + CORE_FORMATS.forEach(name => { + const coreBlot = sourceRegistry.query(name); + if (coreBlot) registry.register(coreBlot); + }); + formats.forEach(name => { + let format = sourceRegistry.query(name); + if (!format) { + debug.error(`Cannot register "${name}" specified in "formats" config. Are you sure it was registered?`); + } + let iterations = 0; + while (format) { + registry.register(format); + format = 'blotName' in format ? format.requiredContainer ?? null : null; + iterations += 1; + if (iterations > MAX_REGISTER_ITERATIONS) { + debug.error(`Cycle detected in registering blot requiredContainer: "${name}"`); + break; + } + } + }); + return registry; +}; +export default createRegistryWithFormats; +//# sourceMappingURL=createRegistryWithFormats.js.map \ No newline at end of file diff --git a/public/assets/quill/core/utils/createRegistryWithFormats.js.map b/public/assets/quill/core/utils/createRegistryWithFormats.js.map new file mode 100644 index 0000000..dd5c81c --- /dev/null +++ b/public/assets/quill/core/utils/createRegistryWithFormats.js.map @@ -0,0 +1 @@ +{"version":3,"file":"createRegistryWithFormats.js","names":["Registry","MAX_REGISTER_ITERATIONS","CORE_FORMATS","createRegistryWithFormats","formats","sourceRegistry","debug","registry","forEach","name","coreBlot","query","register","format","error","iterations","requiredContainer"],"sources":["../../../src/core/utils/createRegistryWithFormats.ts"],"sourcesContent":["import { Registry } from 'parchment';\n\nconst MAX_REGISTER_ITERATIONS = 100;\nconst CORE_FORMATS = ['block', 'break', 'cursor', 'inline', 'scroll', 'text'];\n\nconst createRegistryWithFormats = (\n formats: string[],\n sourceRegistry: Registry,\n debug: { error: (errorMessage: string) => void },\n) => {\n const registry = new Registry();\n CORE_FORMATS.forEach((name) => {\n const coreBlot = sourceRegistry.query(name);\n if (coreBlot) registry.register(coreBlot);\n });\n\n formats.forEach((name) => {\n let format = sourceRegistry.query(name);\n if (!format) {\n debug.error(\n `Cannot register \"${name}\" specified in \"formats\" config. Are you sure it was registered?`,\n );\n }\n let iterations = 0;\n while (format) {\n registry.register(format);\n format = 'blotName' in format ? format.requiredContainer ?? null : null;\n\n iterations += 1;\n if (iterations > MAX_REGISTER_ITERATIONS) {\n debug.error(\n `Cycle detected in registering blot requiredContainer: \"${name}\"`,\n );\n break;\n }\n }\n });\n\n return registry;\n};\n\nexport default createRegistryWithFormats;\n"],"mappings":"AAAA,SAASA,QAAQ,QAAQ,WAAW;AAEpC,MAAMC,uBAAuB,GAAG,GAAG;AACnC,MAAMC,YAAY,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,CAAC;AAE7E,MAAMC,yBAAyB,GAAGA,CAChCC,OAAiB,EACjBC,cAAwB,EACxBC,KAAgD,KAC7C;EACH,MAAMC,QAAQ,GAAG,IAAIP,QAAQ,CAAC,CAAC;EAC/BE,YAAY,CAACM,OAAO,CAAEC,IAAI,IAAK;IAC7B,MAAMC,QAAQ,GAAGL,cAAc,CAACM,KAAK,CAACF,IAAI,CAAC;IAC3C,IAAIC,QAAQ,EAAEH,QAAQ,CAACK,QAAQ,CAACF,QAAQ,CAAC;EAC3C,CAAC,CAAC;EAEFN,OAAO,CAACI,OAAO,CAAEC,IAAI,IAAK;IACxB,IAAII,MAAM,GAAGR,cAAc,CAACM,KAAK,CAACF,IAAI,CAAC;IACvC,IAAI,CAACI,MAAM,EAAE;MACXP,KAAK,CAACQ,KAAK,CACR,oBAAmBL,IAAK,kEAC3B,CAAC;IACH;IACA,IAAIM,UAAU,GAAG,CAAC;IAClB,OAAOF,MAAM,EAAE;MACbN,QAAQ,CAACK,QAAQ,CAACC,MAAM,CAAC;MACzBA,MAAM,GAAG,UAAU,IAAIA,MAAM,GAAGA,MAAM,CAACG,iBAAiB,IAAI,IAAI,GAAG,IAAI;MAEvED,UAAU,IAAI,CAAC;MACf,IAAIA,UAAU,GAAGd,uBAAuB,EAAE;QACxCK,KAAK,CAACQ,KAAK,CACR,0DAAyDL,IAAK,GACjE,CAAC;QACD;MACF;IACF;EACF,CAAC,CAAC;EAEF,OAAOF,QAAQ;AACjB,CAAC;AAED,eAAeJ,yBAAyB","ignoreList":[]} \ No newline at end of file diff --git a/public/assets/quill/core/utils/scrollRectIntoView.d.ts b/public/assets/quill/core/utils/scrollRectIntoView.d.ts new file mode 100644 index 0000000..51dbfd6 --- /dev/null +++ b/public/assets/quill/core/utils/scrollRectIntoView.d.ts @@ -0,0 +1,8 @@ +export type Rect = { + top: number; + right: number; + bottom: number; + left: number; +}; +declare const scrollRectIntoView: (root: HTMLElement, targetRect: Rect) => void; +export default scrollRectIntoView; diff --git a/public/assets/quill/core/utils/scrollRectIntoView.js b/public/assets/quill/core/utils/scrollRectIntoView.js new file mode 100644 index 0000000..ee87a04 --- /dev/null +++ b/public/assets/quill/core/utils/scrollRectIntoView.js @@ -0,0 +1,75 @@ +const getParentElement = element => element.parentElement || element.getRootNode().host || null; +const getElementRect = element => { + const rect = element.getBoundingClientRect(); + const scaleX = 'offsetWidth' in element && Math.abs(rect.width) / element.offsetWidth || 1; + const scaleY = 'offsetHeight' in element && Math.abs(rect.height) / element.offsetHeight || 1; + return { + top: rect.top, + right: rect.left + element.clientWidth * scaleX, + bottom: rect.top + element.clientHeight * scaleY, + left: rect.left + }; +}; +const paddingValueToInt = value => { + const number = parseInt(value, 10); + return Number.isNaN(number) ? 0 : number; +}; + +// Follow the steps described in https://www.w3.org/TR/cssom-view-1/#element-scrolling-members, +// assuming that the scroll option is set to 'nearest'. +const getScrollDistance = (targetStart, targetEnd, scrollStart, scrollEnd, scrollPaddingStart, scrollPaddingEnd) => { + if (targetStart < scrollStart && targetEnd > scrollEnd) { + return 0; + } + if (targetStart < scrollStart) { + return -(scrollStart - targetStart + scrollPaddingStart); + } + if (targetEnd > scrollEnd) { + return targetEnd - targetStart > scrollEnd - scrollStart ? targetStart + scrollPaddingStart - scrollStart : targetEnd - scrollEnd + scrollPaddingEnd; + } + return 0; +}; +const scrollRectIntoView = (root, targetRect) => { + const document = root.ownerDocument; + let rect = targetRect; + let current = root; + while (current) { + const isDocumentBody = current === document.body; + const bounding = isDocumentBody ? { + top: 0, + right: window.visualViewport?.width ?? document.documentElement.clientWidth, + bottom: window.visualViewport?.height ?? document.documentElement.clientHeight, + left: 0 + } : getElementRect(current); + const style = getComputedStyle(current); + const scrollDistanceX = getScrollDistance(rect.left, rect.right, bounding.left, bounding.right, paddingValueToInt(style.scrollPaddingLeft), paddingValueToInt(style.scrollPaddingRight)); + const scrollDistanceY = getScrollDistance(rect.top, rect.bottom, bounding.top, bounding.bottom, paddingValueToInt(style.scrollPaddingTop), paddingValueToInt(style.scrollPaddingBottom)); + if (scrollDistanceX || scrollDistanceY) { + if (isDocumentBody) { + document.defaultView?.scrollBy(scrollDistanceX, scrollDistanceY); + } else { + const { + scrollLeft, + scrollTop + } = current; + if (scrollDistanceY) { + current.scrollTop += scrollDistanceY; + } + if (scrollDistanceX) { + current.scrollLeft += scrollDistanceX; + } + const scrolledLeft = current.scrollLeft - scrollLeft; + const scrolledTop = current.scrollTop - scrollTop; + rect = { + left: rect.left - scrolledLeft, + top: rect.top - scrolledTop, + right: rect.right - scrolledLeft, + bottom: rect.bottom - scrolledTop + }; + } + } + current = isDocumentBody || style.position === 'fixed' ? null : getParentElement(current); + } +}; +export default scrollRectIntoView; +//# sourceMappingURL=scrollRectIntoView.js.map \ No newline at end of file diff --git a/public/assets/quill/core/utils/scrollRectIntoView.js.map b/public/assets/quill/core/utils/scrollRectIntoView.js.map new file mode 100644 index 0000000..d57700f --- /dev/null +++ b/public/assets/quill/core/utils/scrollRectIntoView.js.map @@ -0,0 +1 @@ +{"version":3,"file":"scrollRectIntoView.js","names":["getParentElement","element","parentElement","getRootNode","host","getElementRect","rect","getBoundingClientRect","scaleX","Math","abs","width","offsetWidth","scaleY","height","offsetHeight","top","right","left","clientWidth","bottom","clientHeight","paddingValueToInt","value","number","parseInt","Number","isNaN","getScrollDistance","targetStart","targetEnd","scrollStart","scrollEnd","scrollPaddingStart","scrollPaddingEnd","scrollRectIntoView","root","targetRect","document","ownerDocument","current","isDocumentBody","body","bounding","window","visualViewport","documentElement","style","getComputedStyle","scrollDistanceX","scrollPaddingLeft","scrollPaddingRight","scrollDistanceY","scrollPaddingTop","scrollPaddingBottom","defaultView","scrollBy","scrollLeft","scrollTop","scrolledLeft","scrolledTop","position"],"sources":["../../../src/core/utils/scrollRectIntoView.ts"],"sourcesContent":["export type Rect = {\n top: number;\n right: number;\n bottom: number;\n left: number;\n};\n\nconst getParentElement = (element: Node): Element | null =>\n element.parentElement || (element.getRootNode() as ShadowRoot).host || null;\n\nconst getElementRect = (element: Element): Rect => {\n const rect = element.getBoundingClientRect();\n const scaleX =\n ('offsetWidth' in element &&\n Math.abs(rect.width) / (element as HTMLElement).offsetWidth) ||\n 1;\n const scaleY =\n ('offsetHeight' in element &&\n Math.abs(rect.height) / (element as HTMLElement).offsetHeight) ||\n 1;\n return {\n top: rect.top,\n right: rect.left + element.clientWidth * scaleX,\n bottom: rect.top + element.clientHeight * scaleY,\n left: rect.left,\n };\n};\n\nconst paddingValueToInt = (value: string) => {\n const number = parseInt(value, 10);\n return Number.isNaN(number) ? 0 : number;\n};\n\n// Follow the steps described in https://www.w3.org/TR/cssom-view-1/#element-scrolling-members,\n// assuming that the scroll option is set to 'nearest'.\nconst getScrollDistance = (\n targetStart: number,\n targetEnd: number,\n scrollStart: number,\n scrollEnd: number,\n scrollPaddingStart: number,\n scrollPaddingEnd: number,\n) => {\n if (targetStart < scrollStart && targetEnd > scrollEnd) {\n return 0;\n }\n\n if (targetStart < scrollStart) {\n return -(scrollStart - targetStart + scrollPaddingStart);\n }\n\n if (targetEnd > scrollEnd) {\n return targetEnd - targetStart > scrollEnd - scrollStart\n ? targetStart + scrollPaddingStart - scrollStart\n : targetEnd - scrollEnd + scrollPaddingEnd;\n }\n return 0;\n};\n\nconst scrollRectIntoView = (root: HTMLElement, targetRect: Rect) => {\n const document = root.ownerDocument;\n\n let rect = targetRect;\n\n let current: Element | null = root;\n while (current) {\n const isDocumentBody: boolean = current === document.body;\n const bounding = isDocumentBody\n ? {\n top: 0,\n right:\n window.visualViewport?.width ??\n document.documentElement.clientWidth,\n bottom:\n window.visualViewport?.height ??\n document.documentElement.clientHeight,\n left: 0,\n }\n : getElementRect(current);\n\n const style = getComputedStyle(current);\n const scrollDistanceX = getScrollDistance(\n rect.left,\n rect.right,\n bounding.left,\n bounding.right,\n paddingValueToInt(style.scrollPaddingLeft),\n paddingValueToInt(style.scrollPaddingRight),\n );\n const scrollDistanceY = getScrollDistance(\n rect.top,\n rect.bottom,\n bounding.top,\n bounding.bottom,\n paddingValueToInt(style.scrollPaddingTop),\n paddingValueToInt(style.scrollPaddingBottom),\n );\n if (scrollDistanceX || scrollDistanceY) {\n if (isDocumentBody) {\n document.defaultView?.scrollBy(scrollDistanceX, scrollDistanceY);\n } else {\n const { scrollLeft, scrollTop } = current;\n if (scrollDistanceY) {\n current.scrollTop += scrollDistanceY;\n }\n if (scrollDistanceX) {\n current.scrollLeft += scrollDistanceX;\n }\n const scrolledLeft = current.scrollLeft - scrollLeft;\n const scrolledTop = current.scrollTop - scrollTop;\n rect = {\n left: rect.left - scrolledLeft,\n top: rect.top - scrolledTop,\n right: rect.right - scrolledLeft,\n bottom: rect.bottom - scrolledTop,\n };\n }\n }\n\n current =\n isDocumentBody || style.position === 'fixed'\n ? null\n : getParentElement(current);\n }\n};\n\nexport default scrollRectIntoView;\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file diff --git a/public/assets/quill/dist/quill.bubble.css b/public/assets/quill/dist/quill.bubble.css new file mode 100644 index 0000000..518fec6 --- /dev/null +++ b/public/assets/quill/dist/quill.bubble.css @@ -0,0 +1,10 @@ +/*! + * Quill Editor v2.0.3 + * https://quilljs.com + * Copyright (c) 2017-2024, Slab + * Copyright (c) 2014, Jason Chen + * Copyright (c) 2013, salesforce.com + */ +.ql-container{box-sizing:border-box;font-family:Helvetica,Arial,sans-serif;font-size:13px;height:100%;margin:0;position:relative}.ql-container.ql-disabled .ql-tooltip{visibility:hidden}.ql-container:not(.ql-disabled) li[data-list=checked] > .ql-ui,.ql-container:not(.ql-disabled) li[data-list=unchecked] > .ql-ui{cursor:pointer}.ql-clipboard{left:-100000px;height:1px;overflow-y:hidden;position:absolute;top:50%}.ql-clipboard p{margin:0;padding:0}.ql-editor{box-sizing:border-box;counter-reset:list-0 list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9;line-height:1.42;height:100%;outline:none;overflow-y:auto;padding:12px 15px;tab-size:4;-moz-tab-size:4;text-align:left;white-space:pre-wrap;word-wrap:break-word}.ql-editor > *{cursor:text}.ql-editor p,.ql-editor ol,.ql-editor pre,.ql-editor blockquote,.ql-editor h1,.ql-editor h2,.ql-editor h3,.ql-editor h4,.ql-editor h5,.ql-editor h6{margin:0;padding:0}@supports (counter-set:none){.ql-editor p,.ql-editor h1,.ql-editor h2,.ql-editor h3,.ql-editor h4,.ql-editor h5,.ql-editor h6{counter-set:list-0 list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9}}@supports not (counter-set:none){.ql-editor p,.ql-editor h1,.ql-editor h2,.ql-editor h3,.ql-editor h4,.ql-editor h5,.ql-editor h6{counter-reset:list-0 list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9}}.ql-editor table{border-collapse:collapse}.ql-editor td{border:1px solid #000;padding:2px 5px}.ql-editor ol{padding-left:1.5em}.ql-editor li{list-style-type:none;padding-left:1.5em;position:relative}.ql-editor li > .ql-ui:before{display:inline-block;margin-left:-1.5em;margin-right:.3em;text-align:right;white-space:nowrap;width:1.2em}.ql-editor li[data-list=checked] > .ql-ui,.ql-editor li[data-list=unchecked] > .ql-ui{color:#777}.ql-editor li[data-list=bullet] > .ql-ui:before{content:'\2022'}.ql-editor li[data-list=checked] > .ql-ui:before{content:'\2611'}.ql-editor li[data-list=unchecked] > .ql-ui:before{content:'\2610'}@supports (counter-set:none){.ql-editor li[data-list]{counter-set:list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9}}@supports not (counter-set:none){.ql-editor li[data-list]{counter-reset:list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9}}.ql-editor li[data-list=ordered]{counter-increment:list-0}.ql-editor li[data-list=ordered] > .ql-ui:before{content:counter(list-0, decimal) '. '}.ql-editor li[data-list=ordered].ql-indent-1{counter-increment:list-1}.ql-editor li[data-list=ordered].ql-indent-1 > .ql-ui:before{content:counter(list-1, lower-alpha) '. '}@supports (counter-set:none){.ql-editor li[data-list].ql-indent-1{counter-set:list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9}}@supports not (counter-set:none){.ql-editor li[data-list].ql-indent-1{counter-reset:list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9}}.ql-editor li[data-list=ordered].ql-indent-2{counter-increment:list-2}.ql-editor li[data-list=ordered].ql-indent-2 > .ql-ui:before{content:counter(list-2, lower-roman) '. '}@supports (counter-set:none){.ql-editor li[data-list].ql-indent-2{counter-set:list-3 list-4 list-5 list-6 list-7 list-8 list-9}}@supports not (counter-set:none){.ql-editor li[data-list].ql-indent-2{counter-reset:list-3 list-4 list-5 list-6 list-7 list-8 list-9}}.ql-editor li[data-list=ordered].ql-indent-3{counter-increment:list-3}.ql-editor li[data-list=ordered].ql-indent-3 > .ql-ui:before{content:counter(list-3, decimal) '. '}@supports (counter-set:none){.ql-editor li[data-list].ql-indent-3{counter-set:list-4 list-5 list-6 list-7 list-8 list-9}}@supports not (counter-set:none){.ql-editor li[data-list].ql-indent-3{counter-reset:list-4 list-5 list-6 list-7 list-8 list-9}}.ql-editor li[data-list=ordered].ql-indent-4{counter-increment:list-4}.ql-editor li[data-list=ordered].ql-indent-4 > .ql-ui:before{content:counter(list-4, lower-alpha) '. '}@supports (counter-set:none){.ql-editor li[data-list].ql-indent-4{counter-set:list-5 list-6 list-7 list-8 list-9}}@supports not (counter-set:none){.ql-editor li[data-list].ql-indent-4{counter-reset:list-5 list-6 list-7 list-8 list-9}}.ql-editor li[data-list=ordered].ql-indent-5{counter-increment:list-5}.ql-editor li[data-list=ordered].ql-indent-5 > .ql-ui:before{content:counter(list-5, lower-roman) '. '}@supports (counter-set:none){.ql-editor li[data-list].ql-indent-5{counter-set:list-6 list-7 list-8 list-9}}@supports not (counter-set:none){.ql-editor li[data-list].ql-indent-5{counter-reset:list-6 list-7 list-8 list-9}}.ql-editor li[data-list=ordered].ql-indent-6{counter-increment:list-6}.ql-editor li[data-list=ordered].ql-indent-6 > .ql-ui:before{content:counter(list-6, decimal) '. '}@supports (counter-set:none){.ql-editor li[data-list].ql-indent-6{counter-set:list-7 list-8 list-9}}@supports not (counter-set:none){.ql-editor li[data-list].ql-indent-6{counter-reset:list-7 list-8 list-9}}.ql-editor li[data-list=ordered].ql-indent-7{counter-increment:list-7}.ql-editor li[data-list=ordered].ql-indent-7 > .ql-ui:before{content:counter(list-7, lower-alpha) '. '}@supports (counter-set:none){.ql-editor li[data-list].ql-indent-7{counter-set:list-8 list-9}}@supports not (counter-set:none){.ql-editor li[data-list].ql-indent-7{counter-reset:list-8 list-9}}.ql-editor li[data-list=ordered].ql-indent-8{counter-increment:list-8}.ql-editor li[data-list=ordered].ql-indent-8 > .ql-ui:before{content:counter(list-8, lower-roman) '. '}@supports (counter-set:none){.ql-editor li[data-list].ql-indent-8{counter-set:list-9}}@supports not (counter-set:none){.ql-editor li[data-list].ql-indent-8{counter-reset:list-9}}.ql-editor li[data-list=ordered].ql-indent-9{counter-increment:list-9}.ql-editor li[data-list=ordered].ql-indent-9 > .ql-ui:before{content:counter(list-9, decimal) '. '}.ql-editor .ql-indent-1:not(.ql-direction-rtl){padding-left:3em}.ql-editor li.ql-indent-1:not(.ql-direction-rtl){padding-left:4.5em}.ql-editor .ql-indent-1.ql-direction-rtl.ql-align-right{padding-right:3em}.ql-editor li.ql-indent-1.ql-direction-rtl.ql-align-right{padding-right:4.5em}.ql-editor .ql-indent-2:not(.ql-direction-rtl){padding-left:6em}.ql-editor li.ql-indent-2:not(.ql-direction-rtl){padding-left:7.5em}.ql-editor .ql-indent-2.ql-direction-rtl.ql-align-right{padding-right:6em}.ql-editor li.ql-indent-2.ql-direction-rtl.ql-align-right{padding-right:7.5em}.ql-editor .ql-indent-3:not(.ql-direction-rtl){padding-left:9em}.ql-editor li.ql-indent-3:not(.ql-direction-rtl){padding-left:10.5em}.ql-editor .ql-indent-3.ql-direction-rtl.ql-align-right{padding-right:9em}.ql-editor li.ql-indent-3.ql-direction-rtl.ql-align-right{padding-right:10.5em}.ql-editor .ql-indent-4:not(.ql-direction-rtl){padding-left:12em}.ql-editor li.ql-indent-4:not(.ql-direction-rtl){padding-left:13.5em}.ql-editor .ql-indent-4.ql-direction-rtl.ql-align-right{padding-right:12em}.ql-editor li.ql-indent-4.ql-direction-rtl.ql-align-right{padding-right:13.5em}.ql-editor .ql-indent-5:not(.ql-direction-rtl){padding-left:15em}.ql-editor li.ql-indent-5:not(.ql-direction-rtl){padding-left:16.5em}.ql-editor .ql-indent-5.ql-direction-rtl.ql-align-right{padding-right:15em}.ql-editor li.ql-indent-5.ql-direction-rtl.ql-align-right{padding-right:16.5em}.ql-editor .ql-indent-6:not(.ql-direction-rtl){padding-left:18em}.ql-editor li.ql-indent-6:not(.ql-direction-rtl){padding-left:19.5em}.ql-editor .ql-indent-6.ql-direction-rtl.ql-align-right{padding-right:18em}.ql-editor li.ql-indent-6.ql-direction-rtl.ql-align-right{padding-right:19.5em}.ql-editor .ql-indent-7:not(.ql-direction-rtl){padding-left:21em}.ql-editor li.ql-indent-7:not(.ql-direction-rtl){padding-left:22.5em}.ql-editor .ql-indent-7.ql-direction-rtl.ql-align-right{padding-right:21em}.ql-editor li.ql-indent-7.ql-direction-rtl.ql-align-right{padding-right:22.5em}.ql-editor .ql-indent-8:not(.ql-direction-rtl){padding-left:24em}.ql-editor li.ql-indent-8:not(.ql-direction-rtl){padding-left:25.5em}.ql-editor .ql-indent-8.ql-direction-rtl.ql-align-right{padding-right:24em}.ql-editor li.ql-indent-8.ql-direction-rtl.ql-align-right{padding-right:25.5em}.ql-editor .ql-indent-9:not(.ql-direction-rtl){padding-left:27em}.ql-editor li.ql-indent-9:not(.ql-direction-rtl){padding-left:28.5em}.ql-editor .ql-indent-9.ql-direction-rtl.ql-align-right{padding-right:27em}.ql-editor li.ql-indent-9.ql-direction-rtl.ql-align-right{padding-right:28.5em}.ql-editor li.ql-direction-rtl{padding-right:1.5em}.ql-editor li.ql-direction-rtl > .ql-ui:before{margin-left:.3em;margin-right:-1.5em;text-align:left}.ql-editor table{table-layout:fixed;width:100%}.ql-editor table td{outline:none}.ql-editor .ql-code-block-container{font-family:monospace}.ql-editor .ql-video{display:block;max-width:100%}.ql-editor .ql-video.ql-align-center{margin:0 auto}.ql-editor .ql-video.ql-align-right{margin:0 0 0 auto}.ql-editor .ql-bg-black{background-color:#000}.ql-editor .ql-bg-red{background-color:#e60000}.ql-editor .ql-bg-orange{background-color:#f90}.ql-editor .ql-bg-yellow{background-color:#ff0}.ql-editor .ql-bg-green{background-color:#008a00}.ql-editor .ql-bg-blue{background-color:#06c}.ql-editor .ql-bg-purple{background-color:#93f}.ql-editor .ql-color-white{color:#fff}.ql-editor .ql-color-red{color:#e60000}.ql-editor .ql-color-orange{color:#f90}.ql-editor .ql-color-yellow{color:#ff0}.ql-editor .ql-color-green{color:#008a00}.ql-editor .ql-color-blue{color:#06c}.ql-editor .ql-color-purple{color:#93f}.ql-editor .ql-font-serif{font-family:Georgia,Times New Roman,serif}.ql-editor .ql-font-monospace{font-family:Monaco,Courier New,monospace}.ql-editor .ql-size-small{font-size:.75em}.ql-editor .ql-size-large{font-size:1.5em}.ql-editor .ql-size-huge{font-size:2.5em}.ql-editor .ql-direction-rtl{direction:rtl;text-align:inherit}.ql-editor .ql-align-center{text-align:center}.ql-editor .ql-align-justify{text-align:justify}.ql-editor .ql-align-right{text-align:right}.ql-editor .ql-ui{position:absolute}.ql-editor.ql-blank::before{color:rgba(0,0,0,0.6);content:attr(data-placeholder);font-style:italic;left:15px;pointer-events:none;position:absolute;right:15px}.ql-bubble.ql-toolbar:after,.ql-bubble .ql-toolbar:after{clear:both;content:'';display:table}.ql-bubble.ql-toolbar button,.ql-bubble .ql-toolbar button{background:none;border:none;cursor:pointer;display:inline-block;float:left;height:24px;padding:3px 5px;width:28px}.ql-bubble.ql-toolbar button svg,.ql-bubble .ql-toolbar button svg{float:left;height:100%}.ql-bubble.ql-toolbar button:active:hover,.ql-bubble .ql-toolbar button:active:hover{outline:none}.ql-bubble.ql-toolbar input.ql-image[type=file],.ql-bubble .ql-toolbar input.ql-image[type=file]{display:none}.ql-bubble.ql-toolbar button:hover,.ql-bubble .ql-toolbar button:hover,.ql-bubble.ql-toolbar button:focus,.ql-bubble .ql-toolbar button:focus,.ql-bubble.ql-toolbar button.ql-active,.ql-bubble .ql-toolbar button.ql-active,.ql-bubble.ql-toolbar .ql-picker-label:hover,.ql-bubble .ql-toolbar .ql-picker-label:hover,.ql-bubble.ql-toolbar .ql-picker-label.ql-active,.ql-bubble .ql-toolbar .ql-picker-label.ql-active,.ql-bubble.ql-toolbar .ql-picker-item:hover,.ql-bubble .ql-toolbar .ql-picker-item:hover,.ql-bubble.ql-toolbar .ql-picker-item.ql-selected,.ql-bubble .ql-toolbar .ql-picker-item.ql-selected{color:#fff}.ql-bubble.ql-toolbar button:hover .ql-fill,.ql-bubble .ql-toolbar button:hover .ql-fill,.ql-bubble.ql-toolbar button:focus .ql-fill,.ql-bubble .ql-toolbar button:focus .ql-fill,.ql-bubble.ql-toolbar button.ql-active .ql-fill,.ql-bubble .ql-toolbar button.ql-active .ql-fill,.ql-bubble.ql-toolbar .ql-picker-label:hover .ql-fill,.ql-bubble .ql-toolbar .ql-picker-label:hover .ql-fill,.ql-bubble.ql-toolbar .ql-picker-label.ql-active .ql-fill,.ql-bubble .ql-toolbar .ql-picker-label.ql-active .ql-fill,.ql-bubble.ql-toolbar .ql-picker-item:hover .ql-fill,.ql-bubble .ql-toolbar .ql-picker-item:hover .ql-fill,.ql-bubble.ql-toolbar .ql-picker-item.ql-selected .ql-fill,.ql-bubble .ql-toolbar .ql-picker-item.ql-selected .ql-fill,.ql-bubble.ql-toolbar button:hover .ql-stroke.ql-fill,.ql-bubble .ql-toolbar button:hover .ql-stroke.ql-fill,.ql-bubble.ql-toolbar button:focus .ql-stroke.ql-fill,.ql-bubble .ql-toolbar button:focus .ql-stroke.ql-fill,.ql-bubble.ql-toolbar button.ql-active .ql-stroke.ql-fill,.ql-bubble .ql-toolbar button.ql-active .ql-stroke.ql-fill,.ql-bubble.ql-toolbar .ql-picker-label:hover .ql-stroke.ql-fill,.ql-bubble .ql-toolbar .ql-picker-label:hover .ql-stroke.ql-fill,.ql-bubble.ql-toolbar .ql-picker-label.ql-active .ql-stroke.ql-fill,.ql-bubble .ql-toolbar .ql-picker-label.ql-active .ql-stroke.ql-fill,.ql-bubble.ql-toolbar .ql-picker-item:hover .ql-stroke.ql-fill,.ql-bubble .ql-toolbar .ql-picker-item:hover .ql-stroke.ql-fill,.ql-bubble.ql-toolbar .ql-picker-item.ql-selected .ql-stroke.ql-fill,.ql-bubble .ql-toolbar .ql-picker-item.ql-selected .ql-stroke.ql-fill{fill:#fff}.ql-bubble.ql-toolbar button:hover .ql-stroke,.ql-bubble .ql-toolbar button:hover .ql-stroke,.ql-bubble.ql-toolbar button:focus .ql-stroke,.ql-bubble .ql-toolbar button:focus .ql-stroke,.ql-bubble.ql-toolbar button.ql-active .ql-stroke,.ql-bubble .ql-toolbar button.ql-active .ql-stroke,.ql-bubble.ql-toolbar .ql-picker-label:hover .ql-stroke,.ql-bubble .ql-toolbar .ql-picker-label:hover .ql-stroke,.ql-bubble.ql-toolbar .ql-picker-label.ql-active .ql-stroke,.ql-bubble .ql-toolbar .ql-picker-label.ql-active .ql-stroke,.ql-bubble.ql-toolbar .ql-picker-item:hover .ql-stroke,.ql-bubble .ql-toolbar .ql-picker-item:hover .ql-stroke,.ql-bubble.ql-toolbar .ql-picker-item.ql-selected .ql-stroke,.ql-bubble .ql-toolbar .ql-picker-item.ql-selected .ql-stroke,.ql-bubble.ql-toolbar button:hover .ql-stroke-miter,.ql-bubble .ql-toolbar button:hover .ql-stroke-miter,.ql-bubble.ql-toolbar button:focus .ql-stroke-miter,.ql-bubble .ql-toolbar button:focus .ql-stroke-miter,.ql-bubble.ql-toolbar button.ql-active .ql-stroke-miter,.ql-bubble .ql-toolbar button.ql-active .ql-stroke-miter,.ql-bubble.ql-toolbar .ql-picker-label:hover .ql-stroke-miter,.ql-bubble .ql-toolbar .ql-picker-label:hover .ql-stroke-miter,.ql-bubble.ql-toolbar .ql-picker-label.ql-active .ql-stroke-miter,.ql-bubble .ql-toolbar .ql-picker-label.ql-active .ql-stroke-miter,.ql-bubble.ql-toolbar .ql-picker-item:hover .ql-stroke-miter,.ql-bubble .ql-toolbar .ql-picker-item:hover .ql-stroke-miter,.ql-bubble.ql-toolbar .ql-picker-item.ql-selected .ql-stroke-miter,.ql-bubble .ql-toolbar .ql-picker-item.ql-selected .ql-stroke-miter{stroke:#fff}@media (pointer:coarse){.ql-bubble.ql-toolbar button:hover:not(.ql-active),.ql-bubble .ql-toolbar button:hover:not(.ql-active){color:#ccc}.ql-bubble.ql-toolbar button:hover:not(.ql-active) .ql-fill,.ql-bubble .ql-toolbar button:hover:not(.ql-active) .ql-fill,.ql-bubble.ql-toolbar button:hover:not(.ql-active) .ql-stroke.ql-fill,.ql-bubble .ql-toolbar button:hover:not(.ql-active) .ql-stroke.ql-fill{fill:#ccc}.ql-bubble.ql-toolbar button:hover:not(.ql-active) .ql-stroke,.ql-bubble .ql-toolbar button:hover:not(.ql-active) .ql-stroke,.ql-bubble.ql-toolbar button:hover:not(.ql-active) .ql-stroke-miter,.ql-bubble .ql-toolbar button:hover:not(.ql-active) .ql-stroke-miter{stroke:#ccc}}.ql-bubble{box-sizing:border-box}.ql-bubble *{box-sizing:border-box}.ql-bubble .ql-hidden{display:none}.ql-bubble .ql-out-bottom,.ql-bubble .ql-out-top{visibility:hidden}.ql-bubble .ql-tooltip{position:absolute;transform:translateY(10px)}.ql-bubble .ql-tooltip a{cursor:pointer;text-decoration:none}.ql-bubble .ql-tooltip.ql-flip{transform:translateY(-10px)}.ql-bubble .ql-formats{display:inline-block;vertical-align:middle}.ql-bubble .ql-formats:after{clear:both;content:'';display:table}.ql-bubble .ql-stroke{fill:none;stroke:#ccc;stroke-linecap:round;stroke-linejoin:round;stroke-width:2}.ql-bubble .ql-stroke-miter{fill:none;stroke:#ccc;stroke-miterlimit:10;stroke-width:2}.ql-bubble .ql-fill,.ql-bubble .ql-stroke.ql-fill{fill:#ccc}.ql-bubble .ql-empty{fill:none}.ql-bubble .ql-even{fill-rule:evenodd}.ql-bubble .ql-thin,.ql-bubble .ql-stroke.ql-thin{stroke-width:1}.ql-bubble .ql-transparent{opacity:.4}.ql-bubble .ql-direction svg:last-child{display:none}.ql-bubble .ql-direction.ql-active svg:last-child{display:inline}.ql-bubble .ql-direction.ql-active svg:first-child{display:none}.ql-bubble .ql-editor h1{font-size:2em}.ql-bubble .ql-editor h2{font-size:1.5em}.ql-bubble .ql-editor h3{font-size:1.17em}.ql-bubble .ql-editor h4{font-size:1em}.ql-bubble .ql-editor h5{font-size:.83em}.ql-bubble .ql-editor h6{font-size:.67em}.ql-bubble .ql-editor a{text-decoration:underline}.ql-bubble .ql-editor blockquote{border-left:4px solid #ccc;margin-bottom:5px;margin-top:5px;padding-left:16px}.ql-bubble .ql-editor code,.ql-bubble .ql-editor .ql-code-block-container{background-color:#f0f0f0;border-radius:3px}.ql-bubble .ql-editor .ql-code-block-container{margin-bottom:5px;margin-top:5px;padding:5px 10px}.ql-bubble .ql-editor code{font-size:85%;padding:2px 4px}.ql-bubble .ql-editor .ql-code-block-container{background-color:#23241f;color:#f8f8f2;overflow:visible}.ql-bubble .ql-editor img{max-width:100%}.ql-bubble .ql-picker{color:#ccc;display:inline-block;float:left;font-size:14px;font-weight:500;height:24px;position:relative;vertical-align:middle}.ql-bubble .ql-picker-label{cursor:pointer;display:inline-block;height:100%;padding-left:8px;padding-right:2px;position:relative;width:100%}.ql-bubble .ql-picker-label::before{display:inline-block;line-height:22px}.ql-bubble .ql-picker-options{background-color:#444;display:none;min-width:100%;padding:4px 8px;position:absolute;white-space:nowrap}.ql-bubble .ql-picker-options .ql-picker-item{cursor:pointer;display:block;padding-bottom:5px;padding-top:5px}.ql-bubble .ql-picker.ql-expanded .ql-picker-label{color:#777;z-index:2}.ql-bubble .ql-picker.ql-expanded .ql-picker-label .ql-fill{fill:#777}.ql-bubble .ql-picker.ql-expanded .ql-picker-label .ql-stroke{stroke:#777}.ql-bubble .ql-picker.ql-expanded .ql-picker-options{display:block;margin-top:-1px;top:100%;z-index:1}.ql-bubble .ql-color-picker,.ql-bubble .ql-icon-picker{width:28px}.ql-bubble .ql-color-picker .ql-picker-label,.ql-bubble .ql-icon-picker .ql-picker-label{padding:2px 4px}.ql-bubble .ql-color-picker .ql-picker-label svg,.ql-bubble .ql-icon-picker .ql-picker-label svg{right:4px}.ql-bubble .ql-icon-picker .ql-picker-options{padding:4px 0}.ql-bubble .ql-icon-picker .ql-picker-item{height:24px;width:24px;padding:2px 4px}.ql-bubble .ql-color-picker .ql-picker-options{padding:3px 5px;width:152px}.ql-bubble .ql-color-picker .ql-picker-item{border:1px solid transparent;float:left;height:16px;margin:2px;padding:0;width:16px}.ql-bubble .ql-picker:not(.ql-color-picker):not(.ql-icon-picker) svg{position:absolute;margin-top:-9px;right:0;top:50%;width:18px}.ql-bubble .ql-picker.ql-header .ql-picker-label[data-label]:not([data-label=''])::before,.ql-bubble .ql-picker.ql-font .ql-picker-label[data-label]:not([data-label=''])::before,.ql-bubble .ql-picker.ql-size .ql-picker-label[data-label]:not([data-label=''])::before,.ql-bubble .ql-picker.ql-header .ql-picker-item[data-label]:not([data-label=''])::before,.ql-bubble .ql-picker.ql-font .ql-picker-item[data-label]:not([data-label=''])::before,.ql-bubble .ql-picker.ql-size .ql-picker-item[data-label]:not([data-label=''])::before{content:attr(data-label)}.ql-bubble .ql-picker.ql-header{width:98px}.ql-bubble .ql-picker.ql-header .ql-picker-label::before,.ql-bubble .ql-picker.ql-header .ql-picker-item::before{content:'Normal'}.ql-bubble .ql-picker.ql-header .ql-picker-label[data-value="1"]::before,.ql-bubble .ql-picker.ql-header .ql-picker-item[data-value="1"]::before{content:'Heading 1'}.ql-bubble .ql-picker.ql-header .ql-picker-label[data-value="2"]::before,.ql-bubble .ql-picker.ql-header .ql-picker-item[data-value="2"]::before{content:'Heading 2'}.ql-bubble .ql-picker.ql-header .ql-picker-label[data-value="3"]::before,.ql-bubble .ql-picker.ql-header .ql-picker-item[data-value="3"]::before{content:'Heading 3'}.ql-bubble .ql-picker.ql-header .ql-picker-label[data-value="4"]::before,.ql-bubble .ql-picker.ql-header .ql-picker-item[data-value="4"]::before{content:'Heading 4'}.ql-bubble .ql-picker.ql-header .ql-picker-label[data-value="5"]::before,.ql-bubble .ql-picker.ql-header .ql-picker-item[data-value="5"]::before{content:'Heading 5'}.ql-bubble .ql-picker.ql-header .ql-picker-label[data-value="6"]::before,.ql-bubble .ql-picker.ql-header .ql-picker-item[data-value="6"]::before{content:'Heading 6'}.ql-bubble .ql-picker.ql-header .ql-picker-item[data-value="1"]::before{font-size:2em}.ql-bubble .ql-picker.ql-header .ql-picker-item[data-value="2"]::before{font-size:1.5em}.ql-bubble .ql-picker.ql-header .ql-picker-item[data-value="3"]::before{font-size:1.17em}.ql-bubble .ql-picker.ql-header .ql-picker-item[data-value="4"]::before{font-size:1em}.ql-bubble .ql-picker.ql-header .ql-picker-item[data-value="5"]::before{font-size:.83em}.ql-bubble .ql-picker.ql-header .ql-picker-item[data-value="6"]::before{font-size:.67em}.ql-bubble .ql-picker.ql-font{width:108px}.ql-bubble .ql-picker.ql-font .ql-picker-label::before,.ql-bubble .ql-picker.ql-font .ql-picker-item::before{content:'Sans Serif'}.ql-bubble .ql-picker.ql-font .ql-picker-label[data-value=serif]::before,.ql-bubble .ql-picker.ql-font .ql-picker-item[data-value=serif]::before{content:'Serif'}.ql-bubble .ql-picker.ql-font .ql-picker-label[data-value=monospace]::before,.ql-bubble .ql-picker.ql-font .ql-picker-item[data-value=monospace]::before{content:'Monospace'}.ql-bubble .ql-picker.ql-font .ql-picker-item[data-value=serif]::before{font-family:Georgia,Times New Roman,serif}.ql-bubble .ql-picker.ql-font .ql-picker-item[data-value=monospace]::before{font-family:Monaco,Courier New,monospace}.ql-bubble .ql-picker.ql-size{width:98px}.ql-bubble .ql-picker.ql-size .ql-picker-label::before,.ql-bubble .ql-picker.ql-size .ql-picker-item::before{content:'Normal'}.ql-bubble .ql-picker.ql-size .ql-picker-label[data-value=small]::before,.ql-bubble .ql-picker.ql-size .ql-picker-item[data-value=small]::before{content:'Small'}.ql-bubble .ql-picker.ql-size .ql-picker-label[data-value=large]::before,.ql-bubble .ql-picker.ql-size .ql-picker-item[data-value=large]::before{content:'Large'}.ql-bubble .ql-picker.ql-size .ql-picker-label[data-value=huge]::before,.ql-bubble .ql-picker.ql-size .ql-picker-item[data-value=huge]::before{content:'Huge'}.ql-bubble .ql-picker.ql-size .ql-picker-item[data-value=small]::before{font-size:10px}.ql-bubble .ql-picker.ql-size .ql-picker-item[data-value=large]::before{font-size:18px}.ql-bubble .ql-picker.ql-size .ql-picker-item[data-value=huge]::before{font-size:32px}.ql-bubble .ql-color-picker.ql-background .ql-picker-item{background-color:#fff}.ql-bubble .ql-color-picker.ql-color .ql-picker-item{background-color:#000}.ql-code-block-container{position:relative}.ql-code-block-container .ql-ui{right:5px;top:5px}.ql-bubble .ql-toolbar .ql-formats{margin:8px 12px 8px 0}.ql-bubble .ql-toolbar .ql-formats:first-child{margin-left:12px}.ql-bubble .ql-color-picker svg{margin:1px}.ql-bubble .ql-color-picker .ql-picker-item.ql-selected,.ql-bubble .ql-color-picker .ql-picker-item:hover{border-color:#fff}.ql-bubble .ql-tooltip{background-color:#444;border-radius:25px;color:#fff}.ql-bubble .ql-tooltip-arrow{border-left:6px solid transparent;border-right:6px solid transparent;content:" ";display:block;left:50%;margin-left:-6px;position:absolute}.ql-bubble .ql-tooltip:not(.ql-flip) .ql-tooltip-arrow{border-bottom:6px solid #444;top:-6px}.ql-bubble .ql-tooltip.ql-flip .ql-tooltip-arrow{border-top:6px solid #444;bottom:-6px}.ql-bubble .ql-tooltip.ql-editing .ql-tooltip-editor{display:block}.ql-bubble .ql-tooltip.ql-editing .ql-formats{visibility:hidden}.ql-bubble .ql-tooltip-editor{display:none}.ql-bubble .ql-tooltip-editor input[type=text]{background:transparent;border:none;color:#fff;font-size:13px;height:100%;outline:none;padding:10px 20px;position:absolute;width:100%}.ql-bubble .ql-tooltip-editor a{top:10px;position:absolute;right:20px}.ql-bubble .ql-tooltip-editor a:before{color:#ccc;content:"\00D7";font-size:16px;font-weight:bold}.ql-container.ql-bubble:not(.ql-disabled) a:not(.ql-close){position:relative;white-space:nowrap}.ql-container.ql-bubble:not(.ql-disabled) a:not(.ql-close)::before{background-color:#444;border-radius:15px;top:-5px;font-size:12px;color:#fff;content:attr(href);font-weight:normal;overflow:hidden;padding:5px 15px;text-decoration:none;z-index:1}.ql-container.ql-bubble:not(.ql-disabled) a:not(.ql-close)::after{border-top:6px solid #444;border-left:6px solid transparent;border-right:6px solid transparent;top:0;content:" ";height:0;width:0}.ql-container.ql-bubble:not(.ql-disabled) a:not(.ql-close)::before,.ql-container.ql-bubble:not(.ql-disabled) a:not(.ql-close)::after{left:0;margin-left:50%;position:absolute;transform:translate(-50%,-100%);transition:visibility 0s ease 200ms;visibility:hidden}.ql-container.ql-bubble:not(.ql-disabled) a:not(.ql-close):hover::before,.ql-container.ql-bubble:not(.ql-disabled) a:not(.ql-close):hover::after{visibility:visible} + +/*# sourceMappingURL=quill.bubble.css.map*/ \ No newline at end of file diff --git a/public/assets/quill/dist/quill.bubble.css.map b/public/assets/quill/dist/quill.bubble.css.map new file mode 100644 index 0000000..47ed721 --- /dev/null +++ b/public/assets/quill/dist/quill.bubble.css.map @@ -0,0 +1 @@ +{"version":3,"file":"quill.bubble.css","mappings":"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","sources":["webpack://Quill/./src/assets/core.styl","webpack://Quill/./src/assets/base.styl","webpack://Quill/./src/assets/bubble/toolbar.styl","webpack://Quill/./src/assets/bubble/tooltip.styl","webpack://Quill/./src/assets/bubble.styl"],"sourcesContent":["// Styles necessary for Quill\n\nLIST_STYLE = decimal lower-alpha lower-roman\nLIST_STYLE_WIDTH = 1.2em\nLIST_STYLE_MARGIN = 0.3em\nLIST_STYLE_OUTER_WIDTH = LIST_STYLE_MARGIN + LIST_STYLE_WIDTH\nMAX_INDENT = 9\n\nresets(arr)\n unquote('list-' + join(' list-', arr))\n\n.ql-container\n box-sizing: border-box\n font-family: Helvetica, Arial, sans-serif\n font-size: 13px\n height: 100%\n margin: 0px\n position: relative\n\n.ql-container.ql-disabled\n .ql-tooltip\n visibility: hidden\n\n.ql-container:not(.ql-disabled)\n li[data-list=checked],\n li[data-list=unchecked]\n > .ql-ui\n cursor: pointer\n\n.ql-clipboard\n left: -100000px\n height: 1px\n overflow-y: hidden\n position: absolute\n top: 50%\n p\n margin: 0\n padding: 0\n\n.ql-editor\n box-sizing: border-box\n counter-reset: resets(0..MAX_INDENT)\n line-height: 1.42\n height: 100%\n outline: none\n overflow-y: auto\n padding: 12px 15px\n tab-size: 4\n -moz-tab-size: 4\n text-align: left\n white-space: pre-wrap\n word-wrap: break-word\n > *\n cursor: text\n\n p, ol, pre, blockquote, h1, h2, h3, h4, h5, h6\n margin: 0\n padding: 0\n p, h1, h2, h3, h4, h5, h6\n @supports (counter-set: none)\n counter-set: resets(0..MAX_INDENT)\n @supports not (counter-set: none)\n counter-reset: resets(0..MAX_INDENT)\n table\n border-collapse: collapse\n td\n border: 1px solid #000\n padding: 2px 5px\n ol\n padding-left: 1.5em\n li\n list-style-type: none\n padding-left: LIST_STYLE_OUTER_WIDTH\n position: relative\n\n > .ql-ui:before\n display: inline-block\n margin-left: -1*LIST_STYLE_OUTER_WIDTH\n margin-right: LIST_STYLE_MARGIN\n text-align: right\n white-space: nowrap\n width: LIST_STYLE_WIDTH\n\n li[data-list=checked],\n li[data-list=unchecked]\n > .ql-ui\n color: #777\n\n li[data-list=bullet] > .ql-ui:before\n content: '\\2022'\n li[data-list=checked] > .ql-ui:before\n content: '\\2611'\n li[data-list=unchecked] > .ql-ui:before\n content: '\\2610'\n\n li[data-list]\n @supports (counter-set: none)\n counter-set: resets(1..MAX_INDENT)\n @supports not (counter-set: none)\n counter-reset: resets(1..MAX_INDENT)\n\n li[data-list=ordered]\n counter-increment: list-0\n > .ql-ui:before\n content: unquote('counter(list-0, ' + LIST_STYLE[0] + ')') '. '\n for num in (1..MAX_INDENT)\n li[data-list=ordered].ql-indent-{num}\n counter-increment: unquote('list-' + num)\n > .ql-ui:before\n content: unquote('counter(list-' + num + ', ' + LIST_STYLE[num%3] + ')') '. '\n if (num < MAX_INDENT)\n li[data-list].ql-indent-{num}\n @supports (counter-set: none)\n counter-set: resets((num+1)..MAX_INDENT)\n @supports not (counter-set: none)\n counter-reset: resets((num+1)..MAX_INDENT)\n\n for num in (1..MAX_INDENT)\n .ql-indent-{num}:not(.ql-direction-rtl)\n padding-left: (3*num)em\n li.ql-indent-{num}:not(.ql-direction-rtl)\n padding-left: (3*num + LIST_STYLE_OUTER_WIDTH)em\n .ql-indent-{num}.ql-direction-rtl.ql-align-right\n padding-right: (3*num)em\n li.ql-indent-{num}.ql-direction-rtl.ql-align-right\n padding-right: (3*num + LIST_STYLE_OUTER_WIDTH)em\n\n li.ql-direction-rtl\n padding-right: LIST_STYLE_OUTER_WIDTH\n > .ql-ui:before\n margin-left: LIST_STYLE_MARGIN\n margin-right: -1*LIST_STYLE_OUTER_WIDTH\n text-align: left\n\n table\n table-layout: fixed\n width: 100%\n td\n outline: none\n\n .ql-code-block-container\n font-family: monospace\n\n .ql-video\n display: block\n max-width: 100%\n .ql-video.ql-align-center\n margin: 0 auto\n .ql-video.ql-align-right\n margin: 0 0 0 auto\n\n .ql-bg-black\n background-color: rgb(0,0,0)\n .ql-bg-red\n background-color: rgb(230,0,0)\n .ql-bg-orange\n background-color: rgb(255,153,0)\n .ql-bg-yellow\n background-color: rgb(255,255,0)\n .ql-bg-green\n background-color: rgb(0,138,0)\n .ql-bg-blue\n background-color: rgb(0,102,204)\n .ql-bg-purple\n background-color: rgb(153,51,255)\n\n .ql-color-white\n color: rgb(255,255,255)\n .ql-color-red\n color: rgb(230,0,0)\n .ql-color-orange\n color: rgb(255,153,0)\n .ql-color-yellow\n color: rgb(255,255,0)\n .ql-color-green\n color: rgb(0,138,0)\n .ql-color-blue\n color: rgb(0,102,204)\n .ql-color-purple\n color: rgb(153,51,255)\n\n .ql-font-serif\n font-family: Georgia, Times New Roman, serif\n .ql-font-monospace\n font-family: Monaco, Courier New, monospace\n\n .ql-size-small\n font-size: 0.75em\n .ql-size-large\n font-size: 1.5em\n .ql-size-huge\n font-size: 2.5em\n\n .ql-direction-rtl\n direction: rtl\n text-align: inherit\n\n .ql-align-center\n text-align: center\n .ql-align-justify\n text-align: justify\n .ql-align-right\n text-align: right\n\n .ql-ui\n position: absolute\n\n.ql-editor.ql-blank::before\n color: rgba(0,0,0,0.6)\n content: attr(data-placeholder)\n font-style: italic\n left: 15px\n pointer-events: none\n position: absolute\n right: 15px\n","// Styles shared between snow and bubble\n\ncontrolHeight = 24px\ninputPaddingWidth = 5px\ninputPaddingHeight = 3px\n\ncolorItemMargin = 2px\ncolorItemSize = 16px\ncolorItemsPerRow = 7\n\n\n.ql-{themeName}.ql-toolbar, .ql-{themeName} .ql-toolbar\n &:after\n clear: both\n content: ''\n display: table\n\n button\n background: none\n border: none\n cursor: pointer\n display: inline-block\n float: left\n height: controlHeight\n padding: inputPaddingHeight inputPaddingWidth\n width: controlHeight + (inputPaddingWidth - inputPaddingHeight)*2\n\n svg\n float: left\n height: 100%\n\n &:active:hover\n outline: none\n\n input.ql-image[type=file]\n display: none\n\n button:hover, button:focus, button.ql-active,\n .ql-picker-label:hover, .ql-picker-label.ql-active,\n .ql-picker-item:hover, .ql-picker-item.ql-selected\n color: activeColor\n .ql-fill, .ql-stroke.ql-fill\n fill: activeColor\n .ql-stroke, .ql-stroke-miter\n stroke: activeColor\n\n// Fix for iOS not losing hover on touch\n@media (pointer: coarse)\n .ql-{themeName}.ql-toolbar, .ql-{themeName} .ql-toolbar\n button:hover:not(.ql-active)\n color: inactiveColor\n .ql-fill, .ql-stroke.ql-fill\n fill: inactiveColor\n .ql-stroke, .ql-stroke-miter\n stroke: inactiveColor\n\n.ql-{themeName}\n box-sizing: border-box\n *\n box-sizing: border-box\n\n .ql-hidden\n display: none\n .ql-out-bottom, .ql-out-top\n visibility: hidden\n\n .ql-tooltip\n position: absolute\n transform: translateY(10px)\n a\n cursor: pointer\n text-decoration: none\n .ql-tooltip.ql-flip\n transform: translateY(-10px)\n\n .ql-formats\n &:after\n clear: both\n content: ''\n display: table\n display: inline-block\n vertical-align: middle\n\n .ql-stroke\n fill: none\n stroke: inactiveColor\n stroke-linecap: round\n stroke-linejoin: round\n stroke-width: 2\n .ql-stroke-miter\n fill: none\n stroke: inactiveColor\n stroke-miterlimit: 10\n stroke-width: 2\n\n .ql-fill, .ql-stroke.ql-fill\n fill: inactiveColor\n\n .ql-empty\n fill: none\n .ql-even\n fill-rule: evenodd\n .ql-thin, .ql-stroke.ql-thin\n stroke-width: 1\n .ql-transparent\n opacity: 0.4\n\n .ql-direction\n svg:last-child\n display: none\n .ql-direction.ql-active\n svg:last-child\n display: inline\n svg:first-child\n display: none\n\n .ql-editor\n h1\n font-size: 2em\n h2\n font-size: 1.5em\n h3\n font-size: 1.17em\n h4\n font-size: 1em\n h5\n font-size: 0.83em\n h6\n font-size: 0.67em\n a\n text-decoration: underline\n blockquote\n border-left: 4px solid #ccc\n margin-bottom: 5px\n margin-top: 5px\n padding-left: 16px\n code, .ql-code-block-container\n background-color: #f0f0f0\n border-radius: 3px\n .ql-code-block-container\n margin-bottom: 5px\n margin-top: 5px\n padding: 5px 10px\n code\n font-size: 85%\n padding: 2px 4px\n .ql-code-block-container\n background-color: #23241f\n color: #f8f8f2\n overflow: visible\n img\n max-width: 100%\n\n .ql-picker\n color: inactiveColor\n display: inline-block\n float: left\n font-size: 14px\n font-weight: 500\n height: controlHeight\n position: relative\n vertical-align: middle\n .ql-picker-label\n cursor: pointer\n display: inline-block\n height: 100%\n padding-left: 8px\n padding-right: 2px\n position: relative\n width: 100%\n &::before\n display: inline-block\n line-height: 22px\n .ql-picker-options\n background-color: backgroundColor\n display: none\n min-width: 100%\n padding: 4px 8px\n position: absolute\n white-space: nowrap\n .ql-picker-item\n cursor: pointer\n display: block\n padding-bottom: 5px\n padding-top: 5px\n .ql-picker.ql-expanded\n .ql-picker-label\n color: borderColor\n z-index: 2\n .ql-fill\n fill: borderColor\n .ql-stroke\n stroke: borderColor\n .ql-picker-options\n display: block\n margin-top: -1px\n top: 100%\n z-index: 1\n\n .ql-color-picker, .ql-icon-picker\n width: controlHeight + 4\n .ql-picker-label\n padding: 2px 4px\n svg\n right: 4px\n .ql-icon-picker\n .ql-picker-options\n padding: 4px 0px\n .ql-picker-item\n height: controlHeight\n width: controlHeight\n padding: 2px 4px\n .ql-color-picker\n .ql-picker-options\n padding: inputPaddingHeight inputPaddingWidth\n width: (colorItemSize + 2*colorItemMargin) * colorItemsPerRow + 2*inputPaddingWidth + 2 // +2 for the border\n .ql-picker-item\n border: 1px solid transparent\n float: left\n height: colorItemSize\n margin: colorItemMargin\n padding: 0px\n width: colorItemSize\n\n .ql-picker:not(.ql-color-picker):not(.ql-icon-picker)\n svg\n position: absolute\n margin-top: -9px\n right: 0\n top: 50%\n width: 18px\n\n .ql-picker.ql-header, .ql-picker.ql-font, .ql-picker.ql-size\n .ql-picker-label[data-label]:not([data-label='']),\n .ql-picker-item[data-label]:not([data-label=''])\n &::before\n content: attr(data-label)\n\n .ql-picker.ql-header\n width: 98px\n .ql-picker-label::before,\n .ql-picker-item::before\n content: 'Normal'\n for num in (1..6)\n .ql-picker-label[data-value=\\\"{num}\\\"]::before,\n .ql-picker-item[data-value=\\\"{num}\\\"]::before\n content: 'Heading ' + num\n .ql-picker-item[data-value=\"1\"]::before\n font-size: 2em\n .ql-picker-item[data-value=\"2\"]::before\n font-size: 1.5em\n .ql-picker-item[data-value=\"3\"]::before\n font-size: 1.17em\n .ql-picker-item[data-value=\"4\"]::before\n font-size: 1em\n .ql-picker-item[data-value=\"5\"]::before\n font-size: 0.83em\n .ql-picker-item[data-value=\"6\"]::before\n font-size: 0.67em\n\n .ql-picker.ql-font\n width: 108px\n .ql-picker-label::before,\n .ql-picker-item::before\n content: 'Sans Serif'\n .ql-picker-label[data-value=serif]::before,\n .ql-picker-item[data-value=serif]::before\n content: 'Serif'\n .ql-picker-label[data-value=monospace]::before,\n .ql-picker-item[data-value=monospace]::before\n content: 'Monospace'\n .ql-picker-item[data-value=serif]::before\n font-family: Georgia, Times New Roman, serif\n .ql-picker-item[data-value=monospace]::before\n font-family: Monaco, Courier New, monospace\n\n .ql-picker.ql-size\n width: 98px\n .ql-picker-label::before,\n .ql-picker-item::before\n content: 'Normal'\n .ql-picker-label[data-value=small]::before,\n .ql-picker-item[data-value=small]::before\n content: 'Small'\n .ql-picker-label[data-value=large]::before,\n .ql-picker-item[data-value=large]::before\n content: 'Large'\n .ql-picker-label[data-value=huge]::before,\n .ql-picker-item[data-value=huge]::before\n content: 'Huge'\n .ql-picker-item[data-value=small]::before\n font-size: 10px\n .ql-picker-item[data-value=large]::before\n font-size: 18px\n .ql-picker-item[data-value=huge]::before\n font-size: 32px\n\n .ql-color-picker.ql-background\n .ql-picker-item\n background-color: #fff\n .ql-color-picker.ql-color\n .ql-picker-item\n background-color: #000\n\n.ql-code-block-container\n position: relative\n .ql-ui\n right: 5px\n top: 5px\n","arrowWidth = 6px\n\n.ql-bubble\n .ql-toolbar\n .ql-formats\n margin: 8px 12px 8px 0px\n .ql-formats:first-child\n margin-left: 12px\n\n .ql-color-picker\n svg\n margin: 1px\n .ql-picker-item.ql-selected, .ql-picker-item:hover\n border-color: activeColor\n","arrowWidth = 6px\n\n.ql-bubble\n .ql-tooltip\n background-color: backgroundColor\n border-radius: 25px\n color: textColor\n .ql-tooltip-arrow\n border-left: arrowWidth solid transparent\n border-right: arrowWidth solid transparent\n content: \" \"\n display: block\n left: 50%\n margin-left: -1 * arrowWidth\n position: absolute\n .ql-tooltip:not(.ql-flip) .ql-tooltip-arrow\n border-bottom: arrowWidth solid backgroundColor\n top: -1 * arrowWidth\n .ql-tooltip.ql-flip .ql-tooltip-arrow\n border-top: arrowWidth solid backgroundColor\n bottom: -1 * arrowWidth\n\n .ql-tooltip.ql-editing\n .ql-tooltip-editor\n display: block\n .ql-formats\n visibility: hidden\n\n .ql-tooltip-editor\n display: none\n input[type=text]\n background: transparent\n border: none\n color: textColor\n font-size: 13px\n height: 100%\n outline: none\n padding: 10px 20px\n position: absolute\n width: 100%\n a\n &:before\n color: inactiveColor\n content: \"\\00D7\"\n font-size: 16px\n font-weight: bold\n top: 10px\n position: absolute\n right: 20px\n","themeName = 'bubble'\nactiveColor = #fff\nborderColor = #777\nbackgroundColor = #444\ninactiveColor = #ccc\nshadowColor = #ddd\ntextColor = #fff\n\n@import './core'\n@import './base'\n@import './bubble/*'\n\n.ql-container.ql-bubble:not(.ql-disabled)\n a:not(.ql-close)\n position: relative\n white-space: nowrap\n a:not(.ql-close)::before\n background-color: #444\n border-radius: 15px\n top: -5px\n font-size: 12px\n color: #fff\n content: attr(href)\n font-weight: normal\n overflow: hidden\n padding: 5px 15px\n text-decoration: none\n z-index: 1\n a:not(.ql-close)::after\n border-top: 6px solid #444\n border-left: 6px solid transparent\n border-right: 6px solid transparent\n top: 0\n content: \" \"\n height: 0\n width: 0\n a:not(.ql-close)::before, a:not(.ql-close)::after\n left: 0\n margin-left: 50%\n position: absolute\n transform: translate(-50%, -100%)\n transition: visibility 0s ease 200ms\n visibility: hidden\n a:not(.ql-close):hover::before, a:not(.ql-close):hover::after\n visibility: visible\n"],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/public/assets/quill/dist/quill.core.css b/public/assets/quill/dist/quill.core.css new file mode 100644 index 0000000..7e5ab5d --- /dev/null +++ b/public/assets/quill/dist/quill.core.css @@ -0,0 +1,10 @@ +/*! + * Quill Editor v2.0.3 + * https://quilljs.com + * Copyright (c) 2017-2024, Slab + * Copyright (c) 2014, Jason Chen + * Copyright (c) 2013, salesforce.com + */ +.ql-container{box-sizing:border-box;font-family:Helvetica,Arial,sans-serif;font-size:13px;height:100%;margin:0;position:relative}.ql-container.ql-disabled .ql-tooltip{visibility:hidden}.ql-container:not(.ql-disabled) li[data-list=checked] > .ql-ui,.ql-container:not(.ql-disabled) li[data-list=unchecked] > .ql-ui{cursor:pointer}.ql-clipboard{left:-100000px;height:1px;overflow-y:hidden;position:absolute;top:50%}.ql-clipboard p{margin:0;padding:0}.ql-editor{box-sizing:border-box;counter-reset:list-0 list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9;line-height:1.42;height:100%;outline:none;overflow-y:auto;padding:12px 15px;tab-size:4;-moz-tab-size:4;text-align:left;white-space:pre-wrap;word-wrap:break-word}.ql-editor > *{cursor:text}.ql-editor p,.ql-editor ol,.ql-editor pre,.ql-editor blockquote,.ql-editor h1,.ql-editor h2,.ql-editor h3,.ql-editor h4,.ql-editor h5,.ql-editor h6{margin:0;padding:0}@supports (counter-set:none){.ql-editor p,.ql-editor h1,.ql-editor h2,.ql-editor h3,.ql-editor h4,.ql-editor h5,.ql-editor h6{counter-set:list-0 list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9}}@supports not (counter-set:none){.ql-editor p,.ql-editor h1,.ql-editor h2,.ql-editor h3,.ql-editor h4,.ql-editor h5,.ql-editor h6{counter-reset:list-0 list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9}}.ql-editor table{border-collapse:collapse}.ql-editor td{border:1px solid #000;padding:2px 5px}.ql-editor ol{padding-left:1.5em}.ql-editor li{list-style-type:none;padding-left:1.5em;position:relative}.ql-editor li > .ql-ui:before{display:inline-block;margin-left:-1.5em;margin-right:.3em;text-align:right;white-space:nowrap;width:1.2em}.ql-editor li[data-list=checked] > .ql-ui,.ql-editor li[data-list=unchecked] > .ql-ui{color:#777}.ql-editor li[data-list=bullet] > .ql-ui:before{content:'\2022'}.ql-editor li[data-list=checked] > .ql-ui:before{content:'\2611'}.ql-editor li[data-list=unchecked] > .ql-ui:before{content:'\2610'}@supports (counter-set:none){.ql-editor li[data-list]{counter-set:list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9}}@supports not (counter-set:none){.ql-editor li[data-list]{counter-reset:list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9}}.ql-editor li[data-list=ordered]{counter-increment:list-0}.ql-editor li[data-list=ordered] > .ql-ui:before{content:counter(list-0, decimal) '. '}.ql-editor li[data-list=ordered].ql-indent-1{counter-increment:list-1}.ql-editor li[data-list=ordered].ql-indent-1 > .ql-ui:before{content:counter(list-1, lower-alpha) '. '}@supports (counter-set:none){.ql-editor li[data-list].ql-indent-1{counter-set:list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9}}@supports not (counter-set:none){.ql-editor li[data-list].ql-indent-1{counter-reset:list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9}}.ql-editor li[data-list=ordered].ql-indent-2{counter-increment:list-2}.ql-editor li[data-list=ordered].ql-indent-2 > .ql-ui:before{content:counter(list-2, lower-roman) '. '}@supports (counter-set:none){.ql-editor li[data-list].ql-indent-2{counter-set:list-3 list-4 list-5 list-6 list-7 list-8 list-9}}@supports not (counter-set:none){.ql-editor li[data-list].ql-indent-2{counter-reset:list-3 list-4 list-5 list-6 list-7 list-8 list-9}}.ql-editor li[data-list=ordered].ql-indent-3{counter-increment:list-3}.ql-editor li[data-list=ordered].ql-indent-3 > .ql-ui:before{content:counter(list-3, decimal) '. '}@supports (counter-set:none){.ql-editor li[data-list].ql-indent-3{counter-set:list-4 list-5 list-6 list-7 list-8 list-9}}@supports not (counter-set:none){.ql-editor li[data-list].ql-indent-3{counter-reset:list-4 list-5 list-6 list-7 list-8 list-9}}.ql-editor li[data-list=ordered].ql-indent-4{counter-increment:list-4}.ql-editor li[data-list=ordered].ql-indent-4 > .ql-ui:before{content:counter(list-4, lower-alpha) '. '}@supports (counter-set:none){.ql-editor li[data-list].ql-indent-4{counter-set:list-5 list-6 list-7 list-8 list-9}}@supports not (counter-set:none){.ql-editor li[data-list].ql-indent-4{counter-reset:list-5 list-6 list-7 list-8 list-9}}.ql-editor li[data-list=ordered].ql-indent-5{counter-increment:list-5}.ql-editor li[data-list=ordered].ql-indent-5 > .ql-ui:before{content:counter(list-5, lower-roman) '. '}@supports (counter-set:none){.ql-editor li[data-list].ql-indent-5{counter-set:list-6 list-7 list-8 list-9}}@supports not (counter-set:none){.ql-editor li[data-list].ql-indent-5{counter-reset:list-6 list-7 list-8 list-9}}.ql-editor li[data-list=ordered].ql-indent-6{counter-increment:list-6}.ql-editor li[data-list=ordered].ql-indent-6 > .ql-ui:before{content:counter(list-6, decimal) '. '}@supports (counter-set:none){.ql-editor li[data-list].ql-indent-6{counter-set:list-7 list-8 list-9}}@supports not (counter-set:none){.ql-editor li[data-list].ql-indent-6{counter-reset:list-7 list-8 list-9}}.ql-editor li[data-list=ordered].ql-indent-7{counter-increment:list-7}.ql-editor li[data-list=ordered].ql-indent-7 > .ql-ui:before{content:counter(list-7, lower-alpha) '. '}@supports (counter-set:none){.ql-editor li[data-list].ql-indent-7{counter-set:list-8 list-9}}@supports not (counter-set:none){.ql-editor li[data-list].ql-indent-7{counter-reset:list-8 list-9}}.ql-editor li[data-list=ordered].ql-indent-8{counter-increment:list-8}.ql-editor li[data-list=ordered].ql-indent-8 > .ql-ui:before{content:counter(list-8, lower-roman) '. '}@supports (counter-set:none){.ql-editor li[data-list].ql-indent-8{counter-set:list-9}}@supports not (counter-set:none){.ql-editor li[data-list].ql-indent-8{counter-reset:list-9}}.ql-editor li[data-list=ordered].ql-indent-9{counter-increment:list-9}.ql-editor li[data-list=ordered].ql-indent-9 > .ql-ui:before{content:counter(list-9, decimal) '. '}.ql-editor .ql-indent-1:not(.ql-direction-rtl){padding-left:3em}.ql-editor li.ql-indent-1:not(.ql-direction-rtl){padding-left:4.5em}.ql-editor .ql-indent-1.ql-direction-rtl.ql-align-right{padding-right:3em}.ql-editor li.ql-indent-1.ql-direction-rtl.ql-align-right{padding-right:4.5em}.ql-editor .ql-indent-2:not(.ql-direction-rtl){padding-left:6em}.ql-editor li.ql-indent-2:not(.ql-direction-rtl){padding-left:7.5em}.ql-editor .ql-indent-2.ql-direction-rtl.ql-align-right{padding-right:6em}.ql-editor li.ql-indent-2.ql-direction-rtl.ql-align-right{padding-right:7.5em}.ql-editor .ql-indent-3:not(.ql-direction-rtl){padding-left:9em}.ql-editor li.ql-indent-3:not(.ql-direction-rtl){padding-left:10.5em}.ql-editor .ql-indent-3.ql-direction-rtl.ql-align-right{padding-right:9em}.ql-editor li.ql-indent-3.ql-direction-rtl.ql-align-right{padding-right:10.5em}.ql-editor .ql-indent-4:not(.ql-direction-rtl){padding-left:12em}.ql-editor li.ql-indent-4:not(.ql-direction-rtl){padding-left:13.5em}.ql-editor .ql-indent-4.ql-direction-rtl.ql-align-right{padding-right:12em}.ql-editor li.ql-indent-4.ql-direction-rtl.ql-align-right{padding-right:13.5em}.ql-editor .ql-indent-5:not(.ql-direction-rtl){padding-left:15em}.ql-editor li.ql-indent-5:not(.ql-direction-rtl){padding-left:16.5em}.ql-editor .ql-indent-5.ql-direction-rtl.ql-align-right{padding-right:15em}.ql-editor li.ql-indent-5.ql-direction-rtl.ql-align-right{padding-right:16.5em}.ql-editor .ql-indent-6:not(.ql-direction-rtl){padding-left:18em}.ql-editor li.ql-indent-6:not(.ql-direction-rtl){padding-left:19.5em}.ql-editor .ql-indent-6.ql-direction-rtl.ql-align-right{padding-right:18em}.ql-editor li.ql-indent-6.ql-direction-rtl.ql-align-right{padding-right:19.5em}.ql-editor .ql-indent-7:not(.ql-direction-rtl){padding-left:21em}.ql-editor li.ql-indent-7:not(.ql-direction-rtl){padding-left:22.5em}.ql-editor .ql-indent-7.ql-direction-rtl.ql-align-right{padding-right:21em}.ql-editor li.ql-indent-7.ql-direction-rtl.ql-align-right{padding-right:22.5em}.ql-editor .ql-indent-8:not(.ql-direction-rtl){padding-left:24em}.ql-editor li.ql-indent-8:not(.ql-direction-rtl){padding-left:25.5em}.ql-editor .ql-indent-8.ql-direction-rtl.ql-align-right{padding-right:24em}.ql-editor li.ql-indent-8.ql-direction-rtl.ql-align-right{padding-right:25.5em}.ql-editor .ql-indent-9:not(.ql-direction-rtl){padding-left:27em}.ql-editor li.ql-indent-9:not(.ql-direction-rtl){padding-left:28.5em}.ql-editor .ql-indent-9.ql-direction-rtl.ql-align-right{padding-right:27em}.ql-editor li.ql-indent-9.ql-direction-rtl.ql-align-right{padding-right:28.5em}.ql-editor li.ql-direction-rtl{padding-right:1.5em}.ql-editor li.ql-direction-rtl > .ql-ui:before{margin-left:.3em;margin-right:-1.5em;text-align:left}.ql-editor table{table-layout:fixed;width:100%}.ql-editor table td{outline:none}.ql-editor .ql-code-block-container{font-family:monospace}.ql-editor .ql-video{display:block;max-width:100%}.ql-editor .ql-video.ql-align-center{margin:0 auto}.ql-editor .ql-video.ql-align-right{margin:0 0 0 auto}.ql-editor .ql-bg-black{background-color:#000}.ql-editor .ql-bg-red{background-color:#e60000}.ql-editor .ql-bg-orange{background-color:#f90}.ql-editor .ql-bg-yellow{background-color:#ff0}.ql-editor .ql-bg-green{background-color:#008a00}.ql-editor .ql-bg-blue{background-color:#06c}.ql-editor .ql-bg-purple{background-color:#93f}.ql-editor .ql-color-white{color:#fff}.ql-editor .ql-color-red{color:#e60000}.ql-editor .ql-color-orange{color:#f90}.ql-editor .ql-color-yellow{color:#ff0}.ql-editor .ql-color-green{color:#008a00}.ql-editor .ql-color-blue{color:#06c}.ql-editor .ql-color-purple{color:#93f}.ql-editor .ql-font-serif{font-family:Georgia,Times New Roman,serif}.ql-editor .ql-font-monospace{font-family:Monaco,Courier New,monospace}.ql-editor .ql-size-small{font-size:.75em}.ql-editor .ql-size-large{font-size:1.5em}.ql-editor .ql-size-huge{font-size:2.5em}.ql-editor .ql-direction-rtl{direction:rtl;text-align:inherit}.ql-editor .ql-align-center{text-align:center}.ql-editor .ql-align-justify{text-align:justify}.ql-editor .ql-align-right{text-align:right}.ql-editor .ql-ui{position:absolute}.ql-editor.ql-blank::before{color:rgba(0,0,0,0.6);content:attr(data-placeholder);font-style:italic;left:15px;pointer-events:none;position:absolute;right:15px} + +/*# sourceMappingURL=quill.core.css.map*/ \ No newline at end of file diff --git a/public/assets/quill/dist/quill.core.css.map b/public/assets/quill/dist/quill.core.css.map new file mode 100644 index 0000000..49557c6 --- /dev/null +++ b/public/assets/quill/dist/quill.core.css.map @@ -0,0 +1 @@ +{"version":3,"file":"quill.core.css","mappings":"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","sources":["webpack://Quill/./src/assets/core.styl"],"sourcesContent":["// Styles necessary for Quill\n\nLIST_STYLE = decimal lower-alpha lower-roman\nLIST_STYLE_WIDTH = 1.2em\nLIST_STYLE_MARGIN = 0.3em\nLIST_STYLE_OUTER_WIDTH = LIST_STYLE_MARGIN + LIST_STYLE_WIDTH\nMAX_INDENT = 9\n\nresets(arr)\n unquote('list-' + join(' list-', arr))\n\n.ql-container\n box-sizing: border-box\n font-family: Helvetica, Arial, sans-serif\n font-size: 13px\n height: 100%\n margin: 0px\n position: relative\n\n.ql-container.ql-disabled\n .ql-tooltip\n visibility: hidden\n\n.ql-container:not(.ql-disabled)\n li[data-list=checked],\n li[data-list=unchecked]\n > .ql-ui\n cursor: pointer\n\n.ql-clipboard\n left: -100000px\n height: 1px\n overflow-y: hidden\n position: absolute\n top: 50%\n p\n margin: 0\n padding: 0\n\n.ql-editor\n box-sizing: border-box\n counter-reset: resets(0..MAX_INDENT)\n line-height: 1.42\n height: 100%\n outline: none\n overflow-y: auto\n padding: 12px 15px\n tab-size: 4\n -moz-tab-size: 4\n text-align: left\n white-space: pre-wrap\n word-wrap: break-word\n > *\n cursor: text\n\n p, ol, pre, blockquote, h1, h2, h3, h4, h5, h6\n margin: 0\n padding: 0\n p, h1, h2, h3, h4, h5, h6\n @supports (counter-set: none)\n counter-set: resets(0..MAX_INDENT)\n @supports not (counter-set: none)\n counter-reset: resets(0..MAX_INDENT)\n table\n border-collapse: collapse\n td\n border: 1px solid #000\n padding: 2px 5px\n ol\n padding-left: 1.5em\n li\n list-style-type: none\n padding-left: LIST_STYLE_OUTER_WIDTH\n position: relative\n\n > .ql-ui:before\n display: inline-block\n margin-left: -1*LIST_STYLE_OUTER_WIDTH\n margin-right: LIST_STYLE_MARGIN\n text-align: right\n white-space: nowrap\n width: LIST_STYLE_WIDTH\n\n li[data-list=checked],\n li[data-list=unchecked]\n > .ql-ui\n color: #777\n\n li[data-list=bullet] > .ql-ui:before\n content: '\\2022'\n li[data-list=checked] > .ql-ui:before\n content: '\\2611'\n li[data-list=unchecked] > .ql-ui:before\n content: '\\2610'\n\n li[data-list]\n @supports (counter-set: none)\n counter-set: resets(1..MAX_INDENT)\n @supports not (counter-set: none)\n counter-reset: resets(1..MAX_INDENT)\n\n li[data-list=ordered]\n counter-increment: list-0\n > .ql-ui:before\n content: unquote('counter(list-0, ' + LIST_STYLE[0] + ')') '. '\n for num in (1..MAX_INDENT)\n li[data-list=ordered].ql-indent-{num}\n counter-increment: unquote('list-' + num)\n > .ql-ui:before\n content: unquote('counter(list-' + num + ', ' + LIST_STYLE[num%3] + ')') '. '\n if (num < MAX_INDENT)\n li[data-list].ql-indent-{num}\n @supports (counter-set: none)\n counter-set: resets((num+1)..MAX_INDENT)\n @supports not (counter-set: none)\n counter-reset: resets((num+1)..MAX_INDENT)\n\n for num in (1..MAX_INDENT)\n .ql-indent-{num}:not(.ql-direction-rtl)\n padding-left: (3*num)em\n li.ql-indent-{num}:not(.ql-direction-rtl)\n padding-left: (3*num + LIST_STYLE_OUTER_WIDTH)em\n .ql-indent-{num}.ql-direction-rtl.ql-align-right\n padding-right: (3*num)em\n li.ql-indent-{num}.ql-direction-rtl.ql-align-right\n padding-right: (3*num + LIST_STYLE_OUTER_WIDTH)em\n\n li.ql-direction-rtl\n padding-right: LIST_STYLE_OUTER_WIDTH\n > .ql-ui:before\n margin-left: LIST_STYLE_MARGIN\n margin-right: -1*LIST_STYLE_OUTER_WIDTH\n text-align: left\n\n table\n table-layout: fixed\n width: 100%\n td\n outline: none\n\n .ql-code-block-container\n font-family: monospace\n\n .ql-video\n display: block\n max-width: 100%\n .ql-video.ql-align-center\n margin: 0 auto\n .ql-video.ql-align-right\n margin: 0 0 0 auto\n\n .ql-bg-black\n background-color: rgb(0,0,0)\n .ql-bg-red\n background-color: rgb(230,0,0)\n .ql-bg-orange\n background-color: rgb(255,153,0)\n .ql-bg-yellow\n background-color: rgb(255,255,0)\n .ql-bg-green\n background-color: rgb(0,138,0)\n .ql-bg-blue\n background-color: rgb(0,102,204)\n .ql-bg-purple\n background-color: rgb(153,51,255)\n\n .ql-color-white\n color: rgb(255,255,255)\n .ql-color-red\n color: rgb(230,0,0)\n .ql-color-orange\n color: rgb(255,153,0)\n .ql-color-yellow\n color: rgb(255,255,0)\n .ql-color-green\n color: rgb(0,138,0)\n .ql-color-blue\n color: rgb(0,102,204)\n .ql-color-purple\n color: rgb(153,51,255)\n\n .ql-font-serif\n font-family: Georgia, Times New Roman, serif\n .ql-font-monospace\n font-family: Monaco, Courier New, monospace\n\n .ql-size-small\n font-size: 0.75em\n .ql-size-large\n font-size: 1.5em\n .ql-size-huge\n font-size: 2.5em\n\n .ql-direction-rtl\n direction: rtl\n text-align: inherit\n\n .ql-align-center\n text-align: center\n .ql-align-justify\n text-align: justify\n .ql-align-right\n text-align: right\n\n .ql-ui\n position: absolute\n\n.ql-editor.ql-blank::before\n color: rgba(0,0,0,0.6)\n content: attr(data-placeholder)\n font-style: italic\n left: 15px\n pointer-events: none\n position: absolute\n right: 15px\n"],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/public/assets/quill/dist/quill.core.js b/public/assets/quill/dist/quill.core.js new file mode 100644 index 0000000..2869a7a --- /dev/null +++ b/public/assets/quill/dist/quill.core.js @@ -0,0 +1,3 @@ +/*! For license information please see quill.core.js.LICENSE.txt */ +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.Quill=e():t.Quill=e()}(self,(function(){return function(){var t={9698:function(t,e,n){"use strict";n.d(e,{Ay:function(){return c},Ji:function(){return h},zo:function(){return u}});var r=n(6003),i=n(5232),s=n.n(i),o=n(3036),l=n(4850),a=n(5508);class c extends r.BlockBlot{cache={};delta(){return null==this.cache.delta&&(this.cache.delta=function(t){let e=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];return t.descendants(r.LeafBlot).reduce(((t,n)=>0===n.length()?t:t.insert(n.value(),h(n,{},e))),new(s())).insert("\n",h(t))}(this)),this.cache.delta}deleteAt(t,e){super.deleteAt(t,e),this.cache={}}formatAt(t,e,n,i){e<=0||(this.scroll.query(n,r.Scope.BLOCK)?t+e===this.length()&&this.format(n,i):super.formatAt(t,Math.min(e,this.length()-t-1),n,i),this.cache={})}insertAt(t,e,n){if(null!=n)return super.insertAt(t,e,n),void(this.cache={});if(0===e.length)return;const r=e.split("\n"),i=r.shift();i.length>0&&(t(s=s.split(t,!0),s.insertAt(0,e),e.length)),t+i.length)}insertBefore(t,e){const{head:n}=this.children;super.insertBefore(t,e),n instanceof o.A&&n.remove(),this.cache={}}length(){return null==this.cache.length&&(this.cache.length=super.length()+1),this.cache.length}moveChildren(t,e){super.moveChildren(t,e),this.cache={}}optimize(t){super.optimize(t),this.cache={}}path(t){return super.path(t,!0)}removeChild(t){super.removeChild(t),this.cache={}}split(t){let e=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(e&&(0===t||t>=this.length()-1)){const e=this.clone();return 0===t?(this.parent.insertBefore(e,this),this):(this.parent.insertBefore(e,this.next),e)}const n=super.split(t,e);return this.cache={},n}}c.blotName="block",c.tagName="P",c.defaultChild=o.A,c.allowedChildren=[o.A,l.A,r.EmbedBlot,a.A];class u extends r.EmbedBlot{attach(){super.attach(),this.attributes=new r.AttributorStore(this.domNode)}delta(){return(new(s())).insert(this.value(),{...this.formats(),...this.attributes.values()})}format(t,e){const n=this.scroll.query(t,r.Scope.BLOCK_ATTRIBUTE);null!=n&&this.attributes.attribute(n,e)}formatAt(t,e,n,r){this.format(n,r)}insertAt(t,e,n){if(null!=n)return void super.insertAt(t,e,n);const r=e.split("\n"),i=r.pop(),s=r.map((t=>{const e=this.scroll.create(c.blotName);return e.insertAt(0,t),e})),o=this.split(t);s.forEach((t=>{this.parent.insertBefore(t,o)})),i&&this.parent.insertBefore(this.scroll.create("text",i),o)}}function h(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=!(arguments.length>2&&void 0!==arguments[2])||arguments[2];return null==t?e:("formats"in t&&"function"==typeof t.formats&&(e={...e,...t.formats()},n&&delete e["code-token"]),null==t.parent||"scroll"===t.parent.statics.blotName||t.parent.statics.scope!==t.statics.scope?e:h(t.parent,e,n))}u.scope=r.Scope.BLOCK_BLOT},3036:function(t,e,n){"use strict";var r=n(6003);class i extends r.EmbedBlot{static value(){}optimize(){(this.prev||this.next)&&this.remove()}length(){return 0}value(){return""}}i.blotName="break",i.tagName="BR",e.A=i},580:function(t,e,n){"use strict";var r=n(6003);class i extends r.ContainerBlot{}e.A=i},4541:function(t,e,n){"use strict";var r=n(6003),i=n(5508);class s extends r.EmbedBlot{static blotName="cursor";static className="ql-cursor";static tagName="span";static CONTENTS="\ufeff";static value(){}constructor(t,e,n){super(t,e),this.selection=n,this.textNode=document.createTextNode(s.CONTENTS),this.domNode.appendChild(this.textNode),this.savedLength=0}detach(){null!=this.parent&&this.parent.removeChild(this)}format(t,e){if(0!==this.savedLength)return void super.format(t,e);let n=this,i=0;for(;null!=n&&n.statics.scope!==r.Scope.BLOCK_BLOT;)i+=n.offset(n.parent),n=n.parent;null!=n&&(this.savedLength=s.CONTENTS.length,n.optimize(),n.formatAt(i,s.CONTENTS.length,t,e),this.savedLength=0)}index(t,e){return t===this.textNode?0:super.index(t,e)}length(){return this.savedLength}position(){return[this.textNode,this.textNode.data.length]}remove(){super.remove(),this.parent=null}restore(){if(this.selection.composing||null==this.parent)return null;const t=this.selection.getNativeRange();for(;null!=this.domNode.lastChild&&this.domNode.lastChild!==this.textNode;)this.domNode.parentNode.insertBefore(this.domNode.lastChild,this.domNode);const e=this.prev instanceof i.A?this.prev:null,n=e?e.length():0,r=this.next instanceof i.A?this.next:null,o=r?r.text:"",{textNode:l}=this,a=l.data.split(s.CONTENTS).join("");let c;if(l.data=s.CONTENTS,e)c=e,(a||r)&&(e.insertAt(e.length(),a+o),r&&r.remove());else if(r)c=r,r.insertAt(0,a);else{const t=document.createTextNode(a);c=this.scroll.create(t),this.parent.insertBefore(c,this)}if(this.remove(),t){const i=(t,i)=>e&&t===e.domNode?i:t===l?n+i-1:r&&t===r.domNode?n+a.length+i:null,s=i(t.start.node,t.start.offset),o=i(t.end.node,t.end.offset);if(null!==s&&null!==o)return{startNode:c.domNode,startOffset:s,endNode:c.domNode,endOffset:o}}return null}update(t,e){if(t.some((t=>"characterData"===t.type&&t.target===this.textNode))){const t=this.restore();t&&(e.range=t)}}optimize(t){super.optimize(t);let{parent:e}=this;for(;e;){if("A"===e.domNode.tagName){this.savedLength=s.CONTENTS.length,e.isolate(this.offset(e),this.length()).unwrap(),this.savedLength=0;break}e=e.parent}}value(){return""}}e.A=s},746:function(t,e,n){"use strict";var r=n(6003),i=n(5508);const s="\ufeff";class o extends r.EmbedBlot{constructor(t,e){super(t,e),this.contentNode=document.createElement("span"),this.contentNode.setAttribute("contenteditable","false"),Array.from(this.domNode.childNodes).forEach((t=>{this.contentNode.appendChild(t)})),this.leftGuard=document.createTextNode(s),this.rightGuard=document.createTextNode(s),this.domNode.appendChild(this.leftGuard),this.domNode.appendChild(this.contentNode),this.domNode.appendChild(this.rightGuard)}index(t,e){return t===this.leftGuard?0:t===this.rightGuard?1:super.index(t,e)}restore(t){let e,n=null;const r=t.data.split(s).join("");if(t===this.leftGuard)if(this.prev instanceof i.A){const t=this.prev.length();this.prev.insertAt(t,r),n={startNode:this.prev.domNode,startOffset:t+r.length}}else e=document.createTextNode(r),this.parent.insertBefore(this.scroll.create(e),this),n={startNode:e,startOffset:r.length};else t===this.rightGuard&&(this.next instanceof i.A?(this.next.insertAt(0,r),n={startNode:this.next.domNode,startOffset:r.length}):(e=document.createTextNode(r),this.parent.insertBefore(this.scroll.create(e),this.next),n={startNode:e,startOffset:r.length}));return t.data=s,n}update(t,e){t.forEach((t=>{if("characterData"===t.type&&(t.target===this.leftGuard||t.target===this.rightGuard)){const n=this.restore(t.target);n&&(e.range=n)}}))}}e.A=o},4850:function(t,e,n){"use strict";var r=n(6003),i=n(3036),s=n(5508);class o extends r.InlineBlot{static allowedChildren=[o,i.A,r.EmbedBlot,s.A];static order=["cursor","inline","link","underline","strike","italic","bold","script","code"];static compare(t,e){const n=o.order.indexOf(t),r=o.order.indexOf(e);return n>=0||r>=0?n-r:t===e?0:t0){const t=this.parent.isolate(this.offset(),this.length());this.moveChildren(t),t.wrap(this)}}}e.A=o},5508:function(t,e,n){"use strict";n.d(e,{A:function(){return i},X:function(){return o}});var r=n(6003);class i extends r.TextBlot{}const s={"&":"&","<":"<",">":">",'"':""","'":"'"};function o(t){return t.replace(/[&<>"']/g,(t=>s[t]))}},5374:function(t,e,n){"use strict";n.d(e,{A:function(){return o}});var r=n(8920),i=n(7356);const s=(0,n(6078).A)("quill:events");["selectionchange","mousedown","mouseup","click"].forEach((t=>{document.addEventListener(t,(function(){for(var t=arguments.length,e=new Array(t),n=0;n{const n=i.A.get(t);n&&n.emitter&&n.emitter.handleDOM(...e)}))}))}));var o=class extends r{static events={EDITOR_CHANGE:"editor-change",SCROLL_BEFORE_UPDATE:"scroll-before-update",SCROLL_BLOT_MOUNT:"scroll-blot-mount",SCROLL_BLOT_UNMOUNT:"scroll-blot-unmount",SCROLL_OPTIMIZE:"scroll-optimize",SCROLL_UPDATE:"scroll-update",SCROLL_EMBED_UPDATE:"scroll-embed-update",SELECTION_CHANGE:"selection-change",TEXT_CHANGE:"text-change",COMPOSITION_BEFORE_START:"composition-before-start",COMPOSITION_START:"composition-start",COMPOSITION_BEFORE_END:"composition-before-end",COMPOSITION_END:"composition-end"};static sources={API:"api",SILENT:"silent",USER:"user"};constructor(){super(),this.domListeners={},this.on("error",s.error)}emit(){for(var t=arguments.length,e=new Array(t),n=0;n1?e-1:0),r=1;r{let{node:r,handler:i}=e;(t.target===r||r.contains(t.target))&&i(t,...n)}))}listenDOM(t,e,n){this.domListeners[t]||(this.domListeners[t]=[]),this.domListeners[t].push({node:e,handler:n})}}},7356:function(t,e){"use strict";e.A=new WeakMap},6078:function(t,e){"use strict";const n=["error","warn","log","info"];let r="warn";function i(t){if(r&&n.indexOf(t)<=n.indexOf(r)){for(var e=arguments.length,i=new Array(e>1?e-1:0),s=1;s(e[n]=i.bind(console,n,t),e)),{})}s.level=t=>{r=t},i.level=s.level,e.A=s},4266:function(t,e){"use strict";e.A=class{static DEFAULTS={};constructor(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};this.quill=t,this.options=e}}},6142:function(t,e,n){"use strict";n.d(e,{Ay:function(){return q}});var r=n(8347),i=n(6003),s=n(5232),o=n.n(s),l=n(3707),a=n(5123),c=n(9698),u=n(3036),h=n(4541),f=n(5508),d=n(8298);const p=/^[ -~]*$/;function g(t,e,n){if(0===t.length){const[t]=y(n.pop());return e<=0?``:`${g([],e-1,n)}`}const[{child:r,offset:i,length:s,indent:o,type:l},...a]=t,[c,u]=y(l);if(o>e)return n.push(l),o===e+1?`<${c}>${m(r,i,s)}${g(a,o,n)}`:`<${c}>
  • ${g(t,e+1,n)}`;const h=n[n.length-1];if(o===e&&l===h)return`
  • ${m(r,i,s)}${g(a,o,n)}`;const[f]=y(n.pop());return`${g(t,e-1,n)}`}function m(t,e,n){let r=arguments.length>3&&void 0!==arguments[3]&&arguments[3];if("html"in t&&"function"==typeof t.html)return t.html(e,n);if(t instanceof f.A)return(0,f.X)(t.value().slice(e,e+n)).replaceAll(" "," ");if(t instanceof i.ParentBlot){if("list-container"===t.statics.blotName){const r=[];return t.children.forEachAt(e,n,((t,e,n)=>{const i="formats"in t&&"function"==typeof t.formats?t.formats():{};r.push({child:t,offset:e,length:n,indent:i.indent||0,type:i.list})})),g(r,-1,[])}const i=[];if(t.children.forEachAt(e,n,((t,e,n)=>{i.push(m(t,e,n))})),r||"list"===t.statics.blotName)return i.join("");const{outerHTML:s,innerHTML:o}=t.domNode,[l,a]=s.split(`>${o}<`);return"${i.join("")}<${a}`:`${l}>${i.join("")}<${a}`}return t.domNode instanceof Element?t.domNode.outerHTML:""}function b(t,e){return Object.keys(e).reduce(((n,r)=>{if(null==t[r])return n;const i=e[r];return i===t[r]?n[r]=i:Array.isArray(i)?i.indexOf(t[r])<0?n[r]=i.concat([t[r]]):n[r]=i:n[r]=[i,t[r]],n}),{})}function y(t){const e="ordered"===t?"ol":"ul";switch(t){case"checked":return[e,' data-list="checked"'];case"unchecked":return[e,' data-list="unchecked"'];default:return[e,""]}}function v(t){return t.reduce(((t,e)=>{if("string"==typeof e.insert){const n=e.insert.replace(/\r\n/g,"\n").replace(/\r/g,"\n");return t.insert(n,e.attributes)}return t.push(e)}),new(o()))}function A(t,e){let{index:n,length:r}=t;return new d.Q(n+e,r)}var N=class{constructor(t){this.scroll=t,this.delta=this.getDelta()}applyDelta(t){this.scroll.update();let e=this.scroll.length();this.scroll.batchStart();const n=v(t),l=new(o());return function(t){const e=[];return t.forEach((t=>{"string"==typeof t.insert?t.insert.split("\n").forEach(((n,r)=>{r&&e.push({insert:"\n",attributes:t.attributes}),n&&e.push({insert:n,attributes:t.attributes})})):e.push(t)})),e}(n.ops.slice()).reduce(((t,n)=>{const o=s.Op.length(n);let a=n.attributes||{},u=!1,h=!1;if(null!=n.insert){if(l.retain(o),"string"==typeof n.insert){const o=n.insert;h=!o.endsWith("\n")&&(e<=t||!!this.scroll.descendant(c.zo,t)[0]),this.scroll.insertAt(t,o);const[l,u]=this.scroll.line(t);let f=(0,r.A)({},(0,c.Ji)(l));if(l instanceof c.Ay){const[t]=l.descendant(i.LeafBlot,u);t&&(f=(0,r.A)(f,(0,c.Ji)(t)))}a=s.AttributeMap.diff(f,a)||{}}else if("object"==typeof n.insert){const o=Object.keys(n.insert)[0];if(null==o)return t;const l=null!=this.scroll.query(o,i.Scope.INLINE);if(l)(e<=t||this.scroll.descendant(c.zo,t)[0])&&(h=!0);else if(t>0){const[e,n]=this.scroll.descendant(i.LeafBlot,t-1);e instanceof f.A?"\n"!==e.value()[n]&&(u=!0):e instanceof i.EmbedBlot&&e.statics.scope===i.Scope.INLINE_BLOT&&(u=!0)}if(this.scroll.insertAt(t,o,n.insert[o]),l){const[e]=this.scroll.descendant(i.LeafBlot,t);if(e){const t=(0,r.A)({},(0,c.Ji)(e));a=s.AttributeMap.diff(t,a)||{}}}}e+=o}else if(l.push(n),null!==n.retain&&"object"==typeof n.retain){const e=Object.keys(n.retain)[0];if(null==e)return t;this.scroll.updateEmbedAt(t,e,n.retain[e])}Object.keys(a).forEach((e=>{this.scroll.formatAt(t,o,e,a[e])}));const d=u?1:0,p=h?1:0;return e+=d+p,l.retain(d),l.delete(p),t+o+d+p}),0),l.reduce(((t,e)=>"number"==typeof e.delete?(this.scroll.deleteAt(t,e.delete),t):t+s.Op.length(e)),0),this.scroll.batchEnd(),this.scroll.optimize(),this.update(n)}deleteText(t,e){return this.scroll.deleteAt(t,e),this.update((new(o())).retain(t).delete(e))}formatLine(t,e){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};this.scroll.update(),Object.keys(n).forEach((r=>{this.scroll.lines(t,Math.max(e,1)).forEach((t=>{t.format(r,n[r])}))})),this.scroll.optimize();const r=(new(o())).retain(t).retain(e,(0,l.A)(n));return this.update(r)}formatText(t,e){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};Object.keys(n).forEach((r=>{this.scroll.formatAt(t,e,r,n[r])}));const r=(new(o())).retain(t).retain(e,(0,l.A)(n));return this.update(r)}getContents(t,e){return this.delta.slice(t,t+e)}getDelta(){return this.scroll.lines().reduce(((t,e)=>t.concat(e.delta())),new(o()))}getFormat(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=[],r=[];0===e?this.scroll.path(t).forEach((t=>{const[e]=t;e instanceof c.Ay?n.push(e):e instanceof i.LeafBlot&&r.push(e)})):(n=this.scroll.lines(t,e),r=this.scroll.descendants(i.LeafBlot,t,e));const[s,o]=[n,r].map((t=>{const e=t.shift();if(null==e)return{};let n=(0,c.Ji)(e);for(;Object.keys(n).length>0;){const e=t.shift();if(null==e)return n;n=b((0,c.Ji)(e),n)}return n}));return{...s,...o}}getHTML(t,e){const[n,r]=this.scroll.line(t);if(n){const i=n.length();return n.length()>=r+e&&(0!==r||e!==i)?m(n,r,e,!0):m(this.scroll,t,e,!0)}return""}getText(t,e){return this.getContents(t,e).filter((t=>"string"==typeof t.insert)).map((t=>t.insert)).join("")}insertContents(t,e){const n=v(e),r=(new(o())).retain(t).concat(n);return this.scroll.insertContents(t,n),this.update(r)}insertEmbed(t,e,n){return this.scroll.insertAt(t,e,n),this.update((new(o())).retain(t).insert({[e]:n}))}insertText(t,e){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return e=e.replace(/\r\n/g,"\n").replace(/\r/g,"\n"),this.scroll.insertAt(t,e),Object.keys(n).forEach((r=>{this.scroll.formatAt(t,e.length,r,n[r])})),this.update((new(o())).retain(t).insert(e,(0,l.A)(n)))}isBlank(){if(0===this.scroll.children.length)return!0;if(this.scroll.children.length>1)return!1;const t=this.scroll.children.head;if(t?.statics.blotName!==c.Ay.blotName)return!1;const e=t;return!(e.children.length>1)&&e.children.head instanceof u.A}removeFormat(t,e){const n=this.getText(t,e),[r,i]=this.scroll.line(t+e);let s=0,l=new(o());null!=r&&(s=r.length()-i,l=r.delta().slice(i,i+s-1).insert("\n"));const a=this.getContents(t,e+s).diff((new(o())).insert(n).concat(l)),c=(new(o())).retain(t).concat(a);return this.applyDelta(c)}update(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:void 0;const r=this.delta;if(1===e.length&&"characterData"===e[0].type&&e[0].target.data.match(p)&&this.scroll.find(e[0].target)){const i=this.scroll.find(e[0].target),s=(0,c.Ji)(i),l=i.offset(this.scroll),a=e[0].oldValue.replace(h.A.CONTENTS,""),u=(new(o())).insert(a),f=(new(o())).insert(i.value()),d=n&&{oldRange:A(n.oldRange,-l),newRange:A(n.newRange,-l)};t=(new(o())).retain(l).concat(u.diff(f,d)).reduce(((t,e)=>e.insert?t.insert(e.insert,s):t.push(e)),new(o())),this.delta=r.compose(t)}else this.delta=this.getDelta(),t&&(0,a.A)(r.compose(t),this.delta)||(t=r.diff(this.delta,n));return t}},E=n(5374),_=n(7356),x=n(6078),w=n(4266),O=n(746),j=class{isComposing=!1;constructor(t,e){this.scroll=t,this.emitter=e,this.setupListeners()}setupListeners(){this.scroll.domNode.addEventListener("compositionstart",(t=>{this.isComposing||this.handleCompositionStart(t)})),this.scroll.domNode.addEventListener("compositionend",(t=>{this.isComposing&&queueMicrotask((()=>{this.handleCompositionEnd(t)}))}))}handleCompositionStart(t){const e=t.target instanceof Node?this.scroll.find(t.target,!0):null;!e||e instanceof O.A||(this.emitter.emit(E.A.events.COMPOSITION_BEFORE_START,t),this.scroll.batchStart(),this.emitter.emit(E.A.events.COMPOSITION_START,t),this.isComposing=!0)}handleCompositionEnd(t){this.emitter.emit(E.A.events.COMPOSITION_BEFORE_END,t),this.scroll.batchEnd(),this.emitter.emit(E.A.events.COMPOSITION_END,t),this.isComposing=!1}},S=n(9609);const L=t=>{const e=t.getBoundingClientRect(),n="offsetWidth"in t&&Math.abs(e.width)/t.offsetWidth||1,r="offsetHeight"in t&&Math.abs(e.height)/t.offsetHeight||1;return{top:e.top,right:e.left+t.clientWidth*n,bottom:e.top+t.clientHeight*r,left:e.left}},T=t=>{const e=parseInt(t,10);return Number.isNaN(e)?0:e},k=(t,e,n,r,i,s)=>tr?0:tr?e-t>r-n?t+i-n:e-r+s:0;const C=["block","break","cursor","inline","scroll","text"];const R=(0,x.A)("quill"),B=new i.Registry;i.ParentBlot.uiClass="ql-ui";class q{static DEFAULTS={bounds:null,modules:{clipboard:!0,keyboard:!0,history:!0,uploader:!0},placeholder:"",readOnly:!1,registry:B,theme:"default"};static events=E.A.events;static sources=E.A.sources;static version="2.0.3";static imports={delta:o(),parchment:i,"core/module":w.A,"core/theme":S.A};static debug(t){!0===t&&(t="log"),x.A.level(t)}static find(t){let e=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return _.A.get(t)||B.find(t,e)}static import(t){return null==this.imports[t]&&R.error(`Cannot import ${t}. Are you sure it was registered?`),this.imports[t]}static register(){if("string"!=typeof(arguments.length<=0?void 0:arguments[0])){const t=arguments.length<=0?void 0:arguments[0],e=!!(arguments.length<=1?void 0:arguments[1]),n="attrName"in t?t.attrName:t.blotName;"string"==typeof n?this.register(`formats/${n}`,t,e):Object.keys(t).forEach((n=>{this.register(n,t[n],e)}))}else{const t=arguments.length<=0?void 0:arguments[0],e=arguments.length<=1?void 0:arguments[1],n=!!(arguments.length<=2?void 0:arguments[2]);null==this.imports[t]||n||R.warn(`Overwriting ${t} with`,e),this.imports[t]=e,(t.startsWith("blots/")||t.startsWith("formats/"))&&e&&"boolean"!=typeof e&&"abstract"!==e.blotName&&B.register(e),"function"==typeof e.register&&e.register(B)}}constructor(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(this.options=function(t,e){const n=I(t);if(!n)throw new Error("Invalid Quill container");const s=!e.theme||e.theme===q.DEFAULTS.theme?S.A:q.import(`themes/${e.theme}`);if(!s)throw new Error(`Invalid theme ${e.theme}. Did you register it?`);const{modules:o,...l}=q.DEFAULTS,{modules:a,...c}=s.DEFAULTS;let u=M(e.modules);null!=u&&u.toolbar&&u.toolbar.constructor!==Object&&(u={...u,toolbar:{container:u.toolbar}});const h=(0,r.A)({},M(o),M(a),u),f={...l,...D(c),...D(e)};let d=e.registry;return d?e.formats&&R.warn('Ignoring "formats" option because "registry" is specified'):d=e.formats?((t,e,n)=>{const r=new i.Registry;return C.forEach((t=>{const n=e.query(t);n&&r.register(n)})),t.forEach((t=>{let i=e.query(t);i||n.error(`Cannot register "${t}" specified in "formats" config. Are you sure it was registered?`);let s=0;for(;i;)if(r.register(i),i="blotName"in i?i.requiredContainer??null:null,s+=1,s>100){n.error(`Cycle detected in registering blot requiredContainer: "${t}"`);break}})),r})(e.formats,f.registry,R):f.registry,{...f,registry:d,container:n,theme:s,modules:Object.entries(h).reduce(((t,e)=>{let[n,i]=e;if(!i)return t;const s=q.import(`modules/${n}`);return null==s?(R.error(`Cannot load ${n} module. Are you sure you registered it?`),t):{...t,[n]:(0,r.A)({},s.DEFAULTS||{},i)}}),{}),bounds:I(f.bounds)}}(t,e),this.container=this.options.container,null==this.container)return void R.error("Invalid Quill container",t);this.options.debug&&q.debug(this.options.debug);const n=this.container.innerHTML.trim();this.container.classList.add("ql-container"),this.container.innerHTML="",_.A.set(this.container,this),this.root=this.addContainer("ql-editor"),this.root.classList.add("ql-blank"),this.emitter=new E.A;const s=i.ScrollBlot.blotName,l=this.options.registry.query(s);if(!l||!("blotName"in l))throw new Error(`Cannot initialize Quill without "${s}" blot`);if(this.scroll=new l(this.options.registry,this.root,{emitter:this.emitter}),this.editor=new N(this.scroll),this.selection=new d.A(this.scroll,this.emitter),this.composition=new j(this.scroll,this.emitter),this.theme=new this.options.theme(this,this.options),this.keyboard=this.theme.addModule("keyboard"),this.clipboard=this.theme.addModule("clipboard"),this.history=this.theme.addModule("history"),this.uploader=this.theme.addModule("uploader"),this.theme.addModule("input"),this.theme.addModule("uiNode"),this.theme.init(),this.emitter.on(E.A.events.EDITOR_CHANGE,(t=>{t===E.A.events.TEXT_CHANGE&&this.root.classList.toggle("ql-blank",this.editor.isBlank())})),this.emitter.on(E.A.events.SCROLL_UPDATE,((t,e)=>{const n=this.selection.lastRange,[r]=this.selection.getRange(),i=n&&r?{oldRange:n,newRange:r}:void 0;U.call(this,(()=>this.editor.update(null,e,i)),t)})),this.emitter.on(E.A.events.SCROLL_EMBED_UPDATE,((t,e)=>{const n=this.selection.lastRange,[r]=this.selection.getRange(),i=n&&r?{oldRange:n,newRange:r}:void 0;U.call(this,(()=>{const n=(new(o())).retain(t.offset(this)).retain({[t.statics.blotName]:e});return this.editor.update(n,[],i)}),q.sources.USER)})),n){const t=this.clipboard.convert({html:`${n}


    `,text:"\n"});this.setContents(t)}this.history.clear(),this.options.placeholder&&this.root.setAttribute("data-placeholder",this.options.placeholder),this.options.readOnly&&this.disable(),this.allowReadOnlyEdits=!1}addContainer(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;if("string"==typeof t){const e=t;(t=document.createElement("div")).classList.add(e)}return this.container.insertBefore(t,e),t}blur(){this.selection.setRange(null)}deleteText(t,e,n){return[t,e,,n]=P(t,e,n),U.call(this,(()=>this.editor.deleteText(t,e)),n,t,-1*e)}disable(){this.enable(!1)}editReadOnly(t){this.allowReadOnlyEdits=!0;const e=t();return this.allowReadOnlyEdits=!1,e}enable(){let t=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];this.scroll.enable(t),this.container.classList.toggle("ql-disabled",!t)}focus(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};this.selection.focus(),t.preventScroll||this.scrollSelectionIntoView()}format(t,e){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:E.A.sources.API;return U.call(this,(()=>{const n=this.getSelection(!0);let r=new(o());if(null==n)return r;if(this.scroll.query(t,i.Scope.BLOCK))r=this.editor.formatLine(n.index,n.length,{[t]:e});else{if(0===n.length)return this.selection.format(t,e),r;r=this.editor.formatText(n.index,n.length,{[t]:e})}return this.setSelection(n,E.A.sources.SILENT),r}),n)}formatLine(t,e,n,r,i){let s;return[t,e,s,i]=P(t,e,n,r,i),U.call(this,(()=>this.editor.formatLine(t,e,s)),i,t,0)}formatText(t,e,n,r,i){let s;return[t,e,s,i]=P(t,e,n,r,i),U.call(this,(()=>this.editor.formatText(t,e,s)),i,t,0)}getBounds(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=null;if(n="number"==typeof t?this.selection.getBounds(t,e):this.selection.getBounds(t.index,t.length),!n)return null;const r=this.container.getBoundingClientRect();return{bottom:n.bottom-r.top,height:n.height,left:n.left-r.left,right:n.right-r.left,top:n.top-r.top,width:n.width}}getContents(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.getLength()-t;return[t,e]=P(t,e),this.editor.getContents(t,e)}getFormat(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.getSelection(!0),e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;return"number"==typeof t?this.editor.getFormat(t,e):this.editor.getFormat(t.index,t.length)}getIndex(t){return t.offset(this.scroll)}getLength(){return this.scroll.length()}getLeaf(t){return this.scroll.leaf(t)}getLine(t){return this.scroll.line(t)}getLines(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:Number.MAX_VALUE;return"number"!=typeof t?this.scroll.lines(t.index,t.length):this.scroll.lines(t,e)}getModule(t){return this.theme.modules[t]}getSelection(){return arguments.length>0&&void 0!==arguments[0]&&arguments[0]&&this.focus(),this.update(),this.selection.getRange()[0]}getSemanticHTML(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,e=arguments.length>1?arguments[1]:void 0;return"number"==typeof t&&(e=e??this.getLength()-t),[t,e]=P(t,e),this.editor.getHTML(t,e)}getText(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,e=arguments.length>1?arguments[1]:void 0;return"number"==typeof t&&(e=e??this.getLength()-t),[t,e]=P(t,e),this.editor.getText(t,e)}hasFocus(){return this.selection.hasFocus()}insertEmbed(t,e,n){let r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:q.sources.API;return U.call(this,(()=>this.editor.insertEmbed(t,e,n)),r,t)}insertText(t,e,n,r,i){let s;return[t,,s,i]=P(t,0,n,r,i),U.call(this,(()=>this.editor.insertText(t,e,s)),i,t,e.length)}isEnabled(){return this.scroll.isEnabled()}off(){return this.emitter.off(...arguments)}on(){return this.emitter.on(...arguments)}once(){return this.emitter.once(...arguments)}removeFormat(t,e,n){return[t,e,,n]=P(t,e,n),U.call(this,(()=>this.editor.removeFormat(t,e)),n,t)}scrollRectIntoView(t){((t,e)=>{const n=t.ownerDocument;let r=e,i=t;for(;i;){const t=i===n.body,e=t?{top:0,right:window.visualViewport?.width??n.documentElement.clientWidth,bottom:window.visualViewport?.height??n.documentElement.clientHeight,left:0}:L(i),o=getComputedStyle(i),l=k(r.left,r.right,e.left,e.right,T(o.scrollPaddingLeft),T(o.scrollPaddingRight)),a=k(r.top,r.bottom,e.top,e.bottom,T(o.scrollPaddingTop),T(o.scrollPaddingBottom));if(l||a)if(t)n.defaultView?.scrollBy(l,a);else{const{scrollLeft:t,scrollTop:e}=i;a&&(i.scrollTop+=a),l&&(i.scrollLeft+=l);const n=i.scrollLeft-t,s=i.scrollTop-e;r={left:r.left-n,top:r.top-s,right:r.right-n,bottom:r.bottom-s}}i=t||"fixed"===o.position?null:(s=i).parentElement||s.getRootNode().host||null}var s})(this.root,t)}scrollIntoView(){console.warn("Quill#scrollIntoView() has been deprecated and will be removed in the near future. Please use Quill#scrollSelectionIntoView() instead."),this.scrollSelectionIntoView()}scrollSelectionIntoView(){const t=this.selection.lastRange,e=t&&this.selection.getBounds(t.index,t.length);e&&this.scrollRectIntoView(e)}setContents(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:E.A.sources.API;return U.call(this,(()=>{t=new(o())(t);const e=this.getLength(),n=this.editor.deleteText(0,e),r=this.editor.insertContents(0,t),i=this.editor.deleteText(this.getLength()-1,1);return n.compose(r).compose(i)}),e)}setSelection(t,e,n){null==t?this.selection.setRange(null,e||q.sources.API):([t,e,,n]=P(t,e,n),this.selection.setRange(new d.Q(Math.max(0,t),e),n),n!==E.A.sources.SILENT&&this.scrollSelectionIntoView())}setText(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:E.A.sources.API;const n=(new(o())).insert(t);return this.setContents(n,e)}update(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:E.A.sources.USER;const e=this.scroll.update(t);return this.selection.update(t),e}updateContents(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:E.A.sources.API;return U.call(this,(()=>(t=new(o())(t),this.editor.applyDelta(t))),e,!0)}}function I(t){return"string"==typeof t?document.querySelector(t):t}function M(t){return Object.entries(t??{}).reduce(((t,e)=>{let[n,r]=e;return{...t,[n]:!0===r?{}:r}}),{})}function D(t){return Object.fromEntries(Object.entries(t).filter((t=>void 0!==t[1])))}function U(t,e,n,r){if(!this.isEnabled()&&e===E.A.sources.USER&&!this.allowReadOnlyEdits)return new(o());let i=null==n?null:this.getSelection();const s=this.editor.delta,l=t();if(null!=i&&(!0===n&&(n=i.index),null==r?i=z(i,l,e):0!==r&&(i=z(i,n,r,e)),this.setSelection(i,E.A.sources.SILENT)),l.length()>0){const t=[E.A.events.TEXT_CHANGE,l,s,e];this.emitter.emit(E.A.events.EDITOR_CHANGE,...t),e!==E.A.sources.SILENT&&this.emitter.emit(...t)}return l}function P(t,e,n,r,i){let s={};return"number"==typeof t.index&&"number"==typeof t.length?"number"!=typeof e?(i=r,r=n,n=e,e=t.length,t=t.index):(e=t.length,t=t.index):"number"!=typeof e&&(i=r,r=n,n=e,e=0),"object"==typeof n?(s=n,i=r):"string"==typeof n&&(null!=r?s[n]=r:i=n),[t,e,s,i=i||E.A.sources.API]}function z(t,e,n,r){const i="number"==typeof n?n:0;if(null==t)return null;let s,o;return e&&"function"==typeof e.transformPosition?[s,o]=[t.index,t.index+t.length].map((t=>e.transformPosition(t,r!==E.A.sources.USER))):[s,o]=[t.index,t.index+t.length].map((t=>t=0?t+i:Math.max(e,t+i))),new d.Q(s,o-s)}},8298:function(t,e,n){"use strict";n.d(e,{Q:function(){return a}});var r=n(6003),i=n(5123),s=n(3707),o=n(5374);const l=(0,n(6078).A)("quill:selection");class a{constructor(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;this.index=t,this.length=e}}function c(t,e){try{e.parentNode}catch(t){return!1}return t.contains(e)}e.A=class{constructor(t,e){this.emitter=e,this.scroll=t,this.composing=!1,this.mouseDown=!1,this.root=this.scroll.domNode,this.cursor=this.scroll.create("cursor",this),this.savedRange=new a(0,0),this.lastRange=this.savedRange,this.lastNative=null,this.handleComposition(),this.handleDragging(),this.emitter.listenDOM("selectionchange",document,(()=>{this.mouseDown||this.composing||setTimeout(this.update.bind(this,o.A.sources.USER),1)})),this.emitter.on(o.A.events.SCROLL_BEFORE_UPDATE,(()=>{if(!this.hasFocus())return;const t=this.getNativeRange();null!=t&&t.start.node!==this.cursor.textNode&&this.emitter.once(o.A.events.SCROLL_UPDATE,((e,n)=>{try{this.root.contains(t.start.node)&&this.root.contains(t.end.node)&&this.setNativeRange(t.start.node,t.start.offset,t.end.node,t.end.offset);const r=n.some((t=>"characterData"===t.type||"childList"===t.type||"attributes"===t.type&&t.target===this.root));this.update(r?o.A.sources.SILENT:e)}catch(t){}}))})),this.emitter.on(o.A.events.SCROLL_OPTIMIZE,((t,e)=>{if(e.range){const{startNode:t,startOffset:n,endNode:r,endOffset:i}=e.range;this.setNativeRange(t,n,r,i),this.update(o.A.sources.SILENT)}})),this.update(o.A.sources.SILENT)}handleComposition(){this.emitter.on(o.A.events.COMPOSITION_BEFORE_START,(()=>{this.composing=!0})),this.emitter.on(o.A.events.COMPOSITION_END,(()=>{if(this.composing=!1,this.cursor.parent){const t=this.cursor.restore();if(!t)return;setTimeout((()=>{this.setNativeRange(t.startNode,t.startOffset,t.endNode,t.endOffset)}),1)}}))}handleDragging(){this.emitter.listenDOM("mousedown",document.body,(()=>{this.mouseDown=!0})),this.emitter.listenDOM("mouseup",document.body,(()=>{this.mouseDown=!1,this.update(o.A.sources.USER)}))}focus(){this.hasFocus()||(this.root.focus({preventScroll:!0}),this.setRange(this.savedRange))}format(t,e){this.scroll.update();const n=this.getNativeRange();if(null!=n&&n.native.collapsed&&!this.scroll.query(t,r.Scope.BLOCK)){if(n.start.node!==this.cursor.textNode){const t=this.scroll.find(n.start.node,!1);if(null==t)return;if(t instanceof r.LeafBlot){const e=t.split(n.start.offset);t.parent.insertBefore(this.cursor,e)}else t.insertBefore(this.cursor,n.start.node);this.cursor.attach()}this.cursor.format(t,e),this.scroll.optimize(),this.setNativeRange(this.cursor.textNode,this.cursor.textNode.data.length),this.update()}}getBounds(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;const n=this.scroll.length();let r;t=Math.min(t,n-1),e=Math.min(t+e,n-1)-t;let[i,s]=this.scroll.leaf(t);if(null==i)return null;if(e>0&&s===i.length()){const[e]=this.scroll.leaf(t+1);if(e){const[n]=this.scroll.line(t),[r]=this.scroll.line(t+1);n===r&&(i=e,s=0)}}[r,s]=i.position(s,!0);const o=document.createRange();if(e>0)return o.setStart(r,s),[i,s]=this.scroll.leaf(t+e),null==i?null:([r,s]=i.position(s,!0),o.setEnd(r,s),o.getBoundingClientRect());let l,a="left";if(r instanceof Text){if(!r.data.length)return null;s0&&(a="right")}return{bottom:l.top+l.height,height:l.height,left:l[a],right:l[a],top:l.top,width:0}}getNativeRange(){const t=document.getSelection();if(null==t||t.rangeCount<=0)return null;const e=t.getRangeAt(0);if(null==e)return null;const n=this.normalizeNative(e);return l.info("getNativeRange",n),n}getRange(){const t=this.scroll.domNode;if("isConnected"in t&&!t.isConnected)return[null,null];const e=this.getNativeRange();return null==e?[null,null]:[this.normalizedToRange(e),e]}hasFocus(){return document.activeElement===this.root||null!=document.activeElement&&c(this.root,document.activeElement)}normalizedToRange(t){const e=[[t.start.node,t.start.offset]];t.native.collapsed||e.push([t.end.node,t.end.offset]);const n=e.map((t=>{const[e,n]=t,i=this.scroll.find(e,!0),s=i.offset(this.scroll);return 0===n?s:i instanceof r.LeafBlot?s+i.index(e,n):s+i.length()})),i=Math.min(Math.max(...n),this.scroll.length()-1),s=Math.min(i,...n);return new a(s,i-s)}normalizeNative(t){if(!c(this.root,t.startContainer)||!t.collapsed&&!c(this.root,t.endContainer))return null;const e={start:{node:t.startContainer,offset:t.startOffset},end:{node:t.endContainer,offset:t.endOffset},native:t};return[e.start,e.end].forEach((t=>{let{node:e,offset:n}=t;for(;!(e instanceof Text)&&e.childNodes.length>0;)if(e.childNodes.length>n)e=e.childNodes[n],n=0;else{if(e.childNodes.length!==n)break;e=e.lastChild,n=e instanceof Text?e.data.length:e.childNodes.length>0?e.childNodes.length:e.childNodes.length+1}t.node=e,t.offset=n})),e}rangeToNative(t){const e=this.scroll.length(),n=(t,n)=>{t=Math.min(e-1,t);const[r,i]=this.scroll.leaf(t);return r?r.position(i,n):[null,-1]};return[...n(t.index,!1),...n(t.index+t.length,!0)]}setNativeRange(t,e){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:t,r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:e,i=arguments.length>4&&void 0!==arguments[4]&&arguments[4];if(l.info("setNativeRange",t,e,n,r),null!=t&&(null==this.root.parentNode||null==t.parentNode||null==n.parentNode))return;const s=document.getSelection();if(null!=s)if(null!=t){this.hasFocus()||this.root.focus({preventScroll:!0});const{native:o}=this.getNativeRange()||{};if(null==o||i||t!==o.startContainer||e!==o.startOffset||n!==o.endContainer||r!==o.endOffset){t instanceof Element&&"BR"===t.tagName&&(e=Array.from(t.parentNode.childNodes).indexOf(t),t=t.parentNode),n instanceof Element&&"BR"===n.tagName&&(r=Array.from(n.parentNode.childNodes).indexOf(n),n=n.parentNode);const i=document.createRange();i.setStart(t,e),i.setEnd(n,r),s.removeAllRanges(),s.addRange(i)}}else s.removeAllRanges(),this.root.blur()}setRange(t){let e=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:o.A.sources.API;if("string"==typeof e&&(n=e,e=!1),l.info("setRange",t),null!=t){const n=this.rangeToNative(t);this.setNativeRange(...n,e)}else this.setNativeRange(null);this.update(n)}update(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:o.A.sources.USER;const e=this.lastRange,[n,r]=this.getRange();if(this.lastRange=n,this.lastNative=r,null!=this.lastRange&&(this.savedRange=this.lastRange),!(0,i.A)(e,this.lastRange)){if(!this.composing&&null!=r&&r.native.collapsed&&r.start.node!==this.cursor.textNode){const t=this.cursor.restore();t&&this.setNativeRange(t.startNode,t.startOffset,t.endNode,t.endOffset)}const n=[o.A.events.SELECTION_CHANGE,(0,s.A)(this.lastRange),(0,s.A)(e),t];this.emitter.emit(o.A.events.EDITOR_CHANGE,...n),t!==o.A.sources.SILENT&&this.emitter.emit(...n)}}}},9609:function(t,e){"use strict";class n{static DEFAULTS={modules:{}};static themes={default:n};modules={};constructor(t,e){this.quill=t,this.options=e}init(){Object.keys(this.options.modules).forEach((t=>{null==this.modules[t]&&this.addModule(t)}))}addModule(t){const e=this.quill.constructor.import(`modules/${t}`);return this.modules[t]=new e(this.quill,this.options.modules[t]||{}),this.modules[t]}}e.A=n},8276:function(t,e,n){"use strict";n.d(e,{Hu:function(){return o},gS:function(){return s}});var r=n(6003);const i={scope:r.Scope.BLOCK,whitelist:["right","center","justify"]},s=new r.Attributor("align","align",i),o=(new r.ClassAttributor("align","ql-align",i),new r.StyleAttributor("align","text-align",i))},9541:function(t,e,n){"use strict";n.d(e,{s:function(){return s}});var r=n(6003),i=n(8638);new r.ClassAttributor("background","ql-bg",{scope:r.Scope.INLINE});const s=new i.a2("background","background-color",{scope:r.Scope.INLINE})},9404:function(t,e,n){"use strict";n.d(e,{Ay:function(){return h}});var r=n(9698),i=n(3036),s=n(4541),o=n(4850),l=n(5508),a=n(580),c=n(6142);class u extends a.A{static create(t){const e=super.create(t);return e.setAttribute("spellcheck","false"),e}code(t,e){return this.children.map((t=>t.length()<=1?"":t.domNode.innerText)).join("\n").slice(t,t+e)}html(t,e){return`
    \n${(0,l.X)(this.code(t,e))}\n
    `}}class h extends r.Ay{static TAB=" ";static register(){c.Ay.register(u)}}class f extends o.A{}f.blotName="code",f.tagName="CODE",h.blotName="code-block",h.className="ql-code-block",h.tagName="DIV",u.blotName="code-block-container",u.className="ql-code-block-container",u.tagName="DIV",u.allowedChildren=[h],h.allowedChildren=[l.A,i.A,s.A],h.requiredContainer=u},8638:function(t,e,n){"use strict";n.d(e,{JM:function(){return s},a2:function(){return i}});var r=n(6003);class i extends r.StyleAttributor{value(t){let e=super.value(t);return e.startsWith("rgb(")?(e=e.replace(/^[^\d]+/,"").replace(/[^\d]+$/,""),`#${e.split(",").map((t=>`00${parseInt(t,10).toString(16)}`.slice(-2))).join("")}`):e}}new r.ClassAttributor("color","ql-color",{scope:r.Scope.INLINE});const s=new i("color","color",{scope:r.Scope.INLINE})},7912:function(t,e,n){"use strict";n.d(e,{Mc:function(){return s},VL:function(){return o}});var r=n(6003);const i={scope:r.Scope.BLOCK,whitelist:["rtl"]},s=new r.Attributor("direction","dir",i),o=(new r.ClassAttributor("direction","ql-direction",i),new r.StyleAttributor("direction","direction",i))},6772:function(t,e,n){"use strict";n.d(e,{z:function(){return o}});var r=n(6003);const i={scope:r.Scope.INLINE,whitelist:["serif","monospace"]};new r.ClassAttributor("font","ql-font",i);class s extends r.StyleAttributor{value(t){return super.value(t).replace(/["']/g,"")}}const o=new s("font","font-family",i)},664:function(t,e,n){"use strict";n.d(e,{r:function(){return i}});var r=n(6003);new r.ClassAttributor("size","ql-size",{scope:r.Scope.INLINE,whitelist:["small","large","huge"]});const i=new r.StyleAttributor("size","font-size",{scope:r.Scope.INLINE,whitelist:["10px","18px","32px"]})},584:function(t,e,n){"use strict";n.d(e,{Ay:function(){return L}});var r=n(6003),i=n(5232),s=n.n(i),o=n(9698),l=n(6078),a=n(4266),c=n(6142),u=n(8276),h=n(9541),f=n(9404),d=n(8638),p=n(7912),g=n(6772),m=n(664),b=n(8123);const y=/font-weight:\s*normal/,v=["P","OL","UL"],A=t=>t&&v.includes(t.tagName),N=/\bmso-list:[^;]*ignore/i,E=/\bmso-list:[^;]*\bl(\d+)/i,_=/\bmso-list:[^;]*\blevel(\d+)/i,x=[function(t){"urn:schemas-microsoft-com:office:word"===t.documentElement.getAttribute("xmlns:w")&&(t=>{const e=Array.from(t.querySelectorAll("[style*=mso-list]")),n=[],r=[];e.forEach((t=>{(t.getAttribute("style")||"").match(N)?n.push(t):r.push(t)})),n.forEach((t=>t.parentNode?.removeChild(t)));const i=t.documentElement.innerHTML,s=r.map((t=>((t,e)=>{const n=t.getAttribute("style"),r=n?.match(E);if(!r)return null;const i=Number(r[1]),s=n?.match(_),o=s?Number(s[1]):1,l=new RegExp(`@list l${i}:level${o}\\s*\\{[^\\}]*mso-level-number-format:\\s*([\\w-]+)`,"i"),a=e.match(l);return{id:i,indent:o,type:a&&"bullet"===a[1]?"bullet":"ordered",element:t}})(t,i))).filter((t=>t));for(;s.length;){const t=[];let e=s.shift();for(;e;)t.push(e),e=s.length&&s[0]?.element===e.element.nextElementSibling&&s[0].id===e.id?s.shift():null;const n=document.createElement("ul");t.forEach((t=>{const e=document.createElement("li");e.setAttribute("data-list",t.type),t.indent>1&&e.setAttribute("class","ql-indent-"+(t.indent-1)),e.innerHTML=t.element.innerHTML,n.appendChild(e)}));const r=t[0]?.element,{parentNode:i}=r??{};r&&i?.replaceChild(n,r),t.slice(1).forEach((t=>{let{element:e}=t;i?.removeChild(e)}))}})(t)},function(t){t.querySelector('[id^="docs-internal-guid-"]')&&((t=>{Array.from(t.querySelectorAll('b[style*="font-weight"]')).filter((t=>t.getAttribute("style")?.match(y))).forEach((e=>{const n=t.createDocumentFragment();n.append(...e.childNodes),e.parentNode?.replaceChild(n,e)}))})(t),(t=>{Array.from(t.querySelectorAll("br")).filter((t=>A(t.previousElementSibling)&&A(t.nextElementSibling))).forEach((t=>{t.parentNode?.removeChild(t)}))})(t))}];const w=(0,l.A)("quill:clipboard"),O=[[Node.TEXT_NODE,function(t,e,n){let r=t.data;if("O:P"===t.parentElement?.tagName)return e.insert(r.trim());if(!B(t)){if(0===r.trim().length&&r.includes("\n")&&!function(t,e){return t.previousElementSibling&&t.nextElementSibling&&!C(t.previousElementSibling,e)&&!C(t.nextElementSibling,e)}(t,n))return e;r=r.replace(/[^\S\u00a0]/g," "),r=r.replace(/ {2,}/g," "),(null==t.previousSibling&&null!=t.parentElement&&C(t.parentElement,n)||t.previousSibling instanceof Element&&C(t.previousSibling,n))&&(r=r.replace(/^ /,"")),(null==t.nextSibling&&null!=t.parentElement&&C(t.parentElement,n)||t.nextSibling instanceof Element&&C(t.nextSibling,n))&&(r=r.replace(/ $/,"")),r=r.replaceAll(" "," ")}return e.insert(r)}],[Node.TEXT_NODE,M],["br",function(t,e){return k(e,"\n")||e.insert("\n"),e}],[Node.ELEMENT_NODE,M],[Node.ELEMENT_NODE,function(t,e,n){const i=n.query(t);if(null==i)return e;if(i.prototype instanceof r.EmbedBlot){const e={},r=i.value(t);if(null!=r)return e[i.blotName]=r,(new(s())).insert(e,i.formats(t,n))}else if(i.prototype instanceof r.BlockBlot&&!k(e,"\n")&&e.insert("\n"),"blotName"in i&&"formats"in i&&"function"==typeof i.formats)return T(e,i.blotName,i.formats(t,n),n);return e}],[Node.ELEMENT_NODE,function(t,e,n){const i=r.Attributor.keys(t),s=r.ClassAttributor.keys(t),o=r.StyleAttributor.keys(t),l={};return i.concat(s).concat(o).forEach((e=>{let i=n.query(e,r.Scope.ATTRIBUTE);null!=i&&(l[i.attrName]=i.value(t),l[i.attrName])||(i=j[e],null==i||i.attrName!==e&&i.keyName!==e||(l[i.attrName]=i.value(t)||void 0),i=S[e],null==i||i.attrName!==e&&i.keyName!==e||(i=S[e],l[i.attrName]=i.value(t)||void 0))})),Object.entries(l).reduce(((t,e)=>{let[r,i]=e;return T(t,r,i,n)}),e)}],[Node.ELEMENT_NODE,function(t,e,n){const r={},i=t.style||{};return"italic"===i.fontStyle&&(r.italic=!0),"underline"===i.textDecoration&&(r.underline=!0),"line-through"===i.textDecoration&&(r.strike=!0),(i.fontWeight?.startsWith("bold")||parseInt(i.fontWeight,10)>=700)&&(r.bold=!0),e=Object.entries(r).reduce(((t,e)=>{let[r,i]=e;return T(t,r,i,n)}),e),parseFloat(i.textIndent||0)>0?(new(s())).insert("\t").concat(e):e}],["li",function(t,e,n){const r=n.query(t);if(null==r||"list"!==r.blotName||!k(e,"\n"))return e;let i=-1,o=t.parentNode;for(;null!=o;)["OL","UL"].includes(o.tagName)&&(i+=1),o=o.parentNode;return i<=0?e:e.reduce(((t,e)=>e.insert?e.attributes&&"number"==typeof e.attributes.indent?t.push(e):t.insert(e.insert,{indent:i,...e.attributes||{}}):t),new(s()))}],["ol, ul",function(t,e,n){const r=t;let i="OL"===r.tagName?"ordered":"bullet";const s=r.getAttribute("data-checked");return s&&(i="true"===s?"checked":"unchecked"),T(e,"list",i,n)}],["pre",function(t,e,n){const r=n.query("code-block");return T(e,"code-block",!r||!("formats"in r)||"function"!=typeof r.formats||r.formats(t,n),n)}],["tr",function(t,e,n){const r="TABLE"===t.parentElement?.tagName?t.parentElement:t.parentElement?.parentElement;return null!=r?T(e,"table",Array.from(r.querySelectorAll("tr")).indexOf(t)+1,n):e}],["b",I("bold")],["i",I("italic")],["strike",I("strike")],["style",function(){return new(s())}]],j=[u.gS,p.Mc].reduce(((t,e)=>(t[e.keyName]=e,t)),{}),S=[u.Hu,h.s,d.JM,p.VL,g.z,m.r].reduce(((t,e)=>(t[e.keyName]=e,t)),{});class L extends a.A{static DEFAULTS={matchers:[]};constructor(t,e){super(t,e),this.quill.root.addEventListener("copy",(t=>this.onCaptureCopy(t,!1))),this.quill.root.addEventListener("cut",(t=>this.onCaptureCopy(t,!0))),this.quill.root.addEventListener("paste",this.onCapturePaste.bind(this)),this.matchers=[],O.concat(this.options.matchers??[]).forEach((t=>{let[e,n]=t;this.addMatcher(e,n)}))}addMatcher(t,e){this.matchers.push([t,e])}convert(t){let{html:e,text:n}=t,r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(r[f.Ay.blotName])return(new(s())).insert(n||"",{[f.Ay.blotName]:r[f.Ay.blotName]});if(!e)return(new(s())).insert(n||"",r);const i=this.convertHTML(e);return k(i,"\n")&&(null==i.ops[i.ops.length-1].attributes||r.table)?i.compose((new(s())).retain(i.length()-1).delete(1)):i}normalizeHTML(t){(t=>{t.documentElement&&x.forEach((e=>{e(t)}))})(t)}convertHTML(t){const e=(new DOMParser).parseFromString(t,"text/html");this.normalizeHTML(e);const n=e.body,r=new WeakMap,[i,s]=this.prepareMatching(n,r);return q(this.quill.scroll,n,i,s,r)}dangerouslyPasteHTML(t,e){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:c.Ay.sources.API;if("string"==typeof t){const n=this.convert({html:t,text:""});this.quill.setContents(n,e),this.quill.setSelection(0,c.Ay.sources.SILENT)}else{const r=this.convert({html:e,text:""});this.quill.updateContents((new(s())).retain(t).concat(r),n),this.quill.setSelection(t+r.length(),c.Ay.sources.SILENT)}}onCaptureCopy(t){let e=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(t.defaultPrevented)return;t.preventDefault();const[n]=this.quill.selection.getRange();if(null==n)return;const{html:r,text:i}=this.onCopy(n,e);t.clipboardData?.setData("text/plain",i),t.clipboardData?.setData("text/html",r),e&&(0,b.Xo)({range:n,quill:this.quill})}normalizeURIList(t){return t.split(/\r?\n/).filter((t=>"#"!==t[0])).join("\n")}onCapturePaste(t){if(t.defaultPrevented||!this.quill.isEnabled())return;t.preventDefault();const e=this.quill.getSelection(!0);if(null==e)return;const n=t.clipboardData?.getData("text/html");let r=t.clipboardData?.getData("text/plain");if(!n&&!r){const e=t.clipboardData?.getData("text/uri-list");e&&(r=this.normalizeURIList(e))}const i=Array.from(t.clipboardData?.files||[]);if(!n&&i.length>0)this.quill.uploader.upload(e,i);else{if(n&&i.length>0){const t=(new DOMParser).parseFromString(n,"text/html");if(1===t.body.childElementCount&&"IMG"===t.body.firstElementChild?.tagName)return void this.quill.uploader.upload(e,i)}this.onPaste(e,{html:n,text:r})}}onCopy(t){const e=this.quill.getText(t);return{html:this.quill.getSemanticHTML(t),text:e}}onPaste(t,e){let{text:n,html:r}=e;const i=this.quill.getFormat(t.index),o=this.convert({text:n,html:r},i);w.log("onPaste",o,{text:n,html:r});const l=(new(s())).retain(t.index).delete(t.length).concat(o);this.quill.updateContents(l,c.Ay.sources.USER),this.quill.setSelection(l.length()-t.length,c.Ay.sources.SILENT),this.quill.scrollSelectionIntoView()}prepareMatching(t,e){const n=[],r=[];return this.matchers.forEach((i=>{const[s,o]=i;switch(s){case Node.TEXT_NODE:r.push(o);break;case Node.ELEMENT_NODE:n.push(o);break;default:Array.from(t.querySelectorAll(s)).forEach((t=>{if(e.has(t)){const n=e.get(t);n?.push(o)}else e.set(t,[o])}))}})),[n,r]}}function T(t,e,n,r){return r.query(e)?t.reduce(((t,r)=>{if(!r.insert)return t;if(r.attributes&&r.attributes[e])return t.push(r);const i=n?{[e]:n}:{};return t.insert(r.insert,{...i,...r.attributes})}),new(s())):t}function k(t,e){let n="";for(let r=t.ops.length-1;r>=0&&n.lengthr(e,n,t)),new(s())):e.nodeType===e.ELEMENT_NODE?Array.from(e.childNodes||[]).reduce(((s,o)=>{let l=q(t,o,n,r,i);return o.nodeType===e.ELEMENT_NODE&&(l=n.reduce(((e,n)=>n(o,e,t)),l),l=(i.get(o)||[]).reduce(((e,n)=>n(o,e,t)),l)),s.concat(l)}),new(s())):new(s())}function I(t){return(e,n,r)=>T(n,t,!0,r)}function M(t,e,n){if(!k(e,"\n")){if(C(t,n)&&(t.childNodes.length>0||t instanceof HTMLParagraphElement))return e.insert("\n");if(e.length()>0&&t.nextSibling){let r=t.nextSibling;for(;null!=r;){if(C(r,n))return e.insert("\n");const t=n.query(r);if(t&&t.prototype instanceof o.zo)return e.insert("\n");r=r.firstChild}}}return e}},8123:function(t,e,n){"use strict";n.d(e,{Ay:function(){return d},Xo:function(){return v}});var r=n(5123),i=n(3707),s=n(5232),o=n.n(s),l=n(6003),a=n(6142),c=n(6078),u=n(4266);const h=(0,c.A)("quill:keyboard"),f=/Mac/i.test(navigator.platform)?"metaKey":"ctrlKey";class d extends u.A{static match(t,e){return!["altKey","ctrlKey","metaKey","shiftKey"].some((n=>!!e[n]!==t[n]&&null!==e[n]))&&(e.key===t.key||e.key===t.which)}constructor(t,e){super(t,e),this.bindings={},Object.keys(this.options.bindings).forEach((t=>{this.options.bindings[t]&&this.addBinding(this.options.bindings[t])})),this.addBinding({key:"Enter",shiftKey:null},this.handleEnter),this.addBinding({key:"Enter",metaKey:null,ctrlKey:null,altKey:null},(()=>{})),/Firefox/i.test(navigator.userAgent)?(this.addBinding({key:"Backspace"},{collapsed:!0},this.handleBackspace),this.addBinding({key:"Delete"},{collapsed:!0},this.handleDelete)):(this.addBinding({key:"Backspace"},{collapsed:!0,prefix:/^.?$/},this.handleBackspace),this.addBinding({key:"Delete"},{collapsed:!0,suffix:/^.?$/},this.handleDelete)),this.addBinding({key:"Backspace"},{collapsed:!1},this.handleDeleteRange),this.addBinding({key:"Delete"},{collapsed:!1},this.handleDeleteRange),this.addBinding({key:"Backspace",altKey:null,ctrlKey:null,metaKey:null,shiftKey:null},{collapsed:!0,offset:0},this.handleBackspace),this.listen()}addBinding(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};const r=function(t){if("string"==typeof t||"number"==typeof t)t={key:t};else{if("object"!=typeof t)return null;t=(0,i.A)(t)}return t.shortKey&&(t[f]=t.shortKey,delete t.shortKey),t}(t);null!=r?("function"==typeof e&&(e={handler:e}),"function"==typeof n&&(n={handler:n}),(Array.isArray(r.key)?r.key:[r.key]).forEach((t=>{const i={...r,key:t,...e,...n};this.bindings[i.key]=this.bindings[i.key]||[],this.bindings[i.key].push(i)}))):h.warn("Attempted to add invalid keyboard binding",r)}listen(){this.quill.root.addEventListener("keydown",(t=>{if(t.defaultPrevented||t.isComposing)return;if(229===t.keyCode&&("Enter"===t.key||"Backspace"===t.key))return;const e=(this.bindings[t.key]||[]).concat(this.bindings[t.which]||[]).filter((e=>d.match(t,e)));if(0===e.length)return;const n=a.Ay.find(t.target,!0);if(n&&n.scroll!==this.quill.scroll)return;const i=this.quill.getSelection();if(null==i||!this.quill.hasFocus())return;const[s,o]=this.quill.getLine(i.index),[c,u]=this.quill.getLeaf(i.index),[h,f]=0===i.length?[c,u]:this.quill.getLeaf(i.index+i.length),p=c instanceof l.TextBlot?c.value().slice(0,u):"",g=h instanceof l.TextBlot?h.value().slice(f):"",m={collapsed:0===i.length,empty:0===i.length&&s.length()<=1,format:this.quill.getFormat(i),line:s,offset:o,prefix:p,suffix:g,event:t};e.some((t=>{if(null!=t.collapsed&&t.collapsed!==m.collapsed)return!1;if(null!=t.empty&&t.empty!==m.empty)return!1;if(null!=t.offset&&t.offset!==m.offset)return!1;if(Array.isArray(t.format)){if(t.format.every((t=>null==m.format[t])))return!1}else if("object"==typeof t.format&&!Object.keys(t.format).every((e=>!0===t.format[e]?null!=m.format[e]:!1===t.format[e]?null==m.format[e]:(0,r.A)(t.format[e],m.format[e]))))return!1;return!(null!=t.prefix&&!t.prefix.test(m.prefix)||null!=t.suffix&&!t.suffix.test(m.suffix)||!0===t.handler.call(this,i,m,t))}))&&t.preventDefault()}))}handleBackspace(t,e){const n=/[\uD800-\uDBFF][\uDC00-\uDFFF]$/.test(e.prefix)?2:1;if(0===t.index||this.quill.getLength()<=1)return;let r={};const[i]=this.quill.getLine(t.index);let l=(new(o())).retain(t.index-n).delete(n);if(0===e.offset){const[e]=this.quill.getLine(t.index-1);if(e&&!("block"===e.statics.blotName&&e.length()<=1)){const e=i.formats(),n=this.quill.getFormat(t.index-1,1);if(r=s.AttributeMap.diff(e,n)||{},Object.keys(r).length>0){const e=(new(o())).retain(t.index+i.length()-2).retain(1,r);l=l.compose(e)}}}this.quill.updateContents(l,a.Ay.sources.USER),this.quill.focus()}handleDelete(t,e){const n=/^[\uD800-\uDBFF][\uDC00-\uDFFF]/.test(e.suffix)?2:1;if(t.index>=this.quill.getLength()-n)return;let r={};const[i]=this.quill.getLine(t.index);let l=(new(o())).retain(t.index).delete(n);if(e.offset>=i.length()-1){const[e]=this.quill.getLine(t.index+1);if(e){const n=i.formats(),o=this.quill.getFormat(t.index,1);r=s.AttributeMap.diff(n,o)||{},Object.keys(r).length>0&&(l=l.retain(e.length()-1).retain(1,r))}}this.quill.updateContents(l,a.Ay.sources.USER),this.quill.focus()}handleDeleteRange(t){v({range:t,quill:this.quill}),this.quill.focus()}handleEnter(t,e){const n=Object.keys(e.format).reduce(((t,n)=>(this.quill.scroll.query(n,l.Scope.BLOCK)&&!Array.isArray(e.format[n])&&(t[n]=e.format[n]),t)),{}),r=(new(o())).retain(t.index).delete(t.length).insert("\n",n);this.quill.updateContents(r,a.Ay.sources.USER),this.quill.setSelection(t.index+1,a.Ay.sources.SILENT),this.quill.focus()}}const p={bindings:{bold:b("bold"),italic:b("italic"),underline:b("underline"),indent:{key:"Tab",format:["blockquote","indent","list"],handler(t,e){return!(!e.collapsed||0===e.offset)||(this.quill.format("indent","+1",a.Ay.sources.USER),!1)}},outdent:{key:"Tab",shiftKey:!0,format:["blockquote","indent","list"],handler(t,e){return!(!e.collapsed||0===e.offset)||(this.quill.format("indent","-1",a.Ay.sources.USER),!1)}},"outdent backspace":{key:"Backspace",collapsed:!0,shiftKey:null,metaKey:null,ctrlKey:null,altKey:null,format:["indent","list"],offset:0,handler(t,e){null!=e.format.indent?this.quill.format("indent","-1",a.Ay.sources.USER):null!=e.format.list&&this.quill.format("list",!1,a.Ay.sources.USER)}},"indent code-block":g(!0),"outdent code-block":g(!1),"remove tab":{key:"Tab",shiftKey:!0,collapsed:!0,prefix:/\t$/,handler(t){this.quill.deleteText(t.index-1,1,a.Ay.sources.USER)}},tab:{key:"Tab",handler(t,e){if(e.format.table)return!0;this.quill.history.cutoff();const n=(new(o())).retain(t.index).delete(t.length).insert("\t");return this.quill.updateContents(n,a.Ay.sources.USER),this.quill.history.cutoff(),this.quill.setSelection(t.index+1,a.Ay.sources.SILENT),!1}},"blockquote empty enter":{key:"Enter",collapsed:!0,format:["blockquote"],empty:!0,handler(){this.quill.format("blockquote",!1,a.Ay.sources.USER)}},"list empty enter":{key:"Enter",collapsed:!0,format:["list"],empty:!0,handler(t,e){const n={list:!1};e.format.indent&&(n.indent=!1),this.quill.formatLine(t.index,t.length,n,a.Ay.sources.USER)}},"checklist enter":{key:"Enter",collapsed:!0,format:{list:"checked"},handler(t){const[e,n]=this.quill.getLine(t.index),r={...e.formats(),list:"checked"},i=(new(o())).retain(t.index).insert("\n",r).retain(e.length()-n-1).retain(1,{list:"unchecked"});this.quill.updateContents(i,a.Ay.sources.USER),this.quill.setSelection(t.index+1,a.Ay.sources.SILENT),this.quill.scrollSelectionIntoView()}},"header enter":{key:"Enter",collapsed:!0,format:["header"],suffix:/^$/,handler(t,e){const[n,r]=this.quill.getLine(t.index),i=(new(o())).retain(t.index).insert("\n",e.format).retain(n.length()-r-1).retain(1,{header:null});this.quill.updateContents(i,a.Ay.sources.USER),this.quill.setSelection(t.index+1,a.Ay.sources.SILENT),this.quill.scrollSelectionIntoView()}},"table backspace":{key:"Backspace",format:["table"],collapsed:!0,offset:0,handler(){}},"table delete":{key:"Delete",format:["table"],collapsed:!0,suffix:/^$/,handler(){}},"table enter":{key:"Enter",shiftKey:null,format:["table"],handler(t){const e=this.quill.getModule("table");if(e){const[n,r,i,s]=e.getTable(t),l=function(t,e,n,r){return null==e.prev&&null==e.next?null==n.prev&&null==n.next?0===r?-1:1:null==n.prev?-1:1:null==e.prev?-1:null==e.next?1:null}(0,r,i,s);if(null==l)return;let c=n.offset();if(l<0){const e=(new(o())).retain(c).insert("\n");this.quill.updateContents(e,a.Ay.sources.USER),this.quill.setSelection(t.index+1,t.length,a.Ay.sources.SILENT)}else if(l>0){c+=n.length();const t=(new(o())).retain(c).insert("\n");this.quill.updateContents(t,a.Ay.sources.USER),this.quill.setSelection(c,a.Ay.sources.USER)}}}},"table tab":{key:"Tab",shiftKey:null,format:["table"],handler(t,e){const{event:n,line:r}=e,i=r.offset(this.quill.scroll);n.shiftKey?this.quill.setSelection(i-1,a.Ay.sources.USER):this.quill.setSelection(i+r.length(),a.Ay.sources.USER)}},"list autofill":{key:" ",shiftKey:null,collapsed:!0,format:{"code-block":!1,blockquote:!1,table:!1},prefix:/^\s*?(\d+\.|-|\*|\[ ?\]|\[x\])$/,handler(t,e){if(null==this.quill.scroll.query("list"))return!0;const{length:n}=e.prefix,[r,i]=this.quill.getLine(t.index);if(i>n)return!0;let s;switch(e.prefix.trim()){case"[]":case"[ ]":s="unchecked";break;case"[x]":s="checked";break;case"-":case"*":s="bullet";break;default:s="ordered"}this.quill.insertText(t.index," ",a.Ay.sources.USER),this.quill.history.cutoff();const l=(new(o())).retain(t.index-i).delete(n+1).retain(r.length()-2-i).retain(1,{list:s});return this.quill.updateContents(l,a.Ay.sources.USER),this.quill.history.cutoff(),this.quill.setSelection(t.index-n,a.Ay.sources.SILENT),!1}},"code exit":{key:"Enter",collapsed:!0,format:["code-block"],prefix:/^$/,suffix:/^\s*$/,handler(t){const[e,n]=this.quill.getLine(t.index);let r=2,i=e;for(;null!=i&&i.length()<=1&&i.formats()["code-block"];)if(i=i.prev,r-=1,r<=0){const r=(new(o())).retain(t.index+e.length()-n-2).retain(1,{"code-block":null}).delete(1);return this.quill.updateContents(r,a.Ay.sources.USER),this.quill.setSelection(t.index-1,a.Ay.sources.SILENT),!1}return!0}},"embed left":m("ArrowLeft",!1),"embed left shift":m("ArrowLeft",!0),"embed right":m("ArrowRight",!1),"embed right shift":m("ArrowRight",!0),"table down":y(!1),"table up":y(!0)}};function g(t){return{key:"Tab",shiftKey:!t,format:{"code-block":!0},handler(e,n){let{event:r}=n;const i=this.quill.scroll.query("code-block"),{TAB:s}=i;if(0===e.length&&!r.shiftKey)return this.quill.insertText(e.index,s,a.Ay.sources.USER),void this.quill.setSelection(e.index+s.length,a.Ay.sources.SILENT);const o=0===e.length?this.quill.getLines(e.index,1):this.quill.getLines(e);let{index:l,length:c}=e;o.forEach(((e,n)=>{t?(e.insertAt(0,s),0===n?l+=s.length:c+=s.length):e.domNode.textContent.startsWith(s)&&(e.deleteAt(0,s.length),0===n?l-=s.length:c-=s.length)})),this.quill.update(a.Ay.sources.USER),this.quill.setSelection(l,c,a.Ay.sources.SILENT)}}}function m(t,e){return{key:t,shiftKey:e,altKey:null,["ArrowLeft"===t?"prefix":"suffix"]:/^$/,handler(n){let{index:r}=n;"ArrowRight"===t&&(r+=n.length+1);const[i]=this.quill.getLeaf(r);return!(i instanceof l.EmbedBlot&&("ArrowLeft"===t?e?this.quill.setSelection(n.index-1,n.length+1,a.Ay.sources.USER):this.quill.setSelection(n.index-1,a.Ay.sources.USER):e?this.quill.setSelection(n.index,n.length+1,a.Ay.sources.USER):this.quill.setSelection(n.index+n.length+1,a.Ay.sources.USER),1))}}}function b(t){return{key:t[0],shortKey:!0,handler(e,n){this.quill.format(t,!n.format[t],a.Ay.sources.USER)}}}function y(t){return{key:t?"ArrowUp":"ArrowDown",collapsed:!0,format:["table"],handler(e,n){const r=t?"prev":"next",i=n.line,s=i.parent[r];if(null!=s){if("table-row"===s.statics.blotName){let t=s.children.head,e=i;for(;null!=e.prev;)e=e.prev,t=t.next;const r=t.offset(this.quill.scroll)+Math.min(n.offset,t.length()-1);this.quill.setSelection(r,0,a.Ay.sources.USER)}}else{const e=i.table()[r];null!=e&&(t?this.quill.setSelection(e.offset(this.quill.scroll)+e.length()-1,0,a.Ay.sources.USER):this.quill.setSelection(e.offset(this.quill.scroll),0,a.Ay.sources.USER))}return!1}}}function v(t){let{quill:e,range:n}=t;const r=e.getLines(n);let i={};if(r.length>1){const t=r[0].formats(),e=r[r.length-1].formats();i=s.AttributeMap.diff(e,t)||{}}e.deleteText(n,a.Ay.sources.USER),Object.keys(i).length>0&&e.formatLine(n.index,1,i,a.Ay.sources.USER),e.setSelection(n.index,a.Ay.sources.SILENT)}d.DEFAULTS=p},8920:function(t){"use strict";var e=Object.prototype.hasOwnProperty,n="~";function r(){}function i(t,e,n){this.fn=t,this.context=e,this.once=n||!1}function s(t,e,r,s,o){if("function"!=typeof r)throw new TypeError("The listener must be a function");var l=new i(r,s||t,o),a=n?n+e:e;return t._events[a]?t._events[a].fn?t._events[a]=[t._events[a],l]:t._events[a].push(l):(t._events[a]=l,t._eventsCount++),t}function o(t,e){0==--t._eventsCount?t._events=new r:delete t._events[e]}function l(){this._events=new r,this._eventsCount=0}Object.create&&(r.prototype=Object.create(null),(new r).__proto__||(n=!1)),l.prototype.eventNames=function(){var t,r,i=[];if(0===this._eventsCount)return i;for(r in t=this._events)e.call(t,r)&&i.push(n?r.slice(1):r);return Object.getOwnPropertySymbols?i.concat(Object.getOwnPropertySymbols(t)):i},l.prototype.listeners=function(t){var e=n?n+t:t,r=this._events[e];if(!r)return[];if(r.fn)return[r.fn];for(var i=0,s=r.length,o=new Array(s);io)){var f=e.slice(0,h);if((g=e.slice(h))===c){var d=Math.min(l,h);if((b=a.slice(0,d))===(A=f.slice(0,d)))return v(b,a.slice(d),f.slice(d),c)}}if(null===u||u===l){var p=l,g=(f=e.slice(0,p),e.slice(p));if(f===a){var m=Math.min(s-p,o-p);if((y=c.slice(c.length-m))===(N=g.slice(g.length-m)))return v(a,c.slice(0,c.length-m),g.slice(0,g.length-m),y)}}}if(r.length>0&&i&&0===i.length){var b=t.slice(0,r.index),y=t.slice(r.index+r.length);if(!(o<(d=b.length)+(m=y.length))){var A=e.slice(0,d),N=e.slice(o-m);if(b===A&&y===N)return v(b,t.slice(d,s-m),e.slice(d,o-m),y)}}return null}(t,g,m);if(A)return A}var N=o(t,g),E=t.substring(0,N);N=a(t=t.substring(N),g=g.substring(N));var _=t.substring(t.length-N),x=function(t,l){var c;if(!t)return[[n,l]];if(!l)return[[e,t]];var u=t.length>l.length?t:l,h=t.length>l.length?l:t,f=u.indexOf(h);if(-1!==f)return c=[[n,u.substring(0,f)],[r,h],[n,u.substring(f+h.length)]],t.length>l.length&&(c[0][0]=c[2][0]=e),c;if(1===h.length)return[[e,t],[n,l]];var d=function(t,e){var n=t.length>e.length?t:e,r=t.length>e.length?e:t;if(n.length<4||2*r.length=t.length?[r,i,s,l,h]:null}var s,l,c,u,h,f=i(n,r,Math.ceil(n.length/4)),d=i(n,r,Math.ceil(n.length/2));return f||d?(s=d?f&&f[4].length>d[4].length?f:d:f,t.length>e.length?(l=s[0],c=s[1],u=s[2],h=s[3]):(u=s[0],h=s[1],l=s[2],c=s[3]),[l,c,u,h,s[4]]):null}(t,l);if(d){var p=d[0],g=d[1],m=d[2],b=d[3],y=d[4],v=i(p,m),A=i(g,b);return v.concat([[r,y]],A)}return function(t,r){for(var i=t.length,o=r.length,l=Math.ceil((i+o)/2),a=l,c=2*l,u=new Array(c),h=new Array(c),f=0;fi)m+=2;else if(E>o)g+=2;else if(p&&(w=a+d-A)>=0&&w=(x=i-h[w]))return s(t,r,j,E)}for(var _=-v+b;_<=v-y;_+=2){for(var x,w=a+_,O=(x=_===-v||_!==v&&h[w-1]i)y+=2;else if(O>o)b+=2;else if(!p){var j;if((N=a+d-_)>=0&&N=(x=i-x))return s(t,r,j,E)}}}return[[e,t],[n,r]]}(t,l)}(t=t.substring(0,t.length-N),g=g.substring(0,g.length-N));return E&&x.unshift([r,E]),_&&x.push([r,_]),p(x,y),b&&function(t){for(var i=!1,s=[],o=0,g=null,m=0,b=0,y=0,v=0,A=0;m0?s[o-1]:-1,b=0,y=0,v=0,A=0,g=null,i=!0)),m++;for(i&&p(t),function(t){function e(t,e){if(!t||!e)return 6;var n=t.charAt(t.length-1),r=e.charAt(0),i=n.match(c),s=r.match(c),o=i&&n.match(u),l=s&&r.match(u),a=o&&n.match(h),p=l&&r.match(h),g=a&&t.match(f),m=p&&e.match(d);return g||m?5:a||p?4:i&&!o&&l?3:o||l?2:i||s?1:0}for(var n=1;n=y&&(y=v,g=i,m=s,b=o)}t[n-1][1]!=g&&(g?t[n-1][1]=g:(t.splice(n-1,1),n--),t[n][1]=m,b?t[n+1][1]=b:(t.splice(n+1,1),n--))}n++}}(t),m=1;m=x?(_>=N.length/2||_>=E.length/2)&&(t.splice(m,0,[r,E.substring(0,_)]),t[m-1][1]=N.substring(0,N.length-_),t[m+1][1]=E.substring(_),m++):(x>=N.length/2||x>=E.length/2)&&(t.splice(m,0,[r,N.substring(0,x)]),t[m-1][0]=n,t[m-1][1]=E.substring(0,E.length-x),t[m+1][0]=e,t[m+1][1]=N.substring(x),m++),m++}m++}}(x),x}function s(t,e,n,r){var s=t.substring(0,n),o=e.substring(0,r),l=t.substring(n),a=e.substring(r),c=i(s,o),u=i(l,a);return c.concat(u)}function o(t,e){if(!t||!e||t.charAt(0)!==e.charAt(0))return 0;for(var n=0,r=Math.min(t.length,e.length),i=r,s=0;nr?t=t.substring(n-r):n=0&&y(t[d][1])){var g=t[d][1].slice(-1);if(t[d][1]=t[d][1].slice(0,-1),h=g+h,f=g+f,!t[d][1]){t.splice(d,1),l--;var m=d-1;t[m]&&t[m][0]===n&&(u++,f=t[m][1]+f,m--),t[m]&&t[m][0]===e&&(c++,h=t[m][1]+h,m--),d=m}}b(t[l][1])&&(g=t[l][1].charAt(0),t[l][1]=t[l][1].slice(1),h+=g,f+=g)}if(l0||f.length>0){h.length>0&&f.length>0&&(0!==(s=o(f,h))&&(d>=0?t[d][1]+=f.substring(0,s):(t.splice(0,0,[r,f.substring(0,s)]),l++),f=f.substring(s),h=h.substring(s)),0!==(s=a(f,h))&&(t[l][1]=f.substring(f.length-s)+t[l][1],f=f.substring(0,f.length-s),h=h.substring(0,h.length-s)));var v=u+c;0===h.length&&0===f.length?(t.splice(l-v,v),l-=v):0===h.length?(t.splice(l-v,v,[n,f]),l=l-v+1):0===f.length?(t.splice(l-v,v,[e,h]),l=l-v+1):(t.splice(l-v,v,[e,h],[n,f]),l=l-v+2)}0!==l&&t[l-1][0]===r?(t[l-1][1]+=t[l][1],t.splice(l,1)):l++,u=0,c=0,h="",f=""}""===t[t.length-1][1]&&t.pop();var A=!1;for(l=1;l=55296&&t<=56319}function m(t){return t>=56320&&t<=57343}function b(t){return m(t.charCodeAt(0))}function y(t){return g(t.charCodeAt(t.length-1))}function v(t,i,s,o){return y(t)||b(o)?null:function(t){for(var e=[],n=0;n0&&e.push(t[n]);return e}([[r,t],[e,i],[n,s],[r,o]])}function A(t,e,n,r){return i(t,e,n,r,!0)}A.INSERT=n,A.DELETE=e,A.EQUAL=r,t.exports=A},9629:function(t,e,n){t=n.nmd(t);var r="__lodash_hash_undefined__",i=9007199254740991,s="[object Arguments]",o="[object Boolean]",l="[object Date]",a="[object Function]",c="[object GeneratorFunction]",u="[object Map]",h="[object Number]",f="[object Object]",d="[object Promise]",p="[object RegExp]",g="[object Set]",m="[object String]",b="[object Symbol]",y="[object WeakMap]",v="[object ArrayBuffer]",A="[object DataView]",N="[object Float32Array]",E="[object Float64Array]",_="[object Int8Array]",x="[object Int16Array]",w="[object Int32Array]",O="[object Uint8Array]",j="[object Uint8ClampedArray]",S="[object Uint16Array]",L="[object Uint32Array]",T=/\w*$/,k=/^\[object .+?Constructor\]$/,C=/^(?:0|[1-9]\d*)$/,R={};R[s]=R["[object Array]"]=R[v]=R[A]=R[o]=R[l]=R[N]=R[E]=R[_]=R[x]=R[w]=R[u]=R[h]=R[f]=R[p]=R[g]=R[m]=R[b]=R[O]=R[j]=R[S]=R[L]=!0,R["[object Error]"]=R[a]=R[y]=!1;var B="object"==typeof n.g&&n.g&&n.g.Object===Object&&n.g,q="object"==typeof self&&self&&self.Object===Object&&self,I=B||q||Function("return this")(),M=e&&!e.nodeType&&e,D=M&&t&&!t.nodeType&&t,U=D&&D.exports===M;function P(t,e){return t.set(e[0],e[1]),t}function z(t,e){return t.add(e),t}function F(t,e,n,r){var i=-1,s=t?t.length:0;for(r&&s&&(n=t[++i]);++i-1},jt.prototype.set=function(t,e){var n=this.__data__,r=kt(n,t);return r<0?n.push([t,e]):n[r][1]=e,this},St.prototype.clear=function(){this.__data__={hash:new Ot,map:new(pt||jt),string:new Ot}},St.prototype.delete=function(t){return qt(this,t).delete(t)},St.prototype.get=function(t){return qt(this,t).get(t)},St.prototype.has=function(t){return qt(this,t).has(t)},St.prototype.set=function(t,e){return qt(this,t).set(t,e),this},Lt.prototype.clear=function(){this.__data__=new jt},Lt.prototype.delete=function(t){return this.__data__.delete(t)},Lt.prototype.get=function(t){return this.__data__.get(t)},Lt.prototype.has=function(t){return this.__data__.has(t)},Lt.prototype.set=function(t,e){var n=this.__data__;if(n instanceof jt){var r=n.__data__;if(!pt||r.length<199)return r.push([t,e]),this;n=this.__data__=new St(r)}return n.set(t,e),this};var Mt=ut?V(ut,Object):function(){return[]},Dt=function(t){return et.call(t)};function Ut(t,e){return!!(e=null==e?i:e)&&("number"==typeof t||C.test(t))&&t>-1&&t%1==0&&t-1&&t%1==0&&t<=i}(t.length)&&!Ht(t)}var Vt=ht||function(){return!1};function Ht(t){var e=Wt(t)?et.call(t):"";return e==a||e==c}function Wt(t){var e=typeof t;return!!t&&("object"==e||"function"==e)}function Gt(t){return Kt(t)?function(t,e){var n=$t(t)||function(t){return function(t){return function(t){return!!t&&"object"==typeof t}(t)&&Kt(t)}(t)&&tt.call(t,"callee")&&(!at.call(t,"callee")||et.call(t)==s)}(t)?function(t,e){for(var n=-1,r=Array(t);++nc))return!1;var h=l.get(t);if(h&&l.get(e))return h==e;var f=-1,d=!0,p=n&s?new Ot:void 0;for(l.set(t,e),l.set(e,t);++f-1},xt.prototype.set=function(t,e){var n=this.__data__,r=St(n,t);return r<0?(++this.size,n.push([t,e])):n[r][1]=e,this},wt.prototype.clear=function(){this.size=0,this.__data__={hash:new _t,map:new(ht||xt),string:new _t}},wt.prototype.delete=function(t){var e=Bt(this,t).delete(t);return this.size-=e?1:0,e},wt.prototype.get=function(t){return Bt(this,t).get(t)},wt.prototype.has=function(t){return Bt(this,t).has(t)},wt.prototype.set=function(t,e){var n=Bt(this,t),r=n.size;return n.set(t,e),this.size+=n.size==r?0:1,this},Ot.prototype.add=Ot.prototype.push=function(t){return this.__data__.set(t,r),this},Ot.prototype.has=function(t){return this.__data__.has(t)},jt.prototype.clear=function(){this.__data__=new xt,this.size=0},jt.prototype.delete=function(t){var e=this.__data__,n=e.delete(t);return this.size=e.size,n},jt.prototype.get=function(t){return this.__data__.get(t)},jt.prototype.has=function(t){return this.__data__.has(t)},jt.prototype.set=function(t,e){var n=this.__data__;if(n instanceof xt){var r=n.__data__;if(!ht||r.length<199)return r.push([t,e]),this.size=++n.size,this;n=this.__data__=new wt(r)}return n.set(t,e),this.size=n.size,this};var It=lt?function(t){return null==t?[]:(t=Object(t),function(e,n){for(var r=-1,i=null==e?0:e.length,s=0,o=[];++r-1&&t%1==0&&t-1&&t%1==0&&t<=o}function Ht(t){var e=typeof t;return null!=t&&("object"==e||"function"==e)}function Wt(t){return null!=t&&"object"==typeof t}var Gt=U?function(t){return function(e){return t(e)}}(U):function(t){return Wt(t)&&Vt(t.length)&&!!T[Lt(t)]};function Xt(t){return null!=(e=t)&&Vt(e.length)&&!Kt(e)?function(t,e){var n=Ft(t),r=!n&&zt(t),i=!n&&!r&&$t(t),s=!n&&!r&&!i&&Gt(t),o=n||r||i||s,l=o?function(t,e){for(var n=-1,r=Array(t);++n(null!=i[e]&&(t[e]=i[e]),t)),{}));for(const n in t)void 0!==t[n]&&void 0===e[n]&&(i[n]=t[n]);return Object.keys(i).length>0?i:void 0},t.diff=function(t={},e={}){"object"!=typeof t&&(t={}),"object"!=typeof e&&(e={});const n=Object.keys(t).concat(Object.keys(e)).reduce(((n,r)=>(i(t[r],e[r])||(n[r]=void 0===e[r]?null:e[r]),n)),{});return Object.keys(n).length>0?n:void 0},t.invert=function(t={},e={}){t=t||{};const n=Object.keys(e).reduce(((n,r)=>(e[r]!==t[r]&&void 0!==t[r]&&(n[r]=e[r]),n)),{});return Object.keys(t).reduce(((n,r)=>(t[r]!==e[r]&&void 0===e[r]&&(n[r]=null),n)),n)},t.transform=function(t,e,n=!1){if("object"!=typeof t)return e;if("object"!=typeof e)return;if(!n)return e;const r=Object.keys(e).reduce(((n,r)=>(void 0===t[r]&&(n[r]=e[r]),n)),{});return Object.keys(r).length>0?r:void 0}}(s||(s={})),e.default=s},5232:function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.AttributeMap=e.OpIterator=e.Op=void 0;const r=n(5090),i=n(9629),s=n(4162),o=n(1270);e.AttributeMap=o.default;const l=n(4123);e.Op=l.default;const a=n(7033);e.OpIterator=a.default;const c=String.fromCharCode(0),u=(t,e)=>{if("object"!=typeof t||null===t)throw new Error("cannot retain a "+typeof t);if("object"!=typeof e||null===e)throw new Error("cannot retain a "+typeof e);const n=Object.keys(t)[0];if(!n||n!==Object.keys(e)[0])throw new Error(`embed types not matched: ${n} != ${Object.keys(e)[0]}`);return[n,t[n],e[n]]};class h{constructor(t){Array.isArray(t)?this.ops=t:null!=t&&Array.isArray(t.ops)?this.ops=t.ops:this.ops=[]}static registerEmbed(t,e){this.handlers[t]=e}static unregisterEmbed(t){delete this.handlers[t]}static getHandler(t){const e=this.handlers[t];if(!e)throw new Error(`no handlers for embed type "${t}"`);return e}insert(t,e){const n={};return"string"==typeof t&&0===t.length?this:(n.insert=t,null!=e&&"object"==typeof e&&Object.keys(e).length>0&&(n.attributes=e),this.push(n))}delete(t){return t<=0?this:this.push({delete:t})}retain(t,e){if("number"==typeof t&&t<=0)return this;const n={retain:t};return null!=e&&"object"==typeof e&&Object.keys(e).length>0&&(n.attributes=e),this.push(n)}push(t){let e=this.ops.length,n=this.ops[e-1];if(t=i(t),"object"==typeof n){if("number"==typeof t.delete&&"number"==typeof n.delete)return this.ops[e-1]={delete:n.delete+t.delete},this;if("number"==typeof n.delete&&null!=t.insert&&(e-=1,n=this.ops[e-1],"object"!=typeof n))return this.ops.unshift(t),this;if(s(t.attributes,n.attributes)){if("string"==typeof t.insert&&"string"==typeof n.insert)return this.ops[e-1]={insert:n.insert+t.insert},"object"==typeof t.attributes&&(this.ops[e-1].attributes=t.attributes),this;if("number"==typeof t.retain&&"number"==typeof n.retain)return this.ops[e-1]={retain:n.retain+t.retain},"object"==typeof t.attributes&&(this.ops[e-1].attributes=t.attributes),this}}return e===this.ops.length?this.ops.push(t):this.ops.splice(e,0,t),this}chop(){const t=this.ops[this.ops.length-1];return t&&"number"==typeof t.retain&&!t.attributes&&this.ops.pop(),this}filter(t){return this.ops.filter(t)}forEach(t){this.ops.forEach(t)}map(t){return this.ops.map(t)}partition(t){const e=[],n=[];return this.forEach((r=>{(t(r)?e:n).push(r)})),[e,n]}reduce(t,e){return this.ops.reduce(t,e)}changeLength(){return this.reduce(((t,e)=>e.insert?t+l.default.length(e):e.delete?t-e.delete:t),0)}length(){return this.reduce(((t,e)=>t+l.default.length(e)),0)}slice(t=0,e=1/0){const n=[],r=new a.default(this.ops);let i=0;for(;i0&&n.next(i.retain-t)}const l=new h(r);for(;e.hasNext()||n.hasNext();)if("insert"===n.peekType())l.push(n.next());else if("delete"===e.peekType())l.push(e.next());else{const t=Math.min(e.peekLength(),n.peekLength()),r=e.next(t),i=n.next(t);if(i.retain){const a={};if("number"==typeof r.retain)a.retain="number"==typeof i.retain?t:i.retain;else if("number"==typeof i.retain)null==r.retain?a.insert=r.insert:a.retain=r.retain;else{const t=null==r.retain?"insert":"retain",[e,n,s]=u(r[t],i.retain),o=h.getHandler(e);a[t]={[e]:o.compose(n,s,"retain"===t)}}const c=o.default.compose(r.attributes,i.attributes,"number"==typeof r.retain);if(c&&(a.attributes=c),l.push(a),!n.hasNext()&&s(l.ops[l.ops.length-1],a)){const t=new h(e.rest());return l.concat(t).chop()}}else"number"==typeof i.delete&&("number"==typeof r.retain||"object"==typeof r.retain&&null!==r.retain)&&l.push(i)}return l.chop()}concat(t){const e=new h(this.ops.slice());return t.ops.length>0&&(e.push(t.ops[0]),e.ops=e.ops.concat(t.ops.slice(1))),e}diff(t,e){if(this.ops===t.ops)return new h;const n=[this,t].map((e=>e.map((n=>{if(null!=n.insert)return"string"==typeof n.insert?n.insert:c;throw new Error("diff() called "+(e===t?"on":"with")+" non-document")})).join(""))),i=new h,l=r(n[0],n[1],e,!0),u=new a.default(this.ops),f=new a.default(t.ops);return l.forEach((t=>{let e=t[1].length;for(;e>0;){let n=0;switch(t[0]){case r.INSERT:n=Math.min(f.peekLength(),e),i.push(f.next(n));break;case r.DELETE:n=Math.min(e,u.peekLength()),u.next(n),i.delete(n);break;case r.EQUAL:n=Math.min(u.peekLength(),f.peekLength(),e);const t=u.next(n),l=f.next(n);s(t.insert,l.insert)?i.retain(n,o.default.diff(t.attributes,l.attributes)):i.push(l).delete(n)}e-=n}})),i.chop()}eachLine(t,e="\n"){const n=new a.default(this.ops);let r=new h,i=0;for(;n.hasNext();){if("insert"!==n.peekType())return;const s=n.peek(),o=l.default.length(s)-n.peekLength(),a="string"==typeof s.insert?s.insert.indexOf(e,o)-o:-1;if(a<0)r.push(n.next());else if(a>0)r.push(n.next(a));else{if(!1===t(r,n.next(1).attributes||{},i))return;i+=1,r=new h}}r.length()>0&&t(r,{},i)}invert(t){const e=new h;return this.reduce(((n,r)=>{if(r.insert)e.delete(l.default.length(r));else{if("number"==typeof r.retain&&null==r.attributes)return e.retain(r.retain),n+r.retain;if(r.delete||"number"==typeof r.retain){const i=r.delete||r.retain;return t.slice(n,n+i).forEach((t=>{r.delete?e.push(t):r.retain&&r.attributes&&e.retain(l.default.length(t),o.default.invert(r.attributes,t.attributes))})),n+i}if("object"==typeof r.retain&&null!==r.retain){const i=t.slice(n,n+1),s=new a.default(i.ops).next(),[l,c,f]=u(r.retain,s.insert),d=h.getHandler(l);return e.retain({[l]:d.invert(c,f)},o.default.invert(r.attributes,s.attributes)),n+1}}return n}),0),e.chop()}transform(t,e=!1){if(e=!!e,"number"==typeof t)return this.transformPosition(t,e);const n=t,r=new a.default(this.ops),i=new a.default(n.ops),s=new h;for(;r.hasNext()||i.hasNext();)if("insert"!==r.peekType()||!e&&"insert"===i.peekType())if("insert"===i.peekType())s.push(i.next());else{const t=Math.min(r.peekLength(),i.peekLength()),n=r.next(t),l=i.next(t);if(n.delete)continue;if(l.delete)s.push(l);else{const r=n.retain,i=l.retain;let a="object"==typeof i&&null!==i?i:t;if("object"==typeof r&&null!==r&&"object"==typeof i&&null!==i){const t=Object.keys(r)[0];if(t===Object.keys(i)[0]){const n=h.getHandler(t);n&&(a={[t]:n.transform(r[t],i[t],e)})}}s.retain(a,o.default.transform(n.attributes,l.attributes,e))}}else s.retain(l.default.length(r.next()));return s.chop()}transformPosition(t,e=!1){e=!!e;const n=new a.default(this.ops);let r=0;for(;n.hasNext()&&r<=t;){const i=n.peekLength(),s=n.peekType();n.next(),"delete"!==s?("insert"===s&&(r=i-n?(t=i-n,this.index+=1,this.offset=0):this.offset+=t,"number"==typeof e.delete)return{delete:t};{const r={};return e.attributes&&(r.attributes=e.attributes),"number"==typeof e.retain?r.retain=t:"object"==typeof e.retain&&null!==e.retain?r.retain=e.retain:"string"==typeof e.insert?r.insert=e.insert.substr(n,t):r.insert=e.insert,r}}return{retain:1/0}}peek(){return this.ops[this.index]}peekLength(){return this.ops[this.index]?r.default.length(this.ops[this.index])-this.offset:1/0}peekType(){const t=this.ops[this.index];return t?"number"==typeof t.delete?"delete":"number"==typeof t.retain||"object"==typeof t.retain&&null!==t.retain?"retain":"insert":"retain"}rest(){if(this.hasNext()){if(0===this.offset)return this.ops.slice(this.index);{const t=this.offset,e=this.index,n=this.next(),r=this.ops.slice(this.index);return this.offset=t,this.index=e,[n].concat(r)}}return[]}}},8820:function(t,e,n){"use strict";n.d(e,{A:function(){return l}});var r=n(8138),i=function(t,e){for(var n=t.length;n--;)if((0,r.A)(t[n][0],e))return n;return-1},s=Array.prototype.splice;function o(t){var e=-1,n=null==t?0:t.length;for(this.clear();++e-1},o.prototype.set=function(t,e){var n=this.__data__,r=i(n,t);return r<0?(++this.size,n.push([t,e])):n[r][1]=e,this};var l=o},2461:function(t,e,n){"use strict";var r=n(2281),i=n(5507),s=(0,r.A)(i.A,"Map");e.A=s},3558:function(t,e,n){"use strict";n.d(e,{A:function(){return f}});var r=(0,n(2281).A)(Object,"create"),i=Object.prototype.hasOwnProperty,s=Object.prototype.hasOwnProperty;function o(t){var e=-1,n=null==t?0:t.length;for(this.clear();++e-1&&t%1==0&&tc))return!1;var h=s.get(t),f=s.get(e);if(h&&f)return h==e&&f==t;var d=-1,p=!0,g=2&n?new o:void 0;for(s.set(t,e),s.set(e,t);++d-1&&t%1==0&&t<=9007199254740991}},659:function(t,e){"use strict";e.A=function(t){var e=typeof t;return null!=t&&("object"==e||"function"==e)}},7948:function(t,e){"use strict";e.A=function(t){return null!=t&&"object"==typeof t}},5755:function(t,e,n){"use strict";n.d(e,{A:function(){return u}});var r=n(2159),i=n(1628),s=n(7948),o={};o["[object Float32Array]"]=o["[object Float64Array]"]=o["[object Int8Array]"]=o["[object Int16Array]"]=o["[object Int32Array]"]=o["[object Uint8Array]"]=o["[object Uint8ClampedArray]"]=o["[object Uint16Array]"]=o["[object Uint32Array]"]=!0,o["[object Arguments]"]=o["[object Array]"]=o["[object ArrayBuffer]"]=o["[object Boolean]"]=o["[object DataView]"]=o["[object Date]"]=o["[object Error]"]=o["[object Function]"]=o["[object Map]"]=o["[object Number]"]=o["[object Object]"]=o["[object RegExp]"]=o["[object Set]"]=o["[object String]"]=o["[object WeakMap]"]=!1;var l=n(5771),a=n(8795),c=a.A&&a.A.isTypedArray,u=c?(0,l.A)(c):function(t){return(0,s.A)(t)&&(0,i.A)(t.length)&&!!o[(0,r.A)(t)]}},3169:function(t,e,n){"use strict";n.d(e,{A:function(){return a}});var r=n(6753),i=n(501),s=(0,n(2217).A)(Object.keys,Object),o=Object.prototype.hasOwnProperty,l=n(3628),a=function(t){return(0,l.A)(t)?(0,r.A)(t):function(t){if(!(0,i.A)(t))return s(t);var e=[];for(var n in Object(t))o.call(t,n)&&"constructor"!=n&&e.push(n);return e}(t)}},2624:function(t,e,n){"use strict";n.d(e,{A:function(){return c}});var r=n(6753),i=n(659),s=n(501),o=Object.prototype.hasOwnProperty,l=function(t){if(!(0,i.A)(t))return function(t){var e=[];if(null!=t)for(var n in Object(t))e.push(n);return e}(t);var e=(0,s.A)(t),n=[];for(var r in t)("constructor"!=r||!e&&o.call(t,r))&&n.push(r);return n},a=n(3628),c=function(t){return(0,a.A)(t)?(0,r.A)(t,!0):l(t)}},8347:function(t,e,n){"use strict";n.d(e,{A:function(){return K}});var r,i,s,o,l=n(2673),a=n(6770),c=n(8138),u=function(t,e,n){(void 0!==n&&!(0,c.A)(t[e],n)||void 0===n&&!(e in t))&&(0,a.A)(t,e,n)},h=function(t,e,n){for(var r=-1,i=Object(t),s=n(t),o=s.length;o--;){var l=s[++r];if(!1===e(i[l],l,i))break}return t},f=n(3812),d=n(1827),p=n(4405),g=n(1683),m=n(8412),b=n(723),y=n(3628),v=n(7948),A=n(776),N=n(7572),E=n(659),_=n(2159),x=n(8769),w=Function.prototype,O=Object.prototype,j=w.toString,S=O.hasOwnProperty,L=j.call(Object),T=n(5755),k=function(t,e){if(("constructor"!==e||"function"!=typeof t[e])&&"__proto__"!=e)return t[e]},C=n(9601),R=n(2624),B=function(t,e,n,r,i,s,o){var l,a=k(t,n),c=k(e,n),h=o.get(c);if(h)u(t,n,h);else{var w=s?s(a,c,n+"",t,e,o):void 0,O=void 0===w;if(O){var B=(0,b.A)(c),q=!B&&(0,A.A)(c),I=!B&&!q&&(0,T.A)(c);w=c,B||q||I?(0,b.A)(a)?w=a:(l=a,(0,v.A)(l)&&(0,y.A)(l)?w=(0,p.A)(a):q?(O=!1,w=(0,f.A)(c,!0)):I?(O=!1,w=(0,d.A)(c,!0)):w=[]):function(t){if(!(0,v.A)(t)||"[object Object]"!=(0,_.A)(t))return!1;var e=(0,x.A)(t);if(null===e)return!0;var n=S.call(e,"constructor")&&e.constructor;return"function"==typeof n&&n instanceof n&&j.call(n)==L}(c)||(0,m.A)(c)?(w=a,(0,m.A)(a)?w=function(t){return(0,C.A)(t,(0,R.A)(t))}(a):(0,E.A)(a)&&!(0,N.A)(a)||(w=(0,g.A)(c))):O=!1}O&&(o.set(c,w),i(w,c,r,s,o),o.delete(c)),u(t,n,w)}},q=function t(e,n,r,i,s){e!==n&&h(n,(function(o,a){if(s||(s=new l.A),(0,E.A)(o))B(e,n,a,r,t,i,s);else{var c=i?i(k(e,a),o,a+"",e,n,s):void 0;void 0===c&&(c=o),u(e,a,c)}}),R.A)},I=function(t){return t},M=Math.max,D=n(7889),U=D.A?function(t,e){return(0,D.A)(t,"toString",{configurable:!0,enumerable:!1,value:(n=e,function(){return n}),writable:!0});var n}:I,P=Date.now,z=(r=U,i=0,s=0,function(){var t=P(),e=16-(t-s);if(s=t,e>0){if(++i>=800)return arguments[0]}else i=0;return r.apply(void 0,arguments)}),F=function(t,e){return z(function(t,e,n){return e=M(void 0===e?t.length-1:e,0),function(){for(var r=arguments,i=-1,s=M(r.length-e,0),o=Array(s);++i1?e[r-1]:void 0,s=r>2?e[2]:void 0;for(i=o.length>3&&"function"==typeof i?(r--,i):void 0,s&&function(t,e,n){if(!(0,E.A)(n))return!1;var r=typeof e;return!!("number"==r?(0,y.A)(n)&&(0,$.A)(e,n.length):"string"==r&&e in n)&&(0,c.A)(n[e],t)}(e[0],e[1],s)&&(i=r<3?void 0:i,r=1),t=Object(t);++n(t[t.TYPE=3]="TYPE",t[t.LEVEL=12]="LEVEL",t[t.ATTRIBUTE=13]="ATTRIBUTE",t[t.BLOT=14]="BLOT",t[t.INLINE=7]="INLINE",t[t.BLOCK=11]="BLOCK",t[t.BLOCK_BLOT=10]="BLOCK_BLOT",t[t.INLINE_BLOT=6]="INLINE_BLOT",t[t.BLOCK_ATTRIBUTE=9]="BLOCK_ATTRIBUTE",t[t.INLINE_ATTRIBUTE=5]="INLINE_ATTRIBUTE",t[t.ANY=15]="ANY",t))(r||{});class i{constructor(t,e,n={}){this.attrName=t,this.keyName=e;const i=r.TYPE&r.ATTRIBUTE;this.scope=null!=n.scope?n.scope&r.LEVEL|i:r.ATTRIBUTE,null!=n.whitelist&&(this.whitelist=n.whitelist)}static keys(t){return Array.from(t.attributes).map((t=>t.name))}add(t,e){return!!this.canAdd(t,e)&&(t.setAttribute(this.keyName,e),!0)}canAdd(t,e){return null==this.whitelist||("string"==typeof e?this.whitelist.indexOf(e.replace(/["']/g,""))>-1:this.whitelist.indexOf(e)>-1)}remove(t){t.removeAttribute(this.keyName)}value(t){const e=t.getAttribute(this.keyName);return this.canAdd(t,e)&&e?e:""}}class s extends Error{constructor(t){super(t="[Parchment] "+t),this.message=t,this.name=this.constructor.name}}const o=class t{constructor(){this.attributes={},this.classes={},this.tags={},this.types={}}static find(t,e=!1){if(null==t)return null;if(this.blots.has(t))return this.blots.get(t)||null;if(e){let n=null;try{n=t.parentNode}catch{return null}return this.find(n,e)}return null}create(e,n,r){const i=this.query(n);if(null==i)throw new s(`Unable to create ${n} blot`);const o=i,l=n instanceof Node||n.nodeType===Node.TEXT_NODE?n:o.create(r),a=new o(e,l,r);return t.blots.set(a.domNode,a),a}find(e,n=!1){return t.find(e,n)}query(t,e=r.ANY){let n;return"string"==typeof t?n=this.types[t]||this.attributes[t]:t instanceof Text||t.nodeType===Node.TEXT_NODE?n=this.types.text:"number"==typeof t?t&r.LEVEL&r.BLOCK?n=this.types.block:t&r.LEVEL&r.INLINE&&(n=this.types.inline):t instanceof Element&&((t.getAttribute("class")||"").split(/\s+/).some((t=>(n=this.classes[t],!!n))),n=n||this.tags[t.tagName]),null==n?null:"scope"in n&&e&r.LEVEL&n.scope&&e&r.TYPE&n.scope?n:null}register(...t){return t.map((t=>{const e="blotName"in t,n="attrName"in t;if(!e&&!n)throw new s("Invalid definition");if(e&&"abstract"===t.blotName)throw new s("Cannot register abstract class");const r=e?t.blotName:n?t.attrName:void 0;return this.types[r]=t,n?"string"==typeof t.keyName&&(this.attributes[t.keyName]=t):e&&(t.className&&(this.classes[t.className]=t),t.tagName&&(Array.isArray(t.tagName)?t.tagName=t.tagName.map((t=>t.toUpperCase())):t.tagName=t.tagName.toUpperCase(),(Array.isArray(t.tagName)?t.tagName:[t.tagName]).forEach((e=>{(null==this.tags[e]||null==t.className)&&(this.tags[e]=t)})))),t}))}};o.blots=new WeakMap;let l=o;function a(t,e){return(t.getAttribute("class")||"").split(/\s+/).filter((t=>0===t.indexOf(`${e}-`)))}const c=class extends i{static keys(t){return(t.getAttribute("class")||"").split(/\s+/).map((t=>t.split("-").slice(0,-1).join("-")))}add(t,e){return!!this.canAdd(t,e)&&(this.remove(t),t.classList.add(`${this.keyName}-${e}`),!0)}remove(t){a(t,this.keyName).forEach((e=>{t.classList.remove(e)})),0===t.classList.length&&t.removeAttribute("class")}value(t){const e=(a(t,this.keyName)[0]||"").slice(this.keyName.length+1);return this.canAdd(t,e)?e:""}};function u(t){const e=t.split("-"),n=e.slice(1).map((t=>t[0].toUpperCase()+t.slice(1))).join("");return e[0]+n}const h=class extends i{static keys(t){return(t.getAttribute("style")||"").split(";").map((t=>t.split(":")[0].trim()))}add(t,e){return!!this.canAdd(t,e)&&(t.style[u(this.keyName)]=e,!0)}remove(t){t.style[u(this.keyName)]="",t.getAttribute("style")||t.removeAttribute("style")}value(t){const e=t.style[u(this.keyName)];return this.canAdd(t,e)?e:""}},f=class{constructor(t){this.attributes={},this.domNode=t,this.build()}attribute(t,e){e?t.add(this.domNode,e)&&(null!=t.value(this.domNode)?this.attributes[t.attrName]=t:delete this.attributes[t.attrName]):(t.remove(this.domNode),delete this.attributes[t.attrName])}build(){this.attributes={};const t=l.find(this.domNode);if(null==t)return;const e=i.keys(this.domNode),n=c.keys(this.domNode),s=h.keys(this.domNode);e.concat(n).concat(s).forEach((e=>{const n=t.scroll.query(e,r.ATTRIBUTE);n instanceof i&&(this.attributes[n.attrName]=n)}))}copy(t){Object.keys(this.attributes).forEach((e=>{const n=this.attributes[e].value(this.domNode);t.format(e,n)}))}move(t){this.copy(t),Object.keys(this.attributes).forEach((t=>{this.attributes[t].remove(this.domNode)})),this.attributes={}}values(){return Object.keys(this.attributes).reduce(((t,e)=>(t[e]=this.attributes[e].value(this.domNode),t)),{})}},d=class{constructor(t,e){this.scroll=t,this.domNode=e,l.blots.set(e,this),this.prev=null,this.next=null}static create(t){if(null==this.tagName)throw new s("Blot definition missing tagName");let e,n;return Array.isArray(this.tagName)?("string"==typeof t?(n=t.toUpperCase(),parseInt(n,10).toString()===n&&(n=parseInt(n,10))):"number"==typeof t&&(n=t),e="number"==typeof n?document.createElement(this.tagName[n-1]):n&&this.tagName.indexOf(n)>-1?document.createElement(n):document.createElement(this.tagName[0])):e=document.createElement(this.tagName),this.className&&e.classList.add(this.className),e}get statics(){return this.constructor}attach(){}clone(){const t=this.domNode.cloneNode(!1);return this.scroll.create(t)}detach(){null!=this.parent&&this.parent.removeChild(this),l.blots.delete(this.domNode)}deleteAt(t,e){this.isolate(t,e).remove()}formatAt(t,e,n,i){const s=this.isolate(t,e);if(null!=this.scroll.query(n,r.BLOT)&&i)s.wrap(n,i);else if(null!=this.scroll.query(n,r.ATTRIBUTE)){const t=this.scroll.create(this.statics.scope);s.wrap(t),t.format(n,i)}}insertAt(t,e,n){const r=null==n?this.scroll.create("text",e):this.scroll.create(e,n),i=this.split(t);this.parent.insertBefore(r,i||void 0)}isolate(t,e){const n=this.split(t);if(null==n)throw new Error("Attempt to isolate at end");return n.split(e),n}length(){return 1}offset(t=this.parent){return null==this.parent||this===t?0:this.parent.children.offset(this)+this.parent.offset(t)}optimize(t){this.statics.requiredContainer&&!(this.parent instanceof this.statics.requiredContainer)&&this.wrap(this.statics.requiredContainer.blotName)}remove(){null!=this.domNode.parentNode&&this.domNode.parentNode.removeChild(this.domNode),this.detach()}replaceWith(t,e){const n="string"==typeof t?this.scroll.create(t,e):t;return null!=this.parent&&(this.parent.insertBefore(n,this.next||void 0),this.remove()),n}split(t,e){return 0===t?this:this.next}update(t,e){}wrap(t,e){const n="string"==typeof t?this.scroll.create(t,e):t;if(null!=this.parent&&this.parent.insertBefore(n,this.next||void 0),"function"!=typeof n.appendChild)throw new s(`Cannot wrap ${t}`);return n.appendChild(this),n}};d.blotName="abstract";let p=d;const g=class extends p{static value(t){return!0}index(t,e){return this.domNode===t||this.domNode.compareDocumentPosition(t)&Node.DOCUMENT_POSITION_CONTAINED_BY?Math.min(e,1):-1}position(t,e){let n=Array.from(this.parent.domNode.childNodes).indexOf(this.domNode);return t>0&&(n+=1),[this.parent.domNode,n]}value(){return{[this.statics.blotName]:this.statics.value(this.domNode)||!0}}};g.scope=r.INLINE_BLOT;const m=g;class b{constructor(){this.head=null,this.tail=null,this.length=0}append(...t){if(this.insertBefore(t[0],null),t.length>1){const e=t.slice(1);this.append(...e)}}at(t){const e=this.iterator();let n=e();for(;n&&t>0;)t-=1,n=e();return n}contains(t){const e=this.iterator();let n=e();for(;n;){if(n===t)return!0;n=e()}return!1}indexOf(t){const e=this.iterator();let n=e(),r=0;for(;n;){if(n===t)return r;r+=1,n=e()}return-1}insertBefore(t,e){null!=t&&(this.remove(t),t.next=e,null!=e?(t.prev=e.prev,null!=e.prev&&(e.prev.next=t),e.prev=t,e===this.head&&(this.head=t)):null!=this.tail?(this.tail.next=t,t.prev=this.tail,this.tail=t):(t.prev=null,this.head=this.tail=t),this.length+=1)}offset(t){let e=0,n=this.head;for(;null!=n;){if(n===t)return e;e+=n.length(),n=n.next}return-1}remove(t){this.contains(t)&&(null!=t.prev&&(t.prev.next=t.next),null!=t.next&&(t.next.prev=t.prev),t===this.head&&(this.head=t.next),t===this.tail&&(this.tail=t.prev),this.length-=1)}iterator(t=this.head){return()=>{const e=t;return null!=t&&(t=t.next),e}}find(t,e=!1){const n=this.iterator();let r=n();for(;r;){const i=r.length();if(ts?n(l,t-s,Math.min(e,s+r-t)):n(l,0,Math.min(r,t+e-s)),s+=r,l=o()}}map(t){return this.reduce(((e,n)=>(e.push(t(n)),e)),[])}reduce(t,e){const n=this.iterator();let r=n();for(;r;)e=t(e,r),r=n();return e}}function y(t,e){const n=e.find(t);if(n)return n;try{return e.create(t)}catch{const n=e.create(r.INLINE);return Array.from(t.childNodes).forEach((t=>{n.domNode.appendChild(t)})),t.parentNode&&t.parentNode.replaceChild(n.domNode,t),n.attach(),n}}const v=class t extends p{constructor(t,e){super(t,e),this.uiNode=null,this.build()}appendChild(t){this.insertBefore(t)}attach(){super.attach(),this.children.forEach((t=>{t.attach()}))}attachUI(e){null!=this.uiNode&&this.uiNode.remove(),this.uiNode=e,t.uiClass&&this.uiNode.classList.add(t.uiClass),this.uiNode.setAttribute("contenteditable","false"),this.domNode.insertBefore(this.uiNode,this.domNode.firstChild)}build(){this.children=new b,Array.from(this.domNode.childNodes).filter((t=>t!==this.uiNode)).reverse().forEach((t=>{try{const e=y(t,this.scroll);this.insertBefore(e,this.children.head||void 0)}catch(t){if(t instanceof s)return;throw t}}))}deleteAt(t,e){if(0===t&&e===this.length())return this.remove();this.children.forEachAt(t,e,((t,e,n)=>{t.deleteAt(e,n)}))}descendant(e,n=0){const[r,i]=this.children.find(n);return null==e.blotName&&e(r)||null!=e.blotName&&r instanceof e?[r,i]:r instanceof t?r.descendant(e,i):[null,-1]}descendants(e,n=0,r=Number.MAX_VALUE){let i=[],s=r;return this.children.forEachAt(n,r,((n,r,o)=>{(null==e.blotName&&e(n)||null!=e.blotName&&n instanceof e)&&i.push(n),n instanceof t&&(i=i.concat(n.descendants(e,r,s))),s-=o})),i}detach(){this.children.forEach((t=>{t.detach()})),super.detach()}enforceAllowedChildren(){let e=!1;this.children.forEach((n=>{e||this.statics.allowedChildren.some((t=>n instanceof t))||(n.statics.scope===r.BLOCK_BLOT?(null!=n.next&&this.splitAfter(n),null!=n.prev&&this.splitAfter(n.prev),n.parent.unwrap(),e=!0):n instanceof t?n.unwrap():n.remove())}))}formatAt(t,e,n,r){this.children.forEachAt(t,e,((t,e,i)=>{t.formatAt(e,i,n,r)}))}insertAt(t,e,n){const[r,i]=this.children.find(t);if(r)r.insertAt(i,e,n);else{const t=null==n?this.scroll.create("text",e):this.scroll.create(e,n);this.appendChild(t)}}insertBefore(t,e){null!=t.parent&&t.parent.children.remove(t);let n=null;this.children.insertBefore(t,e||null),t.parent=this,null!=e&&(n=e.domNode),(this.domNode.parentNode!==t.domNode||this.domNode.nextSibling!==n)&&this.domNode.insertBefore(t.domNode,n),t.attach()}length(){return this.children.reduce(((t,e)=>t+e.length()),0)}moveChildren(t,e){this.children.forEach((n=>{t.insertBefore(n,e)}))}optimize(t){if(super.optimize(t),this.enforceAllowedChildren(),null!=this.uiNode&&this.uiNode!==this.domNode.firstChild&&this.domNode.insertBefore(this.uiNode,this.domNode.firstChild),0===this.children.length)if(null!=this.statics.defaultChild){const t=this.scroll.create(this.statics.defaultChild.blotName);this.appendChild(t)}else this.remove()}path(e,n=!1){const[r,i]=this.children.find(e,n),s=[[this,e]];return r instanceof t?s.concat(r.path(i,n)):(null!=r&&s.push([r,i]),s)}removeChild(t){this.children.remove(t)}replaceWith(e,n){const r="string"==typeof e?this.scroll.create(e,n):e;return r instanceof t&&this.moveChildren(r),super.replaceWith(r)}split(t,e=!1){if(!e){if(0===t)return this;if(t===this.length())return this.next}const n=this.clone();return this.parent&&this.parent.insertBefore(n,this.next||void 0),this.children.forEachAt(t,this.length(),((t,r,i)=>{const s=t.split(r,e);null!=s&&n.appendChild(s)})),n}splitAfter(t){const e=this.clone();for(;null!=t.next;)e.appendChild(t.next);return this.parent&&this.parent.insertBefore(e,this.next||void 0),e}unwrap(){this.parent&&this.moveChildren(this.parent,this.next||void 0),this.remove()}update(t,e){const n=[],r=[];t.forEach((t=>{t.target===this.domNode&&"childList"===t.type&&(n.push(...t.addedNodes),r.push(...t.removedNodes))})),r.forEach((t=>{if(null!=t.parentNode&&"IFRAME"!==t.tagName&&document.body.compareDocumentPosition(t)&Node.DOCUMENT_POSITION_CONTAINED_BY)return;const e=this.scroll.find(t);null!=e&&(null==e.domNode.parentNode||e.domNode.parentNode===this.domNode)&&e.detach()})),n.filter((t=>t.parentNode===this.domNode&&t!==this.uiNode)).sort(((t,e)=>t===e?0:t.compareDocumentPosition(e)&Node.DOCUMENT_POSITION_FOLLOWING?1:-1)).forEach((t=>{let e=null;null!=t.nextSibling&&(e=this.scroll.find(t.nextSibling));const n=y(t,this.scroll);(n.next!==e||null==n.next)&&(null!=n.parent&&n.parent.removeChild(this),this.insertBefore(n,e||void 0))})),this.enforceAllowedChildren()}};v.uiClass="";const A=v,N=class t extends A{static create(t){return super.create(t)}static formats(e,n){const r=n.query(t.blotName);if(null==r||e.tagName!==r.tagName){if("string"==typeof this.tagName)return!0;if(Array.isArray(this.tagName))return e.tagName.toLowerCase()}}constructor(t,e){super(t,e),this.attributes=new f(this.domNode)}format(e,n){if(e!==this.statics.blotName||n){const t=this.scroll.query(e,r.INLINE);if(null==t)return;t instanceof i?this.attributes.attribute(t,n):n&&(e!==this.statics.blotName||this.formats()[e]!==n)&&this.replaceWith(e,n)}else this.children.forEach((e=>{e instanceof t||(e=e.wrap(t.blotName,!0)),this.attributes.copy(e)})),this.unwrap()}formats(){const t=this.attributes.values(),e=this.statics.formats(this.domNode,this.scroll);return null!=e&&(t[this.statics.blotName]=e),t}formatAt(t,e,n,i){null!=this.formats()[n]||this.scroll.query(n,r.ATTRIBUTE)?this.isolate(t,e).format(n,i):super.formatAt(t,e,n,i)}optimize(e){super.optimize(e);const n=this.formats();if(0===Object.keys(n).length)return this.unwrap();const r=this.next;r instanceof t&&r.prev===this&&function(t,e){if(Object.keys(t).length!==Object.keys(e).length)return!1;for(const n in t)if(t[n]!==e[n])return!1;return!0}(n,r.formats())&&(r.moveChildren(this),r.remove())}replaceWith(t,e){const n=super.replaceWith(t,e);return this.attributes.copy(n),n}update(t,e){super.update(t,e),t.some((t=>t.target===this.domNode&&"attributes"===t.type))&&this.attributes.build()}wrap(e,n){const r=super.wrap(e,n);return r instanceof t&&this.attributes.move(r),r}};N.allowedChildren=[N,m],N.blotName="inline",N.scope=r.INLINE_BLOT,N.tagName="SPAN";const E=N,_=class t extends A{static create(t){return super.create(t)}static formats(e,n){const r=n.query(t.blotName);if(null==r||e.tagName!==r.tagName){if("string"==typeof this.tagName)return!0;if(Array.isArray(this.tagName))return e.tagName.toLowerCase()}}constructor(t,e){super(t,e),this.attributes=new f(this.domNode)}format(e,n){const s=this.scroll.query(e,r.BLOCK);null!=s&&(s instanceof i?this.attributes.attribute(s,n):e!==this.statics.blotName||n?n&&(e!==this.statics.blotName||this.formats()[e]!==n)&&this.replaceWith(e,n):this.replaceWith(t.blotName))}formats(){const t=this.attributes.values(),e=this.statics.formats(this.domNode,this.scroll);return null!=e&&(t[this.statics.blotName]=e),t}formatAt(t,e,n,i){null!=this.scroll.query(n,r.BLOCK)?this.format(n,i):super.formatAt(t,e,n,i)}insertAt(t,e,n){if(null==n||null!=this.scroll.query(e,r.INLINE))super.insertAt(t,e,n);else{const r=this.split(t);if(null==r)throw new Error("Attempt to insertAt after block boundaries");{const t=this.scroll.create(e,n);r.parent.insertBefore(t,r)}}}replaceWith(t,e){const n=super.replaceWith(t,e);return this.attributes.copy(n),n}update(t,e){super.update(t,e),t.some((t=>t.target===this.domNode&&"attributes"===t.type))&&this.attributes.build()}};_.blotName="block",_.scope=r.BLOCK_BLOT,_.tagName="P",_.allowedChildren=[E,_,m];const x=_,w=class extends A{checkMerge(){return null!==this.next&&this.next.statics.blotName===this.statics.blotName}deleteAt(t,e){super.deleteAt(t,e),this.enforceAllowedChildren()}formatAt(t,e,n,r){super.formatAt(t,e,n,r),this.enforceAllowedChildren()}insertAt(t,e,n){super.insertAt(t,e,n),this.enforceAllowedChildren()}optimize(t){super.optimize(t),this.children.length>0&&null!=this.next&&this.checkMerge()&&(this.next.moveChildren(this),this.next.remove())}};w.blotName="container",w.scope=r.BLOCK_BLOT;const O=w,j=class extends m{static formats(t,e){}format(t,e){super.formatAt(0,this.length(),t,e)}formatAt(t,e,n,r){0===t&&e===this.length()?this.format(n,r):super.formatAt(t,e,n,r)}formats(){return this.statics.formats(this.domNode,this.scroll)}},S={attributes:!0,characterData:!0,characterDataOldValue:!0,childList:!0,subtree:!0},L=class extends A{constructor(t,e){super(null,e),this.registry=t,this.scroll=this,this.build(),this.observer=new MutationObserver((t=>{this.update(t)})),this.observer.observe(this.domNode,S),this.attach()}create(t,e){return this.registry.create(this,t,e)}find(t,e=!1){const n=this.registry.find(t,e);return n?n.scroll===this?n:e?this.find(n.scroll.domNode.parentNode,!0):null:null}query(t,e=r.ANY){return this.registry.query(t,e)}register(...t){return this.registry.register(...t)}build(){null!=this.scroll&&super.build()}detach(){super.detach(),this.observer.disconnect()}deleteAt(t,e){this.update(),0===t&&e===this.length()?this.children.forEach((t=>{t.remove()})):super.deleteAt(t,e)}formatAt(t,e,n,r){this.update(),super.formatAt(t,e,n,r)}insertAt(t,e,n){this.update(),super.insertAt(t,e,n)}optimize(t=[],e={}){super.optimize(e);const n=e.mutationsMap||new WeakMap;let r=Array.from(this.observer.takeRecords());for(;r.length>0;)t.push(r.pop());const i=(t,e=!0)=>{null==t||t===this||null!=t.domNode.parentNode&&(n.has(t.domNode)||n.set(t.domNode,[]),e&&i(t.parent))},s=t=>{n.has(t.domNode)&&(t instanceof A&&t.children.forEach(s),n.delete(t.domNode),t.optimize(e))};let o=t;for(let e=0;o.length>0;e+=1){if(e>=100)throw new Error("[Parchment] Maximum optimize iterations reached");for(o.forEach((t=>{const e=this.find(t.target,!0);null!=e&&(e.domNode===t.target&&("childList"===t.type?(i(this.find(t.previousSibling,!1)),Array.from(t.addedNodes).forEach((t=>{const e=this.find(t,!1);i(e,!1),e instanceof A&&e.children.forEach((t=>{i(t,!1)}))}))):"attributes"===t.type&&i(e.prev)),i(e))})),this.children.forEach(s),o=Array.from(this.observer.takeRecords()),r=o.slice();r.length>0;)t.push(r.pop())}}update(t,e={}){t=t||this.observer.takeRecords();const n=new WeakMap;t.map((t=>{const e=this.find(t.target,!0);return null==e?null:n.has(e.domNode)?(n.get(e.domNode).push(t),null):(n.set(e.domNode,[t]),e)})).forEach((t=>{null!=t&&t!==this&&n.has(t.domNode)&&t.update(n.get(t.domNode)||[],e)})),e.mutationsMap=n,n.has(this.domNode)&&super.update(n.get(this.domNode),e),this.optimize(t,e)}};L.blotName="scroll",L.defaultChild=x,L.allowedChildren=[x,O],L.scope=r.BLOCK_BLOT,L.tagName="DIV";const T=L,k=class t extends m{static create(t){return document.createTextNode(t)}static value(t){return t.data}constructor(t,e){super(t,e),this.text=this.statics.value(this.domNode)}deleteAt(t,e){this.domNode.data=this.text=this.text.slice(0,t)+this.text.slice(t+e)}index(t,e){return this.domNode===t?e:-1}insertAt(t,e,n){null==n?(this.text=this.text.slice(0,t)+e+this.text.slice(t),this.domNode.data=this.text):super.insertAt(t,e,n)}length(){return this.text.length}optimize(e){super.optimize(e),this.text=this.statics.value(this.domNode),0===this.text.length?this.remove():this.next instanceof t&&this.next.prev===this&&(this.insertAt(this.length(),this.next.value()),this.next.remove())}position(t,e=!1){return[this.domNode,t]}split(t,e=!1){if(!e){if(0===t)return this;if(t===this.length())return this.next}const n=this.scroll.create(this.domNode.splitText(t));return this.parent.insertBefore(n,this.next||void 0),this.text=this.statics.value(this.domNode),n}update(t,e){t.some((t=>"characterData"===t.type&&t.target===this.domNode))&&(this.text=this.statics.value(this.domNode))}value(){return this.text}};k.blotName="text",k.scope=r.INLINE_BLOT;const C=k}},e={};function n(r){var i=e[r];if(void 0!==i)return i.exports;var s=e[r]={id:r,loaded:!1,exports:{}};return t[r](s,s.exports,n),s.loaded=!0,s.exports}n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,{a:e}),e},n.d=function(t,e){for(var r in e)n.o(e,r)&&!n.o(t,r)&&Object.defineProperty(t,r,{enumerable:!0,get:e[r]})},n.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(t){if("object"==typeof window)return window}}(),n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},n.nmd=function(t){return t.paths=[],t.children||(t.children=[]),t};var r={};return function(){"use strict";n.d(r,{default:function(){return R}});var t=n(6142),e=n(9698),i=n(3036),s=n(580),o=n(4541),l=n(746),a=n(4850),c=n(6003),u=n(5232),h=n.n(u),f=n(5374);function d(t){return t instanceof e.Ay||t instanceof e.zo}function p(t){return"function"==typeof t.updateContent}class g extends c.ScrollBlot{static blotName="scroll";static className="ql-editor";static tagName="DIV";static defaultChild=e.Ay;static allowedChildren=[e.Ay,e.zo,s.A];constructor(t,e,n){let{emitter:r}=n;super(t,e),this.emitter=r,this.batch=!1,this.optimize(),this.enable(),this.domNode.addEventListener("dragstart",(t=>this.handleDragStart(t)))}batchStart(){Array.isArray(this.batch)||(this.batch=[])}batchEnd(){if(!this.batch)return;const t=this.batch;this.batch=!1,this.update(t)}emitMount(t){this.emitter.emit(f.A.events.SCROLL_BLOT_MOUNT,t)}emitUnmount(t){this.emitter.emit(f.A.events.SCROLL_BLOT_UNMOUNT,t)}emitEmbedUpdate(t,e){this.emitter.emit(f.A.events.SCROLL_EMBED_UPDATE,t,e)}deleteAt(t,n){const[r,s]=this.line(t),[o]=this.line(t+n);if(super.deleteAt(t,n),null!=o&&r!==o&&s>0){if(r instanceof e.zo||o instanceof e.zo)return void this.optimize();const t=o.children.head instanceof i.A?null:o.children.head;r.moveChildren(o,t),r.remove()}this.optimize()}enable(){let t=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];this.domNode.setAttribute("contenteditable",t?"true":"false")}formatAt(t,e,n,r){super.formatAt(t,e,n,r),this.optimize()}insertAt(t,e,n){if(t>=this.length())if(null==n||null==this.scroll.query(e,c.Scope.BLOCK)){const t=this.scroll.create(this.statics.defaultChild.blotName);this.appendChild(t),null==n&&e.endsWith("\n")?t.insertAt(0,e.slice(0,-1),n):t.insertAt(0,e,n)}else{const t=this.scroll.create(e,n);this.appendChild(t)}else super.insertAt(t,e,n);this.optimize()}insertBefore(t,e){if(t.statics.scope===c.Scope.INLINE_BLOT){const n=this.scroll.create(this.statics.defaultChild.blotName);n.appendChild(t),super.insertBefore(n,e)}else super.insertBefore(t,e)}insertContents(t,n){const r=this.deltaToRenderBlocks(n.concat((new(h())).insert("\n"))),i=r.pop();if(null==i)return;this.batchStart();const s=r.shift();if(s){const n="block"===s.type&&(0===s.delta.length()||!this.descendant(e.zo,t)[0]&&t{this.formatAt(o-1,1,t,a[t])})),t=o}let[o,l]=this.children.find(t);r.length&&(o&&(o=o.split(l),l=0),r.forEach((t=>{if("block"===t.type)m(this.createBlock(t.attributes,o||void 0),0,t.delta);else{const e=this.create(t.key,t.value);this.insertBefore(e,o||void 0),Object.keys(t.attributes).forEach((n=>{e.format(n,t.attributes[n])}))}}))),"block"===i.type&&i.delta.length()&&m(this,o?o.offset(o.scroll)+l:this.length(),i.delta),this.batchEnd(),this.optimize()}isEnabled(){return"true"===this.domNode.getAttribute("contenteditable")}leaf(t){const e=this.path(t).pop();if(!e)return[null,-1];const[n,r]=e;return n instanceof c.LeafBlot?[n,r]:[null,-1]}line(t){return t===this.length()?this.line(t-1):this.descendant(d,t)}lines(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:Number.MAX_VALUE;const n=(t,e,r)=>{let i=[],s=r;return t.children.forEachAt(e,r,((t,e,r)=>{d(t)?i.push(t):t instanceof c.ContainerBlot&&(i=i.concat(n(t,e,s))),s-=r})),i};return n(this,t,e)}optimize(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};this.batch||(super.optimize(t,e),t.length>0&&this.emitter.emit(f.A.events.SCROLL_OPTIMIZE,t,e))}path(t){return super.path(t).slice(1)}remove(){}update(t){if(this.batch)return void(Array.isArray(t)&&(this.batch=this.batch.concat(t)));let e=f.A.sources.USER;"string"==typeof t&&(e=t),Array.isArray(t)||(t=this.observer.takeRecords()),(t=t.filter((t=>{let{target:e}=t;const n=this.find(e,!0);return n&&!p(n)}))).length>0&&this.emitter.emit(f.A.events.SCROLL_BEFORE_UPDATE,e,t),super.update(t.concat([])),t.length>0&&this.emitter.emit(f.A.events.SCROLL_UPDATE,e,t)}updateEmbedAt(t,n,r){const[i]=this.descendant((t=>t instanceof e.zo),t);i&&i.statics.blotName===n&&p(i)&&i.updateContent(r)}handleDragStart(t){t.preventDefault()}deltaToRenderBlocks(t){const e=[];let n=new(h());return t.forEach((t=>{const r=t?.insert;if(r)if("string"==typeof r){const i=r.split("\n");i.slice(0,-1).forEach((r=>{n.insert(r,t.attributes),e.push({type:"block",delta:n,attributes:t.attributes??{}}),n=new(h())}));const s=i[i.length-1];s&&n.insert(s,t.attributes)}else{const i=Object.keys(r)[0];if(!i)return;this.query(i,c.Scope.INLINE)?n.push(t):(n.length()&&e.push({type:"block",delta:n,attributes:{}}),n=new(h()),e.push({type:"blockEmbed",key:i,value:r[i],attributes:t.attributes??{}}))}})),n.length()&&e.push({type:"block",delta:n,attributes:{}}),e}createBlock(t,e){let n;const r={};Object.entries(t).forEach((t=>{let[e,i]=t;null!=this.query(e,c.Scope.BLOCK&c.Scope.BLOT)?n=e:r[e]=i}));const i=this.create(n||this.statics.defaultChild.blotName,n?t[n]:void 0);this.insertBefore(i,e||void 0);const s=i.length();return Object.entries(r).forEach((t=>{let[e,n]=t;i.formatAt(0,s,e,n)})),i}}function m(t,n,r){r.reduce(((n,r)=>{const i=u.Op.length(r);let s=r.attributes||{};if(null!=r.insert)if("string"==typeof r.insert){const i=r.insert;t.insertAt(n,i);const[o]=t.descendant(c.LeafBlot,n),l=(0,e.Ji)(o);s=u.AttributeMap.diff(l,s)||{}}else if("object"==typeof r.insert){const i=Object.keys(r.insert)[0];if(null==i)return n;if(t.insertAt(n,i,r.insert[i]),null!=t.scroll.query(i,c.Scope.INLINE)){const[r]=t.descendant(c.LeafBlot,n),i=(0,e.Ji)(r);s=u.AttributeMap.diff(i,s)||{}}}return Object.keys(s).forEach((e=>{t.formatAt(n,i,e,s[e])})),n+i}),n)}var b=g,y=n(5508),v=n(584),A=n(4266);class N extends A.A{static DEFAULTS={delay:1e3,maxStack:100,userOnly:!1};lastRecorded=0;ignoreChange=!1;stack={undo:[],redo:[]};currentRange=null;constructor(e,n){super(e,n),this.quill.on(t.Ay.events.EDITOR_CHANGE,((e,n,r,i)=>{e===t.Ay.events.SELECTION_CHANGE?n&&i!==t.Ay.sources.SILENT&&(this.currentRange=n):e===t.Ay.events.TEXT_CHANGE&&(this.ignoreChange||(this.options.userOnly&&i!==t.Ay.sources.USER?this.transform(n):this.record(n,r)),this.currentRange=_(this.currentRange,n))})),this.quill.keyboard.addBinding({key:"z",shortKey:!0},this.undo.bind(this)),this.quill.keyboard.addBinding({key:["z","Z"],shortKey:!0,shiftKey:!0},this.redo.bind(this)),/Win/i.test(navigator.platform)&&this.quill.keyboard.addBinding({key:"y",shortKey:!0},this.redo.bind(this)),this.quill.root.addEventListener("beforeinput",(t=>{"historyUndo"===t.inputType?(this.undo(),t.preventDefault()):"historyRedo"===t.inputType&&(this.redo(),t.preventDefault())}))}change(e,n){if(0===this.stack[e].length)return;const r=this.stack[e].pop();if(!r)return;const i=this.quill.getContents(),s=r.delta.invert(i);this.stack[n].push({delta:s,range:_(r.range,s)}),this.lastRecorded=0,this.ignoreChange=!0,this.quill.updateContents(r.delta,t.Ay.sources.USER),this.ignoreChange=!1,this.restoreSelection(r)}clear(){this.stack={undo:[],redo:[]}}cutoff(){this.lastRecorded=0}record(t,e){if(0===t.ops.length)return;this.stack.redo=[];let n=t.invert(e),r=this.currentRange;const i=Date.now();if(this.lastRecorded+this.options.delay>i&&this.stack.undo.length>0){const t=this.stack.undo.pop();t&&(n=n.compose(t.delta),r=t.range)}else this.lastRecorded=i;0!==n.length()&&(this.stack.undo.push({delta:n,range:r}),this.stack.undo.length>this.options.maxStack&&this.stack.undo.shift())}redo(){this.change("redo","undo")}transform(t){E(this.stack.undo,t),E(this.stack.redo,t)}undo(){this.change("undo","redo")}restoreSelection(e){if(e.range)this.quill.setSelection(e.range,t.Ay.sources.USER);else{const n=function(t,e){const n=e.reduce(((t,e)=>t+(e.delete||0)),0);let r=e.length()-n;return function(t,e){const n=e.ops[e.ops.length-1];return null!=n&&(null!=n.insert?"string"==typeof n.insert&&n.insert.endsWith("\n"):null!=n.attributes&&Object.keys(n.attributes).some((e=>null!=t.query(e,c.Scope.BLOCK))))}(t,e)&&(r-=1),r}(this.quill.scroll,e.delta);this.quill.setSelection(n,t.Ay.sources.USER)}}}function E(t,e){let n=e;for(let e=t.length-1;e>=0;e-=1){const r=t[e];t[e]={delta:n.transform(r.delta,!0),range:r.range&&_(r.range,n)},n=r.delta.transform(n),0===t[e].delta.length()&&t.splice(e,1)}}function _(t,e){if(!t)return t;const n=e.transformPosition(t.index);return{index:n,length:e.transformPosition(t.index+t.length)-n}}var x=n(8123);class w extends A.A{constructor(t,e){super(t,e),t.root.addEventListener("drop",(e=>{e.preventDefault();let n=null;if(document.caretRangeFromPoint)n=document.caretRangeFromPoint(e.clientX,e.clientY);else if(document.caretPositionFromPoint){const t=document.caretPositionFromPoint(e.clientX,e.clientY);n=document.createRange(),n.setStart(t.offsetNode,t.offset),n.setEnd(t.offsetNode,t.offset)}const r=n&&t.selection.normalizeNative(n);if(r){const n=t.selection.normalizedToRange(r);e.dataTransfer?.files&&this.upload(n,e.dataTransfer.files)}}))}upload(t,e){const n=[];Array.from(e).forEach((t=>{t&&this.options.mimetypes?.includes(t.type)&&n.push(t)})),n.length>0&&this.options.handler.call(this,t,n)}}w.DEFAULTS={mimetypes:["image/png","image/jpeg"],handler(t,e){if(!this.quill.scroll.query("image"))return;const n=e.map((t=>new Promise((e=>{const n=new FileReader;n.onload=()=>{e(n.result)},n.readAsDataURL(t)}))));Promise.all(n).then((e=>{const n=e.reduce(((t,e)=>t.insert({image:e})),(new(h())).retain(t.index).delete(t.length));this.quill.updateContents(n,f.A.sources.USER),this.quill.setSelection(t.index+e.length,f.A.sources.SILENT)}))}};var O=w;const j=["insertText","insertReplacementText"];class S extends A.A{constructor(e,n){super(e,n),e.root.addEventListener("beforeinput",(t=>{this.handleBeforeInput(t)})),/Android/i.test(navigator.userAgent)||e.on(t.Ay.events.COMPOSITION_BEFORE_START,(()=>{this.handleCompositionStart()}))}deleteRange(t){(0,x.Xo)({range:t,quill:this.quill})}replaceText(e){let n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";if(0===e.length)return!1;if(n){const r=this.quill.getFormat(e.index,1);this.deleteRange(e),this.quill.updateContents((new(h())).retain(e.index).insert(n,r),t.Ay.sources.USER)}else this.deleteRange(e);return this.quill.setSelection(e.index+n.length,0,t.Ay.sources.SILENT),!0}handleBeforeInput(t){if(this.quill.composition.isComposing||t.defaultPrevented||!j.includes(t.inputType))return;const e=t.getTargetRanges?t.getTargetRanges()[0]:null;if(!e||!0===e.collapsed)return;const n=function(t){return"string"==typeof t.data?t.data:t.dataTransfer?.types.includes("text/plain")?t.dataTransfer.getData("text/plain"):null}(t);if(null==n)return;const r=this.quill.selection.normalizeNative(e),i=r?this.quill.selection.normalizedToRange(r):null;i&&this.replaceText(i,n)&&t.preventDefault()}handleCompositionStart(){const t=this.quill.getSelection();t&&this.replaceText(t)}}var L=S;const T=/Mac/i.test(navigator.platform);class k extends A.A{isListening=!1;selectionChangeDeadline=0;constructor(t,e){super(t,e),this.handleArrowKeys(),this.handleNavigationShortcuts()}handleArrowKeys(){this.quill.keyboard.addBinding({key:["ArrowLeft","ArrowRight"],offset:0,shiftKey:null,handler(e,n){let{line:r,event:i}=n;if(!(r instanceof c.ParentBlot&&r.uiNode))return!0;const s="rtl"===getComputedStyle(r.domNode).direction;return!!(s&&"ArrowRight"!==i.key||!s&&"ArrowLeft"!==i.key)||(this.quill.setSelection(e.index-1,e.length+(i.shiftKey?1:0),t.Ay.sources.USER),!1)}})}handleNavigationShortcuts(){this.quill.root.addEventListener("keydown",(t=>{!t.defaultPrevented&&(t=>"ArrowLeft"===t.key||"ArrowRight"===t.key||"ArrowUp"===t.key||"ArrowDown"===t.key||"Home"===t.key||!(!T||"a"!==t.key||!0!==t.ctrlKey))(t)&&this.ensureListeningToSelectionChange()}))}ensureListeningToSelectionChange(){this.selectionChangeDeadline=Date.now()+100,this.isListening||(this.isListening=!0,document.addEventListener("selectionchange",(()=>{this.isListening=!1,Date.now()<=this.selectionChangeDeadline&&this.handleSelectionChange()}),{once:!0}))}handleSelectionChange(){const t=document.getSelection();if(!t)return;const e=t.getRangeAt(0);if(!0!==e.collapsed||0!==e.startOffset)return;const n=this.quill.scroll.find(e.startContainer);if(!(n instanceof c.ParentBlot&&n.uiNode))return;const r=document.createRange();r.setStartAfter(n.uiNode),r.setEndAfter(n.uiNode),t.removeAllRanges(),t.addRange(r)}}var C=k;t.Ay.register({"blots/block":e.Ay,"blots/block/embed":e.zo,"blots/break":i.A,"blots/container":s.A,"blots/cursor":o.A,"blots/embed":l.A,"blots/inline":a.A,"blots/scroll":b,"blots/text":y.A,"modules/clipboard":v.Ay,"modules/history":N,"modules/keyboard":x.Ay,"modules/uploader":O,"modules/input":L,"modules/uiNode":C});var R=t.Ay}(),r.default}()})); +//# sourceMappingURL=quill.core.js.map \ No newline at end of file diff --git a/public/assets/quill/dist/quill.core.js.LICENSE.txt b/public/assets/quill/dist/quill.core.js.LICENSE.txt new file mode 100644 index 0000000..c086972 --- /dev/null +++ b/public/assets/quill/dist/quill.core.js.LICENSE.txt @@ -0,0 +1,7 @@ +/*! + * Quill Editor v2.0.3 + * https://quilljs.com + * Copyright (c) 2017-2024, Slab + * Copyright (c) 2014, Jason Chen + * Copyright (c) 2013, salesforce.com + */ diff --git a/public/assets/quill/dist/quill.core.js.map b/public/assets/quill/dist/quill.core.js.map new file mode 100644 index 0000000..a258cfb --- /dev/null +++ b/public/assets/quill/dist/quill.core.js.map @@ -0,0 +1 @@ +{"version":3,"file":"quill.core.js","mappings":"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","sources":["webpack://Quill/webpack/universalModuleDefinition","webpack://Quill/./src/blots/block.ts","webpack://Quill/./src/blots/break.ts","webpack://Quill/./src/blots/container.ts","webpack://Quill/./src/blots/cursor.ts","webpack://Quill/./src/blots/embed.ts","webpack://Quill/./src/blots/inline.ts","webpack://Quill/./src/blots/text.ts","webpack://Quill/./src/core/emitter.ts","webpack://Quill/./src/core/instances.ts","webpack://Quill/./src/core/logger.ts","webpack://Quill/./src/core/module.ts","webpack://Quill/./src/core/editor.ts","webpack://Quill/./src/core/composition.ts","webpack://Quill/./src/core/utils/scrollRectIntoView.ts","webpack://Quill/./src/core/utils/createRegistryWithFormats.ts","webpack://Quill/./src/core/quill.ts","webpack://Quill/./src/core/selection.ts","webpack://Quill/./src/core/theme.ts","webpack://Quill/./src/formats/align.ts","webpack://Quill/./src/formats/background.ts","webpack://Quill/./src/formats/code.ts","webpack://Quill/./src/formats/color.ts","webpack://Quill/./src/formats/direction.ts","webpack://Quill/./src/formats/font.ts","webpack://Quill/./src/formats/size.ts","webpack://Quill/./src/modules/normalizeExternalHTML/normalizers/googleDocs.ts","webpack://Quill/./src/modules/normalizeExternalHTML/normalizers/msWord.ts","webpack://Quill/./src/modules/normalizeExternalHTML/index.ts","webpack://Quill/./src/modules/clipboard.ts","webpack://Quill/./src/modules/keyboard.ts","webpack://Quill/../../node_modules/eventemitter3/index.js","webpack://Quill/../../node_modules/fast-diff/diff.js","webpack://Quill/../../node_modules/lodash.clonedeep/index.js","webpack://Quill/../../node_modules/lodash.isequal/index.js","webpack://Quill/../../node_modules/quill-delta/src/AttributeMap.ts","webpack://Quill/../../node_modules/quill-delta/src/Delta.ts","webpack://Quill/../../node_modules/quill-delta/src/Op.ts","webpack://Quill/../../node_modules/quill-delta/src/OpIterator.ts","webpack://Quill/../../node_modules/lodash-es/_listCacheClear.js","webpack://Quill/../../node_modules/lodash-es/_assocIndexOf.js","webpack://Quill/../../node_modules/lodash-es/_listCacheDelete.js","webpack://Quill/../../node_modules/lodash-es/_ListCache.js","webpack://Quill/../../node_modules/lodash-es/_listCacheGet.js","webpack://Quill/../../node_modules/lodash-es/_listCacheHas.js","webpack://Quill/../../node_modules/lodash-es/_listCacheSet.js","webpack://Quill/../../node_modules/lodash-es/_Map.js","webpack://Quill/../../node_modules/lodash-es/_nativeCreate.js","webpack://Quill/../../node_modules/lodash-es/_hashGet.js","webpack://Quill/../../node_modules/lodash-es/_hashHas.js","webpack://Quill/../../node_modules/lodash-es/_Hash.js","webpack://Quill/../../node_modules/lodash-es/_hashClear.js","webpack://Quill/../../node_modules/lodash-es/_hashDelete.js","webpack://Quill/../../node_modules/lodash-es/_hashSet.js","webpack://Quill/../../node_modules/lodash-es/_getMapData.js","webpack://Quill/../../node_modules/lodash-es/_isKeyable.js","webpack://Quill/../../node_modules/lodash-es/_MapCache.js","webpack://Quill/../../node_modules/lodash-es/_mapCacheClear.js","webpack://Quill/../../node_modules/lodash-es/_mapCacheDelete.js","webpack://Quill/../../node_modules/lodash-es/_mapCacheGet.js","webpack://Quill/../../node_modules/lodash-es/_mapCacheHas.js","webpack://Quill/../../node_modules/lodash-es/_mapCacheSet.js","webpack://Quill/../../node_modules/lodash-es/_Stack.js","webpack://Quill/../../node_modules/lodash-es/_stackClear.js","webpack://Quill/../../node_modules/lodash-es/_stackDelete.js","webpack://Quill/../../node_modules/lodash-es/_stackGet.js","webpack://Quill/../../node_modules/lodash-es/_stackHas.js","webpack://Quill/../../node_modules/lodash-es/_stackSet.js","webpack://Quill/../../node_modules/lodash-es/_Symbol.js","webpack://Quill/../../node_modules/lodash-es/_Uint8Array.js","webpack://Quill/../../node_modules/lodash-es/_baseTimes.js","webpack://Quill/../../node_modules/lodash-es/_arrayLikeKeys.js","webpack://Quill/../../node_modules/lodash-es/_arrayPush.js","webpack://Quill/../../node_modules/lodash-es/_assignValue.js","webpack://Quill/../../node_modules/lodash-es/_baseAssignValue.js","webpack://Quill/../../node_modules/lodash-es/_baseGetAllKeys.js","webpack://Quill/../../node_modules/lodash-es/_getRawTag.js","webpack://Quill/../../node_modules/lodash-es/_objectToString.js","webpack://Quill/../../node_modules/lodash-es/_baseGetTag.js","webpack://Quill/../../node_modules/lodash-es/_baseUnary.js","webpack://Quill/../../node_modules/lodash-es/_cloneArrayBuffer.js","webpack://Quill/../../node_modules/lodash-es/_cloneBuffer.js","webpack://Quill/../../node_modules/lodash-es/_cloneTypedArray.js","webpack://Quill/../../node_modules/lodash-es/_copyArray.js","webpack://Quill/../../node_modules/lodash-es/_copyObject.js","webpack://Quill/../../node_modules/lodash-es/_defineProperty.js","webpack://Quill/../../node_modules/lodash-es/_freeGlobal.js","webpack://Quill/../../node_modules/lodash-es/_getAllKeys.js","webpack://Quill/../../node_modules/lodash-es/_isMasked.js","webpack://Quill/../../node_modules/lodash-es/_coreJsData.js","webpack://Quill/../../node_modules/lodash-es/_baseIsNative.js","webpack://Quill/../../node_modules/lodash-es/_getNative.js","webpack://Quill/../../node_modules/lodash-es/_getValue.js","webpack://Quill/../../node_modules/lodash-es/_getPrototype.js","webpack://Quill/../../node_modules/lodash-es/_arrayFilter.js","webpack://Quill/../../node_modules/lodash-es/_getSymbols.js","webpack://Quill/../../node_modules/lodash-es/_DataView.js","webpack://Quill/../../node_modules/lodash-es/_Promise.js","webpack://Quill/../../node_modules/lodash-es/_Set.js","webpack://Quill/../../node_modules/lodash-es/_WeakMap.js","webpack://Quill/../../node_modules/lodash-es/_getTag.js","webpack://Quill/../../node_modules/lodash-es/_baseCreate.js","webpack://Quill/../../node_modules/lodash-es/_initCloneObject.js","webpack://Quill/../../node_modules/lodash-es/_isIndex.js","webpack://Quill/../../node_modules/lodash-es/_isPrototype.js","webpack://Quill/../../node_modules/lodash-es/_nodeUtil.js","webpack://Quill/../../node_modules/lodash-es/_overArg.js","webpack://Quill/../../node_modules/lodash-es/_root.js","webpack://Quill/../../node_modules/lodash-es/_toSource.js","webpack://Quill/../../node_modules/lodash-es/_getSymbolsIn.js","webpack://Quill/../../node_modules/lodash-es/_getAllKeysIn.js","webpack://Quill/../../node_modules/lodash-es/_initCloneArray.js","webpack://Quill/../../node_modules/lodash-es/_cloneRegExp.js","webpack://Quill/../../node_modules/lodash-es/_cloneSymbol.js","webpack://Quill/../../node_modules/lodash-es/_initCloneByTag.js","webpack://Quill/../../node_modules/lodash-es/_cloneDataView.js","webpack://Quill/../../node_modules/lodash-es/isMap.js","webpack://Quill/../../node_modules/lodash-es/_baseIsMap.js","webpack://Quill/../../node_modules/lodash-es/isSet.js","webpack://Quill/../../node_modules/lodash-es/_baseIsSet.js","webpack://Quill/../../node_modules/lodash-es/_baseClone.js","webpack://Quill/../../node_modules/lodash-es/_copySymbolsIn.js","webpack://Quill/../../node_modules/lodash-es/_baseAssignIn.js","webpack://Quill/../../node_modules/lodash-es/_copySymbols.js","webpack://Quill/../../node_modules/lodash-es/_baseAssign.js","webpack://Quill/../../node_modules/lodash-es/_arrayEach.js","webpack://Quill/../../node_modules/lodash-es/cloneDeep.js","webpack://Quill/../../node_modules/lodash-es/eq.js","webpack://Quill/../../node_modules/lodash-es/_baseIsArguments.js","webpack://Quill/../../node_modules/lodash-es/isArguments.js","webpack://Quill/../../node_modules/lodash-es/isArray.js","webpack://Quill/../../node_modules/lodash-es/isArrayLike.js","webpack://Quill/../../node_modules/lodash-es/isBuffer.js","webpack://Quill/../../node_modules/lodash-es/stubFalse.js","webpack://Quill/../../node_modules/lodash-es/_SetCache.js","webpack://Quill/../../node_modules/lodash-es/_setCacheAdd.js","webpack://Quill/../../node_modules/lodash-es/_setCacheHas.js","webpack://Quill/../../node_modules/lodash-es/_arraySome.js","webpack://Quill/../../node_modules/lodash-es/_equalArrays.js","webpack://Quill/../../node_modules/lodash-es/_cacheHas.js","webpack://Quill/../../node_modules/lodash-es/_mapToArray.js","webpack://Quill/../../node_modules/lodash-es/_setToArray.js","webpack://Quill/../../node_modules/lodash-es/_equalByTag.js","webpack://Quill/../../node_modules/lodash-es/_equalObjects.js","webpack://Quill/../../node_modules/lodash-es/_baseIsEqualDeep.js","webpack://Quill/../../node_modules/lodash-es/_baseIsEqual.js","webpack://Quill/../../node_modules/lodash-es/isEqual.js","webpack://Quill/../../node_modules/lodash-es/isFunction.js","webpack://Quill/../../node_modules/lodash-es/isLength.js","webpack://Quill/../../node_modules/lodash-es/isObject.js","webpack://Quill/../../node_modules/lodash-es/isObjectLike.js","webpack://Quill/../../node_modules/lodash-es/_baseIsTypedArray.js","webpack://Quill/../../node_modules/lodash-es/isTypedArray.js","webpack://Quill/../../node_modules/lodash-es/_nativeKeys.js","webpack://Quill/../../node_modules/lodash-es/_baseKeys.js","webpack://Quill/../../node_modules/lodash-es/keys.js","webpack://Quill/../../node_modules/lodash-es/_baseKeysIn.js","webpack://Quill/../../node_modules/lodash-es/_nativeKeysIn.js","webpack://Quill/../../node_modules/lodash-es/keysIn.js","webpack://Quill/../../node_modules/lodash-es/_shortOut.js","webpack://Quill/../../node_modules/lodash-es/_createAssigner.js","webpack://Quill/../../node_modules/lodash-es/_assignMergeValue.js","webpack://Quill/../../node_modules/lodash-es/_baseFor.js","webpack://Quill/../../node_modules/lodash-es/_createBaseFor.js","webpack://Quill/../../node_modules/lodash-es/isPlainObject.js","webpack://Quill/../../node_modules/lodash-es/_safeGet.js","webpack://Quill/../../node_modules/lodash-es/_baseMergeDeep.js","webpack://Quill/../../node_modules/lodash-es/isArrayLikeObject.js","webpack://Quill/../../node_modules/lodash-es/toPlainObject.js","webpack://Quill/../../node_modules/lodash-es/_baseMerge.js","webpack://Quill/../../node_modules/lodash-es/identity.js","webpack://Quill/../../node_modules/lodash-es/_overRest.js","webpack://Quill/../../node_modules/lodash-es/_baseSetToString.js","webpack://Quill/../../node_modules/lodash-es/constant.js","webpack://Quill/../../node_modules/lodash-es/_setToString.js","webpack://Quill/../../node_modules/lodash-es/_baseRest.js","webpack://Quill/../../node_modules/lodash-es/_apply.js","webpack://Quill/../../node_modules/lodash-es/merge.js","webpack://Quill/../../node_modules/lodash-es/_isIterateeCall.js","webpack://Quill/../../node_modules/lodash-es/stubArray.js","webpack://Quill/../../node_modules/parchment/src/scope.ts","webpack://Quill/../../node_modules/parchment/src/attributor/attributor.ts","webpack://Quill/../../node_modules/parchment/src/error.ts","webpack://Quill/../../node_modules/parchment/src/registry.ts","webpack://Quill/../../node_modules/parchment/src/attributor/class.ts","webpack://Quill/../../node_modules/parchment/src/attributor/style.ts","webpack://Quill/../../node_modules/parchment/src/attributor/store.ts","webpack://Quill/../../node_modules/parchment/src/blot/abstract/shadow.ts","webpack://Quill/../../node_modules/parchment/src/blot/abstract/leaf.ts","webpack://Quill/../../node_modules/parchment/src/collection/linked-list.ts","webpack://Quill/../../node_modules/parchment/src/blot/abstract/parent.ts","webpack://Quill/../../node_modules/parchment/src/blot/inline.ts","webpack://Quill/../../node_modules/parchment/src/blot/block.ts","webpack://Quill/../../node_modules/parchment/src/blot/abstract/container.ts","webpack://Quill/../../node_modules/parchment/src/blot/embed.ts","webpack://Quill/../../node_modules/parchment/src/blot/scroll.ts","webpack://Quill/../../node_modules/parchment/src/blot/text.ts","webpack://Quill/webpack/bootstrap","webpack://Quill/webpack/runtime/compat get default export","webpack://Quill/webpack/runtime/define property getters","webpack://Quill/webpack/runtime/global","webpack://Quill/webpack/runtime/hasOwnProperty shorthand","webpack://Quill/webpack/runtime/make namespace object","webpack://Quill/webpack/runtime/node module decorator","webpack://Quill/./src/blots/scroll.ts","webpack://Quill/./src/modules/history.ts","webpack://Quill/./src/modules/uploader.ts","webpack://Quill/./src/modules/input.ts","webpack://Quill/./src/modules/uiNode.ts","webpack://Quill/./src/core.ts"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"Quill\"] = factory();\n\telse\n\t\troot[\"Quill\"] = factory();\n})(self, function() {\nreturn ","import {\n AttributorStore,\n BlockBlot,\n EmbedBlot,\n LeafBlot,\n Scope,\n} from 'parchment';\nimport type { Blot, Parent } from 'parchment';\nimport Delta from 'quill-delta';\nimport Break from './break.js';\nimport Inline from './inline.js';\nimport TextBlot from './text.js';\n\nconst NEWLINE_LENGTH = 1;\n\nclass Block extends BlockBlot {\n cache: { delta?: Delta | null; length?: number } = {};\n\n delta(): Delta {\n if (this.cache.delta == null) {\n this.cache.delta = blockDelta(this);\n }\n return this.cache.delta;\n }\n\n deleteAt(index: number, length: number) {\n super.deleteAt(index, length);\n this.cache = {};\n }\n\n formatAt(index: number, length: number, name: string, value: unknown) {\n if (length <= 0) return;\n if (this.scroll.query(name, Scope.BLOCK)) {\n if (index + length === this.length()) {\n this.format(name, value);\n }\n } else {\n super.formatAt(\n index,\n Math.min(length, this.length() - index - 1),\n name,\n value,\n );\n }\n this.cache = {};\n }\n\n insertAt(index: number, value: string, def?: unknown) {\n if (def != null) {\n super.insertAt(index, value, def);\n this.cache = {};\n return;\n }\n if (value.length === 0) return;\n const lines = value.split('\\n');\n const text = lines.shift() as string;\n if (text.length > 0) {\n if (index < this.length() - 1 || this.children.tail == null) {\n super.insertAt(Math.min(index, this.length() - 1), text);\n } else {\n this.children.tail.insertAt(this.children.tail.length(), text);\n }\n this.cache = {};\n }\n // TODO: Fix this next time the file is edited.\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n let block: Blot | this = this;\n lines.reduce((lineIndex, line) => {\n // @ts-expect-error Fix me later\n block = block.split(lineIndex, true);\n block.insertAt(0, line);\n return line.length;\n }, index + text.length);\n }\n\n insertBefore(blot: Blot, ref?: Blot | null) {\n const { head } = this.children;\n super.insertBefore(blot, ref);\n if (head instanceof Break) {\n head.remove();\n }\n this.cache = {};\n }\n\n length() {\n if (this.cache.length == null) {\n this.cache.length = super.length() + NEWLINE_LENGTH;\n }\n return this.cache.length;\n }\n\n moveChildren(target: Parent, ref?: Blot | null) {\n super.moveChildren(target, ref);\n this.cache = {};\n }\n\n optimize(context: { [key: string]: any }) {\n super.optimize(context);\n this.cache = {};\n }\n\n path(index: number) {\n return super.path(index, true);\n }\n\n removeChild(child: Blot) {\n super.removeChild(child);\n this.cache = {};\n }\n\n split(index: number, force: boolean | undefined = false): Blot | null {\n if (force && (index === 0 || index >= this.length() - NEWLINE_LENGTH)) {\n const clone = this.clone();\n if (index === 0) {\n this.parent.insertBefore(clone, this);\n return this;\n }\n this.parent.insertBefore(clone, this.next);\n return clone;\n }\n const next = super.split(index, force);\n this.cache = {};\n return next;\n }\n}\nBlock.blotName = 'block';\nBlock.tagName = 'P';\nBlock.defaultChild = Break;\nBlock.allowedChildren = [Break, Inline, EmbedBlot, TextBlot];\n\nclass BlockEmbed extends EmbedBlot {\n attributes: AttributorStore;\n domNode: HTMLElement;\n\n attach() {\n super.attach();\n this.attributes = new AttributorStore(this.domNode);\n }\n\n delta() {\n return new Delta().insert(this.value(), {\n ...this.formats(),\n ...this.attributes.values(),\n });\n }\n\n format(name: string, value: unknown) {\n const attribute = this.scroll.query(name, Scope.BLOCK_ATTRIBUTE);\n if (attribute != null) {\n // @ts-expect-error TODO: Scroll#query() should return Attributor when scope is attribute\n this.attributes.attribute(attribute, value);\n }\n }\n\n formatAt(index: number, length: number, name: string, value: unknown) {\n this.format(name, value);\n }\n\n insertAt(index: number, value: string, def?: unknown) {\n if (def != null) {\n super.insertAt(index, value, def);\n return;\n }\n const lines = value.split('\\n');\n const text = lines.pop();\n const blocks = lines.map((line) => {\n const block = this.scroll.create(Block.blotName);\n block.insertAt(0, line);\n return block;\n });\n const ref = this.split(index);\n blocks.forEach((block) => {\n this.parent.insertBefore(block, ref);\n });\n if (text) {\n this.parent.insertBefore(this.scroll.create('text', text), ref);\n }\n }\n}\nBlockEmbed.scope = Scope.BLOCK_BLOT;\n// It is important for cursor behavior BlockEmbeds use tags that are block level elements\n\nfunction blockDelta(blot: BlockBlot, filter = true) {\n return blot\n .descendants(LeafBlot)\n .reduce((delta, leaf) => {\n if (leaf.length() === 0) {\n return delta;\n }\n return delta.insert(leaf.value(), bubbleFormats(leaf, {}, filter));\n }, new Delta())\n .insert('\\n', bubbleFormats(blot));\n}\n\nfunction bubbleFormats(\n blot: Blot | null,\n formats: Record = {},\n filter = true,\n): Record {\n if (blot == null) return formats;\n if ('formats' in blot && typeof blot.formats === 'function') {\n formats = {\n ...formats,\n ...blot.formats(),\n };\n if (filter) {\n // exclude syntax highlighting from deltas and getFormat()\n delete formats['code-token'];\n }\n }\n if (\n blot.parent == null ||\n blot.parent.statics.blotName === 'scroll' ||\n blot.parent.statics.scope !== blot.statics.scope\n ) {\n return formats;\n }\n return bubbleFormats(blot.parent, formats, filter);\n}\n\nexport { blockDelta, bubbleFormats, BlockEmbed, Block as default };\n","import { EmbedBlot } from 'parchment';\n\nclass Break extends EmbedBlot {\n static value() {\n return undefined;\n }\n\n optimize() {\n if (this.prev || this.next) {\n this.remove();\n }\n }\n\n length() {\n return 0;\n }\n\n value() {\n return '';\n }\n}\nBreak.blotName = 'break';\nBreak.tagName = 'BR';\n\nexport default Break;\n","import { ContainerBlot } from 'parchment';\n\nclass Container extends ContainerBlot {}\n\nexport default Container;\n","import { EmbedBlot, Scope } from 'parchment';\nimport type { Parent, ScrollBlot } from 'parchment';\nimport type Selection from '../core/selection.js';\nimport TextBlot from './text.js';\nimport type { EmbedContextRange } from './embed.js';\n\nclass Cursor extends EmbedBlot {\n static blotName = 'cursor';\n static className = 'ql-cursor';\n static tagName = 'span';\n static CONTENTS = '\\uFEFF'; // Zero width no break space\n\n static value() {\n return undefined;\n }\n\n selection: Selection;\n textNode: Text;\n savedLength: number;\n\n constructor(scroll: ScrollBlot, domNode: HTMLElement, selection: Selection) {\n super(scroll, domNode);\n this.selection = selection;\n this.textNode = document.createTextNode(Cursor.CONTENTS);\n this.domNode.appendChild(this.textNode);\n this.savedLength = 0;\n }\n\n detach() {\n // super.detach() will also clear domNode.__blot\n if (this.parent != null) this.parent.removeChild(this);\n }\n\n format(name: string, value: unknown) {\n if (this.savedLength !== 0) {\n super.format(name, value);\n return;\n }\n // TODO: Fix this next time the file is edited.\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n let target: Parent | this = this;\n let index = 0;\n while (target != null && target.statics.scope !== Scope.BLOCK_BLOT) {\n index += target.offset(target.parent);\n target = target.parent;\n }\n if (target != null) {\n this.savedLength = Cursor.CONTENTS.length;\n // @ts-expect-error TODO: allow empty context in Parchment\n target.optimize();\n target.formatAt(index, Cursor.CONTENTS.length, name, value);\n this.savedLength = 0;\n }\n }\n\n index(node: Node, offset: number) {\n if (node === this.textNode) return 0;\n return super.index(node, offset);\n }\n\n length() {\n return this.savedLength;\n }\n\n position(): [Text, number] {\n return [this.textNode, this.textNode.data.length];\n }\n\n remove() {\n super.remove();\n // @ts-expect-error Fix me later\n this.parent = null;\n }\n\n restore(): EmbedContextRange | null {\n if (this.selection.composing || this.parent == null) return null;\n const range = this.selection.getNativeRange();\n // Browser may push down styles/nodes inside the cursor blot.\n // https://dvcs.w3.org/hg/editing/raw-file/tip/editing.html#push-down-values\n while (\n this.domNode.lastChild != null &&\n this.domNode.lastChild !== this.textNode\n ) {\n // @ts-expect-error Fix me later\n this.domNode.parentNode.insertBefore(\n this.domNode.lastChild,\n this.domNode,\n );\n }\n\n const prevTextBlot = this.prev instanceof TextBlot ? this.prev : null;\n const prevTextLength = prevTextBlot ? prevTextBlot.length() : 0;\n const nextTextBlot = this.next instanceof TextBlot ? this.next : null;\n // @ts-expect-error TODO: make TextBlot.text public\n const nextText = nextTextBlot ? nextTextBlot.text : '';\n const { textNode } = this;\n // take text from inside this blot and reset it\n const newText = textNode.data.split(Cursor.CONTENTS).join('');\n textNode.data = Cursor.CONTENTS;\n\n // proactively merge TextBlots around cursor so that optimization\n // doesn't lose the cursor. the reason we are here in cursor.restore\n // could be that the user clicked in prevTextBlot or nextTextBlot, or\n // the user typed something.\n let mergedTextBlot;\n if (prevTextBlot) {\n mergedTextBlot = prevTextBlot;\n if (newText || nextTextBlot) {\n prevTextBlot.insertAt(prevTextBlot.length(), newText + nextText);\n if (nextTextBlot) {\n nextTextBlot.remove();\n }\n }\n } else if (nextTextBlot) {\n mergedTextBlot = nextTextBlot;\n nextTextBlot.insertAt(0, newText);\n } else {\n const newTextNode = document.createTextNode(newText);\n mergedTextBlot = this.scroll.create(newTextNode);\n this.parent.insertBefore(mergedTextBlot, this);\n }\n\n this.remove();\n if (range) {\n // calculate selection to restore\n const remapOffset = (node: Node, offset: number) => {\n if (prevTextBlot && node === prevTextBlot.domNode) {\n return offset;\n }\n if (node === textNode) {\n return prevTextLength + offset - 1;\n }\n if (nextTextBlot && node === nextTextBlot.domNode) {\n return prevTextLength + newText.length + offset;\n }\n return null;\n };\n\n const start = remapOffset(range.start.node, range.start.offset);\n const end = remapOffset(range.end.node, range.end.offset);\n if (start !== null && end !== null) {\n return {\n startNode: mergedTextBlot.domNode,\n startOffset: start,\n endNode: mergedTextBlot.domNode,\n endOffset: end,\n };\n }\n }\n return null;\n }\n\n update(mutations: MutationRecord[], context: Record) {\n if (\n mutations.some((mutation) => {\n return (\n mutation.type === 'characterData' && mutation.target === this.textNode\n );\n })\n ) {\n const range = this.restore();\n if (range) context.range = range;\n }\n }\n\n // Avoid .ql-cursor being a descendant of `
    `.\n // The reason is Safari pushes down `` on text insertion.\n // That will cause DOM nodes not sync with the model.\n //\n // For example ({I} is the caret), given the markup:\n // \\uFEFF{I}\n // When typing a char \"x\", `` will be pushed down inside the `` first:\n // \\uFEFF{I}\n // And then \"x\" will be inserted after ``:\n // \\uFEFFd{I}\n optimize(context?: unknown) {\n // @ts-expect-error Fix me later\n super.optimize(context);\n\n let { parent } = this;\n while (parent) {\n if (parent.domNode.tagName === 'A') {\n this.savedLength = Cursor.CONTENTS.length;\n // @ts-expect-error TODO: make isolate generic\n parent.isolate(this.offset(parent), this.length()).unwrap();\n this.savedLength = 0;\n break;\n }\n parent = parent.parent;\n }\n }\n\n value() {\n return '';\n }\n}\n\nexport default Cursor;\n","import type { ScrollBlot } from 'parchment';\nimport { EmbedBlot } from 'parchment';\nimport TextBlot from './text.js';\n\nconst GUARD_TEXT = '\\uFEFF';\n\nexport interface EmbedContextRange {\n startNode: Node | Text;\n startOffset: number;\n endNode?: Node | Text;\n endOffset?: number;\n}\n\nclass Embed extends EmbedBlot {\n contentNode: HTMLSpanElement;\n leftGuard: Text;\n rightGuard: Text;\n\n constructor(scroll: ScrollBlot, node: Node) {\n super(scroll, node);\n this.contentNode = document.createElement('span');\n this.contentNode.setAttribute('contenteditable', 'false');\n Array.from(this.domNode.childNodes).forEach((childNode) => {\n this.contentNode.appendChild(childNode);\n });\n this.leftGuard = document.createTextNode(GUARD_TEXT);\n this.rightGuard = document.createTextNode(GUARD_TEXT);\n this.domNode.appendChild(this.leftGuard);\n this.domNode.appendChild(this.contentNode);\n this.domNode.appendChild(this.rightGuard);\n }\n\n index(node: Node, offset: number) {\n if (node === this.leftGuard) return 0;\n if (node === this.rightGuard) return 1;\n return super.index(node, offset);\n }\n\n restore(node: Text): EmbedContextRange | null {\n let range: EmbedContextRange | null = null;\n let textNode: Text;\n const text = node.data.split(GUARD_TEXT).join('');\n if (node === this.leftGuard) {\n if (this.prev instanceof TextBlot) {\n const prevLength = this.prev.length();\n this.prev.insertAt(prevLength, text);\n range = {\n startNode: this.prev.domNode,\n startOffset: prevLength + text.length,\n };\n } else {\n textNode = document.createTextNode(text);\n this.parent.insertBefore(this.scroll.create(textNode), this);\n range = {\n startNode: textNode,\n startOffset: text.length,\n };\n }\n } else if (node === this.rightGuard) {\n if (this.next instanceof TextBlot) {\n this.next.insertAt(0, text);\n range = {\n startNode: this.next.domNode,\n startOffset: text.length,\n };\n } else {\n textNode = document.createTextNode(text);\n this.parent.insertBefore(this.scroll.create(textNode), this.next);\n range = {\n startNode: textNode,\n startOffset: text.length,\n };\n }\n }\n node.data = GUARD_TEXT;\n return range;\n }\n\n update(mutations: MutationRecord[], context: Record) {\n mutations.forEach((mutation) => {\n if (\n mutation.type === 'characterData' &&\n (mutation.target === this.leftGuard ||\n mutation.target === this.rightGuard)\n ) {\n const range = this.restore(mutation.target as Text);\n if (range) context.range = range;\n }\n });\n }\n}\n\nexport default Embed;\n","import { EmbedBlot, InlineBlot, Scope } from 'parchment';\nimport type { BlotConstructor } from 'parchment';\nimport Break from './break.js';\nimport Text from './text.js';\n\nclass Inline extends InlineBlot {\n static allowedChildren: BlotConstructor[] = [Inline, Break, EmbedBlot, Text];\n // Lower index means deeper in the DOM tree, since not found (-1) is for embeds\n static order = [\n 'cursor',\n 'inline', // Must be lower\n 'link', // Chrome wants to be lower\n 'underline',\n 'strike',\n 'italic',\n 'bold',\n 'script',\n 'code', // Must be higher\n ];\n\n static compare(self: string, other: string) {\n const selfIndex = Inline.order.indexOf(self);\n const otherIndex = Inline.order.indexOf(other);\n if (selfIndex >= 0 || otherIndex >= 0) {\n return selfIndex - otherIndex;\n }\n if (self === other) {\n return 0;\n }\n if (self < other) {\n return -1;\n }\n return 1;\n }\n\n formatAt(index: number, length: number, name: string, value: unknown) {\n if (\n Inline.compare(this.statics.blotName, name) < 0 &&\n this.scroll.query(name, Scope.BLOT)\n ) {\n const blot = this.isolate(index, length);\n if (value) {\n blot.wrap(name, value);\n }\n } else {\n super.formatAt(index, length, name, value);\n }\n }\n\n optimize(context: { [key: string]: any }) {\n super.optimize(context);\n if (\n this.parent instanceof Inline &&\n Inline.compare(this.statics.blotName, this.parent.statics.blotName) > 0\n ) {\n const parent = this.parent.isolate(this.offset(), this.length());\n // @ts-expect-error TODO: make isolate generic\n this.moveChildren(parent);\n parent.wrap(this);\n }\n }\n}\n\nexport default Inline;\n","import { TextBlot } from 'parchment';\n\nclass Text extends TextBlot {}\n\n// https://lodash.com/docs#escape\nconst entityMap: Record = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": ''',\n};\n\nfunction escapeText(text: string) {\n return text.replace(/[&<>\"']/g, (s) => entityMap[s]);\n}\n\nexport { Text as default, escapeText };\n","import { EventEmitter } from 'eventemitter3';\nimport instances from './instances.js';\nimport logger from './logger.js';\n\nconst debug = logger('quill:events');\nconst EVENTS = ['selectionchange', 'mousedown', 'mouseup', 'click'];\n\nEVENTS.forEach((eventName) => {\n document.addEventListener(eventName, (...args) => {\n Array.from(document.querySelectorAll('.ql-container')).forEach((node) => {\n const quill = instances.get(node);\n if (quill && quill.emitter) {\n quill.emitter.handleDOM(...args);\n }\n });\n });\n});\n\nclass Emitter extends EventEmitter {\n static events = {\n EDITOR_CHANGE: 'editor-change',\n SCROLL_BEFORE_UPDATE: 'scroll-before-update',\n SCROLL_BLOT_MOUNT: 'scroll-blot-mount',\n SCROLL_BLOT_UNMOUNT: 'scroll-blot-unmount',\n SCROLL_OPTIMIZE: 'scroll-optimize',\n SCROLL_UPDATE: 'scroll-update',\n SCROLL_EMBED_UPDATE: 'scroll-embed-update',\n SELECTION_CHANGE: 'selection-change',\n TEXT_CHANGE: 'text-change',\n COMPOSITION_BEFORE_START: 'composition-before-start',\n COMPOSITION_START: 'composition-start',\n COMPOSITION_BEFORE_END: 'composition-before-end',\n COMPOSITION_END: 'composition-end',\n } as const;\n\n static sources = {\n API: 'api',\n SILENT: 'silent',\n USER: 'user',\n } as const;\n\n protected domListeners: Record;\n\n constructor() {\n super();\n this.domListeners = {};\n this.on('error', debug.error);\n }\n\n emit(...args: unknown[]): boolean {\n debug.log.call(debug, ...args);\n // @ts-expect-error\n return super.emit(...args);\n }\n\n handleDOM(event: Event, ...args: unknown[]) {\n (this.domListeners[event.type] || []).forEach(({ node, handler }) => {\n if (event.target === node || node.contains(event.target as Node)) {\n handler(event, ...args);\n }\n });\n }\n\n listenDOM(eventName: string, node: Node, handler: EventListener) {\n if (!this.domListeners[eventName]) {\n this.domListeners[eventName] = [];\n }\n this.domListeners[eventName].push({ node, handler });\n }\n}\n\nexport type EmitterSource =\n (typeof Emitter.sources)[keyof typeof Emitter.sources];\n\nexport default Emitter;\n","import type Quill from '../core.js';\n\nexport default new WeakMap();\n","const levels = ['error', 'warn', 'log', 'info'] as const;\nexport type DebugLevel = (typeof levels)[number];\nlet level: DebugLevel | false = 'warn';\n\nfunction debug(method: DebugLevel, ...args: unknown[]) {\n if (level) {\n if (levels.indexOf(method) <= levels.indexOf(level)) {\n console[method](...args); // eslint-disable-line no-console\n }\n }\n}\n\nfunction namespace(\n ns: string,\n): Record void> {\n return levels.reduce(\n (logger, method) => {\n logger[method] = debug.bind(console, method, ns);\n return logger;\n },\n {} as Record void>,\n );\n}\n\nnamespace.level = (newLevel: DebugLevel | false) => {\n level = newLevel;\n};\ndebug.level = namespace.level;\n\nexport default namespace;\n","import type Quill from './quill.js';\n\nabstract class Module {\n static DEFAULTS = {};\n\n constructor(\n public quill: Quill,\n protected options: Partial = {},\n ) {}\n}\n\nexport default Module;\n","import { cloneDeep, isEqual, merge } from 'lodash-es';\nimport { LeafBlot, EmbedBlot, Scope, ParentBlot } from 'parchment';\nimport type { Blot } from 'parchment';\nimport Delta, { AttributeMap, Op } from 'quill-delta';\nimport Block, { BlockEmbed, bubbleFormats } from '../blots/block.js';\nimport Break from '../blots/break.js';\nimport CursorBlot from '../blots/cursor.js';\nimport type Scroll from '../blots/scroll.js';\nimport TextBlot, { escapeText } from '../blots/text.js';\nimport { Range } from './selection.js';\n\nconst ASCII = /^[ -~]*$/;\n\ntype SelectionInfo = {\n newRange: Range;\n oldRange: Range;\n};\n\nclass Editor {\n scroll: Scroll;\n delta: Delta;\n\n constructor(scroll: Scroll) {\n this.scroll = scroll;\n this.delta = this.getDelta();\n }\n\n applyDelta(delta: Delta): Delta {\n this.scroll.update();\n let scrollLength = this.scroll.length();\n this.scroll.batchStart();\n const normalizedDelta = normalizeDelta(delta);\n const deleteDelta = new Delta();\n const normalizedOps = splitOpLines(normalizedDelta.ops.slice());\n normalizedOps.reduce((index, op) => {\n const length = Op.length(op);\n let attributes = op.attributes || {};\n let isImplicitNewlinePrepended = false;\n let isImplicitNewlineAppended = false;\n if (op.insert != null) {\n deleteDelta.retain(length);\n if (typeof op.insert === 'string') {\n const text = op.insert;\n isImplicitNewlineAppended =\n !text.endsWith('\\n') &&\n (scrollLength <= index ||\n !!this.scroll.descendant(BlockEmbed, index)[0]);\n this.scroll.insertAt(index, text);\n const [line, offset] = this.scroll.line(index);\n let formats = merge({}, bubbleFormats(line));\n if (line instanceof Block) {\n const [leaf] = line.descendant(LeafBlot, offset);\n if (leaf) {\n formats = merge(formats, bubbleFormats(leaf));\n }\n }\n attributes = AttributeMap.diff(formats, attributes) || {};\n } else if (typeof op.insert === 'object') {\n const key = Object.keys(op.insert)[0]; // There should only be one key\n if (key == null) return index;\n const isInlineEmbed = this.scroll.query(key, Scope.INLINE) != null;\n if (isInlineEmbed) {\n if (\n scrollLength <= index ||\n !!this.scroll.descendant(BlockEmbed, index)[0]\n ) {\n isImplicitNewlineAppended = true;\n }\n } else if (index > 0) {\n const [leaf, offset] = this.scroll.descendant(LeafBlot, index - 1);\n if (leaf instanceof TextBlot) {\n const text = leaf.value();\n if (text[offset] !== '\\n') {\n isImplicitNewlinePrepended = true;\n }\n } else if (\n leaf instanceof EmbedBlot &&\n leaf.statics.scope === Scope.INLINE_BLOT\n ) {\n isImplicitNewlinePrepended = true;\n }\n }\n this.scroll.insertAt(index, key, op.insert[key]);\n\n if (isInlineEmbed) {\n const [leaf] = this.scroll.descendant(LeafBlot, index);\n if (leaf) {\n const formats = merge({}, bubbleFormats(leaf));\n attributes = AttributeMap.diff(formats, attributes) || {};\n }\n }\n }\n scrollLength += length;\n } else {\n deleteDelta.push(op);\n\n if (op.retain !== null && typeof op.retain === 'object') {\n const key = Object.keys(op.retain)[0];\n if (key == null) return index;\n this.scroll.updateEmbedAt(index, key, op.retain[key]);\n }\n }\n Object.keys(attributes).forEach((name) => {\n this.scroll.formatAt(index, length, name, attributes[name]);\n });\n const prependedLength = isImplicitNewlinePrepended ? 1 : 0;\n const addedLength = isImplicitNewlineAppended ? 1 : 0;\n scrollLength += prependedLength + addedLength;\n deleteDelta.retain(prependedLength);\n deleteDelta.delete(addedLength);\n return index + length + prependedLength + addedLength;\n }, 0);\n deleteDelta.reduce((index, op) => {\n if (typeof op.delete === 'number') {\n this.scroll.deleteAt(index, op.delete);\n return index;\n }\n return index + Op.length(op);\n }, 0);\n this.scroll.batchEnd();\n this.scroll.optimize();\n return this.update(normalizedDelta);\n }\n\n deleteText(index: number, length: number): Delta {\n this.scroll.deleteAt(index, length);\n return this.update(new Delta().retain(index).delete(length));\n }\n\n formatLine(\n index: number,\n length: number,\n formats: Record = {},\n ): Delta {\n this.scroll.update();\n Object.keys(formats).forEach((format) => {\n this.scroll.lines(index, Math.max(length, 1)).forEach((line) => {\n line.format(format, formats[format]);\n });\n });\n this.scroll.optimize();\n const delta = new Delta().retain(index).retain(length, cloneDeep(formats));\n return this.update(delta);\n }\n\n formatText(\n index: number,\n length: number,\n formats: Record = {},\n ): Delta {\n Object.keys(formats).forEach((format) => {\n this.scroll.formatAt(index, length, format, formats[format]);\n });\n const delta = new Delta().retain(index).retain(length, cloneDeep(formats));\n return this.update(delta);\n }\n\n getContents(index: number, length: number): Delta {\n return this.delta.slice(index, index + length);\n }\n\n getDelta(): Delta {\n return this.scroll.lines().reduce((delta, line) => {\n return delta.concat(line.delta());\n }, new Delta());\n }\n\n getFormat(index: number, length = 0): Record {\n let lines: (Block | BlockEmbed)[] = [];\n let leaves: LeafBlot[] = [];\n if (length === 0) {\n this.scroll.path(index).forEach((path) => {\n const [blot] = path;\n if (blot instanceof Block) {\n lines.push(blot);\n } else if (blot instanceof LeafBlot) {\n leaves.push(blot);\n }\n });\n } else {\n lines = this.scroll.lines(index, length);\n leaves = this.scroll.descendants(LeafBlot, index, length);\n }\n const [lineFormats, leafFormats] = [lines, leaves].map((blots) => {\n const blot = blots.shift();\n if (blot == null) return {};\n let formats = bubbleFormats(blot);\n while (Object.keys(formats).length > 0) {\n const blot = blots.shift();\n if (blot == null) return formats;\n formats = combineFormats(bubbleFormats(blot), formats);\n }\n return formats;\n });\n return { ...lineFormats, ...leafFormats };\n }\n\n getHTML(index: number, length: number): string {\n const [line, lineOffset] = this.scroll.line(index);\n if (line) {\n const lineLength = line.length();\n const isWithinLine = line.length() >= lineOffset + length;\n if (isWithinLine && !(lineOffset === 0 && length === lineLength)) {\n return convertHTML(line, lineOffset, length, true);\n }\n return convertHTML(this.scroll, index, length, true);\n }\n return '';\n }\n\n getText(index: number, length: number): string {\n return this.getContents(index, length)\n .filter((op) => typeof op.insert === 'string')\n .map((op) => op.insert)\n .join('');\n }\n\n insertContents(index: number, contents: Delta): Delta {\n const normalizedDelta = normalizeDelta(contents);\n const change = new Delta().retain(index).concat(normalizedDelta);\n this.scroll.insertContents(index, normalizedDelta);\n return this.update(change);\n }\n\n insertEmbed(index: number, embed: string, value: unknown): Delta {\n this.scroll.insertAt(index, embed, value);\n return this.update(new Delta().retain(index).insert({ [embed]: value }));\n }\n\n insertText(\n index: number,\n text: string,\n formats: Record = {},\n ): Delta {\n text = text.replace(/\\r\\n/g, '\\n').replace(/\\r/g, '\\n');\n this.scroll.insertAt(index, text);\n Object.keys(formats).forEach((format) => {\n this.scroll.formatAt(index, text.length, format, formats[format]);\n });\n return this.update(\n new Delta().retain(index).insert(text, cloneDeep(formats)),\n );\n }\n\n isBlank(): boolean {\n if (this.scroll.children.length === 0) return true;\n if (this.scroll.children.length > 1) return false;\n const blot = this.scroll.children.head;\n if (blot?.statics.blotName !== Block.blotName) return false;\n const block = blot as Block;\n if (block.children.length > 1) return false;\n return block.children.head instanceof Break;\n }\n\n removeFormat(index: number, length: number): Delta {\n const text = this.getText(index, length);\n const [line, offset] = this.scroll.line(index + length);\n let suffixLength = 0;\n let suffix = new Delta();\n if (line != null) {\n suffixLength = line.length() - offset;\n suffix = line\n .delta()\n .slice(offset, offset + suffixLength - 1)\n .insert('\\n');\n }\n const contents = this.getContents(index, length + suffixLength);\n const diff = contents.diff(new Delta().insert(text).concat(suffix));\n const delta = new Delta().retain(index).concat(diff);\n return this.applyDelta(delta);\n }\n\n update(\n change: Delta | null,\n mutations: MutationRecord[] = [],\n selectionInfo: SelectionInfo | undefined = undefined,\n ): Delta {\n const oldDelta = this.delta;\n if (\n mutations.length === 1 &&\n mutations[0].type === 'characterData' &&\n // @ts-expect-error Fix me later\n mutations[0].target.data.match(ASCII) &&\n this.scroll.find(mutations[0].target)\n ) {\n // Optimization for character changes\n const textBlot = this.scroll.find(mutations[0].target) as Blot;\n const formats = bubbleFormats(textBlot);\n const index = textBlot.offset(this.scroll);\n // @ts-expect-error Fix me later\n const oldValue = mutations[0].oldValue.replace(CursorBlot.CONTENTS, '');\n const oldText = new Delta().insert(oldValue);\n // @ts-expect-error\n const newText = new Delta().insert(textBlot.value());\n const relativeSelectionInfo = selectionInfo && {\n oldRange: shiftRange(selectionInfo.oldRange, -index),\n newRange: shiftRange(selectionInfo.newRange, -index),\n };\n const diffDelta = new Delta()\n .retain(index)\n .concat(oldText.diff(newText, relativeSelectionInfo));\n change = diffDelta.reduce((delta, op) => {\n if (op.insert) {\n return delta.insert(op.insert, formats);\n }\n return delta.push(op);\n }, new Delta());\n this.delta = oldDelta.compose(change);\n } else {\n this.delta = this.getDelta();\n if (!change || !isEqual(oldDelta.compose(change), this.delta)) {\n change = oldDelta.diff(this.delta, selectionInfo);\n }\n }\n return change;\n }\n}\n\ninterface ListItem {\n child: Blot;\n offset: number;\n length: number;\n indent: number;\n type: string;\n}\nfunction convertListHTML(\n items: ListItem[],\n lastIndent: number,\n types: string[],\n): string {\n if (items.length === 0) {\n const [endTag] = getListType(types.pop());\n if (lastIndent <= 0) {\n return ``;\n }\n return `${convertListHTML([], lastIndent - 1, types)}`;\n }\n const [{ child, offset, length, indent, type }, ...rest] = items;\n const [tag, attribute] = getListType(type);\n if (indent > lastIndent) {\n types.push(type);\n if (indent === lastIndent + 1) {\n return `<${tag}>${convertHTML(\n child,\n offset,\n length,\n )}${convertListHTML(rest, indent, types)}`;\n }\n return `<${tag}>
  • ${convertListHTML(items, lastIndent + 1, types)}`;\n }\n const previousType = types[types.length - 1];\n if (indent === lastIndent && type === previousType) {\n return `
  • ${convertHTML(\n child,\n offset,\n length,\n )}${convertListHTML(rest, indent, types)}`;\n }\n const [endTag] = getListType(types.pop());\n return `${convertListHTML(items, lastIndent - 1, types)}`;\n}\n\nfunction convertHTML(\n blot: Blot,\n index: number,\n length: number,\n isRoot = false,\n): string {\n if ('html' in blot && typeof blot.html === 'function') {\n return blot.html(index, length);\n }\n if (blot instanceof TextBlot) {\n const escapedText = escapeText(blot.value().slice(index, index + length));\n return escapedText.replaceAll(' ', ' ');\n }\n if (blot instanceof ParentBlot) {\n // TODO fix API\n if (blot.statics.blotName === 'list-container') {\n const items: any[] = [];\n blot.children.forEachAt(index, length, (child, offset, childLength) => {\n const formats =\n 'formats' in child && typeof child.formats === 'function'\n ? child.formats()\n : {};\n items.push({\n child,\n offset,\n length: childLength,\n indent: formats.indent || 0,\n type: formats.list,\n });\n });\n return convertListHTML(items, -1, []);\n }\n const parts: string[] = [];\n blot.children.forEachAt(index, length, (child, offset, childLength) => {\n parts.push(convertHTML(child, offset, childLength));\n });\n if (isRoot || blot.statics.blotName === 'list') {\n return parts.join('');\n }\n const { outerHTML, innerHTML } = blot.domNode as Element;\n const [start, end] = outerHTML.split(`>${innerHTML}<`);\n // TODO cleanup\n if (start === '${parts.join('')}<${end}`;\n }\n return `${start}>${parts.join('')}<${end}`;\n }\n return blot.domNode instanceof Element ? blot.domNode.outerHTML : '';\n}\n\nfunction combineFormats(\n formats: Record,\n combined: Record,\n): Record {\n return Object.keys(combined).reduce(\n (merged, name) => {\n if (formats[name] == null) return merged;\n const combinedValue = combined[name];\n if (combinedValue === formats[name]) {\n merged[name] = combinedValue;\n } else if (Array.isArray(combinedValue)) {\n if (combinedValue.indexOf(formats[name]) < 0) {\n merged[name] = combinedValue.concat([formats[name]]);\n } else {\n // If style already exists, don't add to an array, but don't lose other styles\n merged[name] = combinedValue;\n }\n } else {\n merged[name] = [combinedValue, formats[name]];\n }\n return merged;\n },\n {} as Record,\n );\n}\n\nfunction getListType(type: string | undefined) {\n const tag = type === 'ordered' ? 'ol' : 'ul';\n switch (type) {\n case 'checked':\n return [tag, ' data-list=\"checked\"'];\n case 'unchecked':\n return [tag, ' data-list=\"unchecked\"'];\n default:\n return [tag, ''];\n }\n}\n\nfunction normalizeDelta(delta: Delta) {\n return delta.reduce((normalizedDelta, op) => {\n if (typeof op.insert === 'string') {\n const text = op.insert.replace(/\\r\\n/g, '\\n').replace(/\\r/g, '\\n');\n return normalizedDelta.insert(text, op.attributes);\n }\n return normalizedDelta.push(op);\n }, new Delta());\n}\n\nfunction shiftRange({ index, length }: Range, amount: number) {\n return new Range(index + amount, length);\n}\n\nfunction splitOpLines(ops: Op[]) {\n const split: Op[] = [];\n ops.forEach((op) => {\n if (typeof op.insert === 'string') {\n const lines = op.insert.split('\\n');\n lines.forEach((line, index) => {\n if (index) split.push({ insert: '\\n', attributes: op.attributes });\n if (line) split.push({ insert: line, attributes: op.attributes });\n });\n } else {\n split.push(op);\n }\n });\n\n return split;\n}\n\nexport default Editor;\n","import Embed from '../blots/embed.js';\nimport type Scroll from '../blots/scroll.js';\nimport Emitter from './emitter.js';\n\nclass Composition {\n isComposing = false;\n\n constructor(\n private scroll: Scroll,\n private emitter: Emitter,\n ) {\n this.setupListeners();\n }\n\n private setupListeners() {\n this.scroll.domNode.addEventListener('compositionstart', (event) => {\n if (!this.isComposing) {\n this.handleCompositionStart(event);\n }\n });\n\n this.scroll.domNode.addEventListener('compositionend', (event) => {\n if (this.isComposing) {\n // Webkit makes DOM changes after compositionend, so we use microtask to\n // ensure the order.\n // https://bugs.webkit.org/show_bug.cgi?id=31902\n queueMicrotask(() => {\n this.handleCompositionEnd(event);\n });\n }\n });\n }\n\n private handleCompositionStart(event: CompositionEvent) {\n const blot =\n event.target instanceof Node\n ? this.scroll.find(event.target, true)\n : null;\n\n if (blot && !(blot instanceof Embed)) {\n this.emitter.emit(Emitter.events.COMPOSITION_BEFORE_START, event);\n this.scroll.batchStart();\n this.emitter.emit(Emitter.events.COMPOSITION_START, event);\n this.isComposing = true;\n }\n }\n\n private handleCompositionEnd(event: CompositionEvent) {\n this.emitter.emit(Emitter.events.COMPOSITION_BEFORE_END, event);\n this.scroll.batchEnd();\n this.emitter.emit(Emitter.events.COMPOSITION_END, event);\n this.isComposing = false;\n }\n}\n\nexport default Composition;\n","export type Rect = {\n top: number;\n right: number;\n bottom: number;\n left: number;\n};\n\nconst getParentElement = (element: Node): Element | null =>\n element.parentElement || (element.getRootNode() as ShadowRoot).host || null;\n\nconst getElementRect = (element: Element): Rect => {\n const rect = element.getBoundingClientRect();\n const scaleX =\n ('offsetWidth' in element &&\n Math.abs(rect.width) / (element as HTMLElement).offsetWidth) ||\n 1;\n const scaleY =\n ('offsetHeight' in element &&\n Math.abs(rect.height) / (element as HTMLElement).offsetHeight) ||\n 1;\n return {\n top: rect.top,\n right: rect.left + element.clientWidth * scaleX,\n bottom: rect.top + element.clientHeight * scaleY,\n left: rect.left,\n };\n};\n\nconst paddingValueToInt = (value: string) => {\n const number = parseInt(value, 10);\n return Number.isNaN(number) ? 0 : number;\n};\n\n// Follow the steps described in https://www.w3.org/TR/cssom-view-1/#element-scrolling-members,\n// assuming that the scroll option is set to 'nearest'.\nconst getScrollDistance = (\n targetStart: number,\n targetEnd: number,\n scrollStart: number,\n scrollEnd: number,\n scrollPaddingStart: number,\n scrollPaddingEnd: number,\n) => {\n if (targetStart < scrollStart && targetEnd > scrollEnd) {\n return 0;\n }\n\n if (targetStart < scrollStart) {\n return -(scrollStart - targetStart + scrollPaddingStart);\n }\n\n if (targetEnd > scrollEnd) {\n return targetEnd - targetStart > scrollEnd - scrollStart\n ? targetStart + scrollPaddingStart - scrollStart\n : targetEnd - scrollEnd + scrollPaddingEnd;\n }\n return 0;\n};\n\nconst scrollRectIntoView = (root: HTMLElement, targetRect: Rect) => {\n const document = root.ownerDocument;\n\n let rect = targetRect;\n\n let current: Element | null = root;\n while (current) {\n const isDocumentBody: boolean = current === document.body;\n const bounding = isDocumentBody\n ? {\n top: 0,\n right:\n window.visualViewport?.width ??\n document.documentElement.clientWidth,\n bottom:\n window.visualViewport?.height ??\n document.documentElement.clientHeight,\n left: 0,\n }\n : getElementRect(current);\n\n const style = getComputedStyle(current);\n const scrollDistanceX = getScrollDistance(\n rect.left,\n rect.right,\n bounding.left,\n bounding.right,\n paddingValueToInt(style.scrollPaddingLeft),\n paddingValueToInt(style.scrollPaddingRight),\n );\n const scrollDistanceY = getScrollDistance(\n rect.top,\n rect.bottom,\n bounding.top,\n bounding.bottom,\n paddingValueToInt(style.scrollPaddingTop),\n paddingValueToInt(style.scrollPaddingBottom),\n );\n if (scrollDistanceX || scrollDistanceY) {\n if (isDocumentBody) {\n document.defaultView?.scrollBy(scrollDistanceX, scrollDistanceY);\n } else {\n const { scrollLeft, scrollTop } = current;\n if (scrollDistanceY) {\n current.scrollTop += scrollDistanceY;\n }\n if (scrollDistanceX) {\n current.scrollLeft += scrollDistanceX;\n }\n const scrolledLeft = current.scrollLeft - scrollLeft;\n const scrolledTop = current.scrollTop - scrollTop;\n rect = {\n left: rect.left - scrolledLeft,\n top: rect.top - scrolledTop,\n right: rect.right - scrolledLeft,\n bottom: rect.bottom - scrolledTop,\n };\n }\n }\n\n current =\n isDocumentBody || style.position === 'fixed'\n ? null\n : getParentElement(current);\n }\n};\n\nexport default scrollRectIntoView;\n","import { Registry } from 'parchment';\n\nconst MAX_REGISTER_ITERATIONS = 100;\nconst CORE_FORMATS = ['block', 'break', 'cursor', 'inline', 'scroll', 'text'];\n\nconst createRegistryWithFormats = (\n formats: string[],\n sourceRegistry: Registry,\n debug: { error: (errorMessage: string) => void },\n) => {\n const registry = new Registry();\n CORE_FORMATS.forEach((name) => {\n const coreBlot = sourceRegistry.query(name);\n if (coreBlot) registry.register(coreBlot);\n });\n\n formats.forEach((name) => {\n let format = sourceRegistry.query(name);\n if (!format) {\n debug.error(\n `Cannot register \"${name}\" specified in \"formats\" config. Are you sure it was registered?`,\n );\n }\n let iterations = 0;\n while (format) {\n registry.register(format);\n format = 'blotName' in format ? format.requiredContainer ?? null : null;\n\n iterations += 1;\n if (iterations > MAX_REGISTER_ITERATIONS) {\n debug.error(\n `Cycle detected in registering blot requiredContainer: \"${name}\"`,\n );\n break;\n }\n }\n });\n\n return registry;\n};\n\nexport default createRegistryWithFormats;\n","import { merge } from 'lodash-es';\nimport * as Parchment from 'parchment';\nimport type { Op } from 'quill-delta';\nimport Delta from 'quill-delta';\nimport type { BlockEmbed } from '../blots/block.js';\nimport type Block from '../blots/block.js';\nimport type Scroll from '../blots/scroll.js';\nimport type Clipboard from '../modules/clipboard.js';\nimport type History from '../modules/history.js';\nimport type Keyboard from '../modules/keyboard.js';\nimport type Uploader from '../modules/uploader.js';\nimport Editor from './editor.js';\nimport Emitter from './emitter.js';\nimport type { EmitterSource } from './emitter.js';\nimport instances from './instances.js';\nimport logger from './logger.js';\nimport type { DebugLevel } from './logger.js';\nimport Module from './module.js';\nimport Selection, { Range } from './selection.js';\nimport type { Bounds } from './selection.js';\nimport Composition from './composition.js';\nimport Theme from './theme.js';\nimport type { ThemeConstructor } from './theme.js';\nimport scrollRectIntoView from './utils/scrollRectIntoView.js';\nimport type { Rect } from './utils/scrollRectIntoView.js';\nimport createRegistryWithFormats from './utils/createRegistryWithFormats.js';\n\nconst debug = logger('quill');\n\nconst globalRegistry = new Parchment.Registry();\nParchment.ParentBlot.uiClass = 'ql-ui';\n\n/**\n * Options for initializing a Quill instance\n */\nexport interface QuillOptions {\n theme?: string;\n debug?: DebugLevel | boolean;\n registry?: Parchment.Registry;\n /**\n * Whether to disable the editing\n * @default false\n */\n readOnly?: boolean;\n\n /**\n * Placeholder text to display when the editor is empty\n * @default \"\"\n */\n placeholder?: string;\n bounds?: HTMLElement | string | null;\n modules?: Record;\n\n /**\n * A list of formats that are recognized and can exist within the editor contents.\n * `null` means all formats are allowed.\n * @default null\n */\n formats?: string[] | null;\n}\n\n/**\n * Similar to QuillOptions, but with all properties expanded to their default values,\n * and all selectors resolved to HTMLElements.\n */\nexport interface ExpandedQuillOptions\n extends Omit {\n theme: ThemeConstructor;\n registry: Parchment.Registry;\n container: HTMLElement;\n modules: Record;\n bounds?: HTMLElement | null;\n readOnly: boolean;\n}\n\nclass Quill {\n static DEFAULTS = {\n bounds: null,\n modules: {\n clipboard: true,\n keyboard: true,\n history: true,\n uploader: true,\n },\n placeholder: '',\n readOnly: false,\n registry: globalRegistry,\n theme: 'default',\n } satisfies Partial;\n static events = Emitter.events;\n static sources = Emitter.sources;\n static version = typeof QUILL_VERSION === 'undefined' ? 'dev' : QUILL_VERSION;\n\n static imports: Record = {\n delta: Delta,\n parchment: Parchment,\n 'core/module': Module,\n 'core/theme': Theme,\n };\n\n static debug(limit: DebugLevel | boolean) {\n if (limit === true) {\n limit = 'log';\n }\n logger.level(limit);\n }\n\n static find(node: Node, bubble = false) {\n return instances.get(node) || globalRegistry.find(node, bubble);\n }\n\n static import(name: 'core/module'): typeof Module;\n static import(name: `themes/${string}`): typeof Theme;\n static import(name: 'parchment'): typeof Parchment;\n static import(name: 'delta'): typeof Delta;\n static import(name: string): unknown;\n static import(name: string) {\n if (this.imports[name] == null) {\n debug.error(`Cannot import ${name}. Are you sure it was registered?`);\n }\n return this.imports[name];\n }\n\n static register(\n targets: Record<\n string,\n | Parchment.RegistryDefinition\n | Record // any objects\n | Theme\n | Module\n | Function // ES5 constructors\n >,\n overwrite?: boolean,\n ): void;\n static register(\n target: Parchment.RegistryDefinition,\n overwrite?: boolean,\n ): void;\n static register(path: string, target: any, overwrite?: boolean): void;\n static register(...args: any[]): void {\n if (typeof args[0] !== 'string') {\n const target = args[0];\n const overwrite = !!args[1];\n\n const name = 'attrName' in target ? target.attrName : target.blotName;\n if (typeof name === 'string') {\n // Shortcut for formats:\n // register(Blot | Attributor, overwrite)\n this.register(`formats/${name}`, target, overwrite);\n } else {\n Object.keys(target).forEach((key) => {\n this.register(key, target[key], overwrite);\n });\n }\n } else {\n const path = args[0];\n const target = args[1];\n const overwrite = !!args[2];\n\n if (this.imports[path] != null && !overwrite) {\n debug.warn(`Overwriting ${path} with`, target);\n }\n this.imports[path] = target;\n if (\n (path.startsWith('blots/') || path.startsWith('formats/')) &&\n target &&\n typeof target !== 'boolean' &&\n target.blotName !== 'abstract'\n ) {\n globalRegistry.register(target);\n }\n if (typeof target.register === 'function') {\n target.register(globalRegistry);\n }\n }\n }\n\n container: HTMLElement;\n root: HTMLDivElement;\n scroll: Scroll;\n emitter: Emitter;\n protected allowReadOnlyEdits: boolean;\n editor: Editor;\n composition: Composition;\n selection: Selection;\n\n theme: Theme;\n keyboard: Keyboard;\n clipboard: Clipboard;\n history: History;\n uploader: Uploader;\n\n options: ExpandedQuillOptions;\n\n constructor(container: HTMLElement | string, options: QuillOptions = {}) {\n this.options = expandConfig(container, options);\n this.container = this.options.container;\n if (this.container == null) {\n debug.error('Invalid Quill container', container);\n return;\n }\n if (this.options.debug) {\n Quill.debug(this.options.debug);\n }\n const html = this.container.innerHTML.trim();\n this.container.classList.add('ql-container');\n this.container.innerHTML = '';\n instances.set(this.container, this);\n this.root = this.addContainer('ql-editor');\n this.root.classList.add('ql-blank');\n this.emitter = new Emitter();\n const scrollBlotName = Parchment.ScrollBlot.blotName;\n const ScrollBlot = this.options.registry.query(scrollBlotName);\n if (!ScrollBlot || !('blotName' in ScrollBlot)) {\n throw new Error(\n `Cannot initialize Quill without \"${scrollBlotName}\" blot`,\n );\n }\n this.scroll = new ScrollBlot(this.options.registry, this.root, {\n emitter: this.emitter,\n }) as Scroll;\n this.editor = new Editor(this.scroll);\n this.selection = new Selection(this.scroll, this.emitter);\n this.composition = new Composition(this.scroll, this.emitter);\n this.theme = new this.options.theme(this, this.options); // eslint-disable-line new-cap\n this.keyboard = this.theme.addModule('keyboard');\n this.clipboard = this.theme.addModule('clipboard');\n this.history = this.theme.addModule('history');\n this.uploader = this.theme.addModule('uploader');\n this.theme.addModule('input');\n this.theme.addModule('uiNode');\n this.theme.init();\n this.emitter.on(Emitter.events.EDITOR_CHANGE, (type) => {\n if (type === Emitter.events.TEXT_CHANGE) {\n this.root.classList.toggle('ql-blank', this.editor.isBlank());\n }\n });\n this.emitter.on(Emitter.events.SCROLL_UPDATE, (source, mutations) => {\n const oldRange = this.selection.lastRange;\n const [newRange] = this.selection.getRange();\n const selectionInfo =\n oldRange && newRange ? { oldRange, newRange } : undefined;\n modify.call(\n this,\n () => this.editor.update(null, mutations, selectionInfo),\n source,\n );\n });\n this.emitter.on(Emitter.events.SCROLL_EMBED_UPDATE, (blot, delta) => {\n const oldRange = this.selection.lastRange;\n const [newRange] = this.selection.getRange();\n const selectionInfo =\n oldRange && newRange ? { oldRange, newRange } : undefined;\n modify.call(\n this,\n () => {\n const change = new Delta()\n .retain(blot.offset(this))\n .retain({ [blot.statics.blotName]: delta });\n return this.editor.update(change, [], selectionInfo);\n },\n Quill.sources.USER,\n );\n });\n if (html) {\n const contents = this.clipboard.convert({\n html: `${html}


    `,\n text: '\\n',\n });\n this.setContents(contents);\n }\n this.history.clear();\n if (this.options.placeholder) {\n this.root.setAttribute('data-placeholder', this.options.placeholder);\n }\n if (this.options.readOnly) {\n this.disable();\n }\n this.allowReadOnlyEdits = false;\n }\n\n addContainer(container: string, refNode?: Node | null): HTMLDivElement;\n addContainer(container: HTMLElement, refNode?: Node | null): HTMLElement;\n addContainer(\n container: string | HTMLElement,\n refNode: Node | null = null,\n ): HTMLDivElement | HTMLElement {\n if (typeof container === 'string') {\n const className = container;\n container = document.createElement('div');\n container.classList.add(className);\n }\n this.container.insertBefore(container, refNode);\n return container;\n }\n\n blur() {\n this.selection.setRange(null);\n }\n\n deleteText(range: Range, source?: EmitterSource): Delta;\n deleteText(index: number, length: number, source?: EmitterSource): Delta;\n deleteText(\n index: number | Range,\n length?: number | EmitterSource,\n source?: EmitterSource,\n ): Delta {\n // @ts-expect-error\n [index, length, , source] = overload(index, length, source);\n return modify.call(\n this,\n () => {\n return this.editor.deleteText(index, length);\n },\n source,\n index,\n -1 * length,\n );\n }\n\n disable() {\n this.enable(false);\n }\n\n editReadOnly(modifier: () => T): T {\n this.allowReadOnlyEdits = true;\n const value = modifier();\n this.allowReadOnlyEdits = false;\n return value;\n }\n\n enable(enabled = true) {\n this.scroll.enable(enabled);\n this.container.classList.toggle('ql-disabled', !enabled);\n }\n\n focus(options: { preventScroll?: boolean } = {}) {\n this.selection.focus();\n if (!options.preventScroll) {\n this.scrollSelectionIntoView();\n }\n }\n\n format(\n name: string,\n value: unknown,\n source: EmitterSource = Emitter.sources.API,\n ): Delta {\n return modify.call(\n this,\n () => {\n const range = this.getSelection(true);\n let change = new Delta();\n if (range == null) return change;\n if (this.scroll.query(name, Parchment.Scope.BLOCK)) {\n change = this.editor.formatLine(range.index, range.length, {\n [name]: value,\n });\n } else if (range.length === 0) {\n this.selection.format(name, value);\n return change;\n } else {\n change = this.editor.formatText(range.index, range.length, {\n [name]: value,\n });\n }\n this.setSelection(range, Emitter.sources.SILENT);\n return change;\n },\n source,\n );\n }\n\n formatLine(\n index: number,\n length: number,\n formats: Record,\n source?: EmitterSource,\n ): Delta;\n formatLine(\n index: number,\n length: number,\n name: string,\n value?: unknown,\n source?: EmitterSource,\n ): Delta;\n formatLine(\n index: number,\n length: number,\n name: string | Record,\n value?: unknown | EmitterSource,\n source?: EmitterSource,\n ): Delta {\n let formats: Record;\n // eslint-disable-next-line prefer-const\n [index, length, formats, source] = overload(\n index,\n length,\n // @ts-expect-error\n name,\n value,\n source,\n );\n return modify.call(\n this,\n () => {\n return this.editor.formatLine(index, length, formats);\n },\n source,\n index,\n 0,\n );\n }\n\n formatText(\n range: Range,\n name: string,\n value: unknown,\n source?: EmitterSource,\n ): Delta;\n formatText(\n index: number,\n length: number,\n name: string,\n value: unknown,\n source?: EmitterSource,\n ): Delta;\n formatText(\n index: number,\n length: number,\n formats: Record,\n source?: EmitterSource,\n ): Delta;\n formatText(\n index: number | Range,\n length: number | string,\n name: string | unknown,\n value?: unknown | EmitterSource,\n source?: EmitterSource,\n ): Delta {\n let formats: Record;\n // eslint-disable-next-line prefer-const\n [index, length, formats, source] = overload(\n // @ts-expect-error\n index,\n length,\n name,\n value,\n source,\n );\n return modify.call(\n this,\n () => {\n return this.editor.formatText(index, length, formats);\n },\n source,\n index,\n 0,\n );\n }\n\n getBounds(index: number | Range, length = 0): Bounds | null {\n let bounds: Bounds | null = null;\n if (typeof index === 'number') {\n bounds = this.selection.getBounds(index, length);\n } else {\n bounds = this.selection.getBounds(index.index, index.length);\n }\n if (!bounds) return null;\n const containerBounds = this.container.getBoundingClientRect();\n return {\n bottom: bounds.bottom - containerBounds.top,\n height: bounds.height,\n left: bounds.left - containerBounds.left,\n right: bounds.right - containerBounds.left,\n top: bounds.top - containerBounds.top,\n width: bounds.width,\n };\n }\n\n getContents(index = 0, length = this.getLength() - index) {\n [index, length] = overload(index, length);\n return this.editor.getContents(index, length);\n }\n\n getFormat(index?: number, length?: number): { [format: string]: unknown };\n getFormat(range?: Range): {\n [format: string]: unknown;\n };\n getFormat(\n index: Range | number = this.getSelection(true),\n length = 0,\n ): { [format: string]: unknown } {\n if (typeof index === 'number') {\n return this.editor.getFormat(index, length);\n }\n return this.editor.getFormat(index.index, index.length);\n }\n\n getIndex(blot: Parchment.Blot) {\n return blot.offset(this.scroll);\n }\n\n getLength() {\n return this.scroll.length();\n }\n\n getLeaf(index: number) {\n return this.scroll.leaf(index);\n }\n\n getLine(index: number) {\n return this.scroll.line(index);\n }\n\n getLines(range: Range): (Block | BlockEmbed)[];\n getLines(index?: number, length?: number): (Block | BlockEmbed)[];\n getLines(\n index: Range | number = 0,\n length = Number.MAX_VALUE,\n ): (Block | BlockEmbed)[] {\n if (typeof index !== 'number') {\n return this.scroll.lines(index.index, index.length);\n }\n return this.scroll.lines(index, length);\n }\n\n getModule(name: string) {\n return this.theme.modules[name];\n }\n\n getSelection(focus: true): Range;\n getSelection(focus?: boolean): Range | null;\n getSelection(focus = false): Range | null {\n if (focus) this.focus();\n this.update(); // Make sure we access getRange with editor in consistent state\n return this.selection.getRange()[0];\n }\n\n getSemanticHTML(range: Range): string;\n getSemanticHTML(index?: number, length?: number): string;\n getSemanticHTML(index: Range | number = 0, length?: number) {\n if (typeof index === 'number') {\n length = length ?? this.getLength() - index;\n }\n // @ts-expect-error\n [index, length] = overload(index, length);\n return this.editor.getHTML(index, length);\n }\n\n getText(range?: Range): string;\n getText(index?: number, length?: number): string;\n getText(index: Range | number = 0, length?: number): string {\n if (typeof index === 'number') {\n length = length ?? this.getLength() - index;\n }\n // @ts-expect-error\n [index, length] = overload(index, length);\n return this.editor.getText(index, length);\n }\n\n hasFocus() {\n return this.selection.hasFocus();\n }\n\n insertEmbed(\n index: number,\n embed: string,\n value: unknown,\n source: EmitterSource = Quill.sources.API,\n ): Delta {\n return modify.call(\n this,\n () => {\n return this.editor.insertEmbed(index, embed, value);\n },\n source,\n index,\n );\n }\n\n insertText(index: number, text: string, source?: EmitterSource): Delta;\n insertText(\n index: number,\n text: string,\n formats: Record,\n source?: EmitterSource,\n ): Delta;\n insertText(\n index: number,\n text: string,\n name: string,\n value: unknown,\n source?: EmitterSource,\n ): Delta;\n insertText(\n index: number,\n text: string,\n name?: string | Record | EmitterSource,\n value?: unknown,\n source?: EmitterSource,\n ): Delta {\n let formats: Record;\n // eslint-disable-next-line prefer-const\n // @ts-expect-error\n [index, , formats, source] = overload(index, 0, name, value, source);\n return modify.call(\n this,\n () => {\n return this.editor.insertText(index, text, formats);\n },\n source,\n index,\n text.length,\n );\n }\n\n isEnabled() {\n return this.scroll.isEnabled();\n }\n\n off(...args: Parameters<(typeof Emitter)['prototype']['off']>) {\n return this.emitter.off(...args);\n }\n\n on(\n event: (typeof Emitter)['events']['TEXT_CHANGE'],\n handler: (delta: Delta, oldContent: Delta, source: EmitterSource) => void,\n ): Emitter;\n on(\n event: (typeof Emitter)['events']['SELECTION_CHANGE'],\n handler: (range: Range, oldRange: Range, source: EmitterSource) => void,\n ): Emitter;\n on(\n event: (typeof Emitter)['events']['EDITOR_CHANGE'],\n handler: (\n ...args:\n | [\n (typeof Emitter)['events']['TEXT_CHANGE'],\n Delta,\n Delta,\n EmitterSource,\n ]\n | [\n (typeof Emitter)['events']['SELECTION_CHANGE'],\n Range,\n Range,\n EmitterSource,\n ]\n ) => void,\n ): Emitter;\n on(event: string, ...args: unknown[]): Emitter;\n on(...args: Parameters<(typeof Emitter)['prototype']['on']>): Emitter {\n return this.emitter.on(...args);\n }\n\n once(...args: Parameters<(typeof Emitter)['prototype']['once']>) {\n return this.emitter.once(...args);\n }\n\n removeFormat(index: number, length: number, source?: EmitterSource): Delta {\n [index, length, , source] = overload(index, length, source);\n return modify.call(\n this,\n () => {\n return this.editor.removeFormat(index, length);\n },\n source,\n index,\n );\n }\n\n scrollRectIntoView(rect: Rect) {\n scrollRectIntoView(this.root, rect);\n }\n\n /**\n * @deprecated Use Quill#scrollSelectionIntoView() instead.\n */\n scrollIntoView() {\n console.warn(\n 'Quill#scrollIntoView() has been deprecated and will be removed in the near future. Please use Quill#scrollSelectionIntoView() instead.',\n );\n this.scrollSelectionIntoView();\n }\n\n /**\n * Scroll the current selection into the visible area.\n * If the selection is already visible, no scrolling will occur.\n */\n scrollSelectionIntoView() {\n const range = this.selection.lastRange;\n const bounds = range && this.selection.getBounds(range.index, range.length);\n if (bounds) {\n this.scrollRectIntoView(bounds);\n }\n }\n\n setContents(\n delta: Delta | Op[],\n source: EmitterSource = Emitter.sources.API,\n ): Delta {\n return modify.call(\n this,\n () => {\n delta = new Delta(delta);\n const length = this.getLength();\n // Quill will set empty editor to \\n\n const delete1 = this.editor.deleteText(0, length);\n const applied = this.editor.insertContents(0, delta);\n // Remove extra \\n from empty editor initialization\n const delete2 = this.editor.deleteText(this.getLength() - 1, 1);\n return delete1.compose(applied).compose(delete2);\n },\n source,\n );\n }\n setSelection(range: Range | null, source?: EmitterSource): void;\n setSelection(index: number, source?: EmitterSource): void;\n setSelection(index: number, length?: number, source?: EmitterSource): void;\n setSelection(index: number, source?: EmitterSource): void;\n setSelection(\n index: Range | null | number,\n length?: EmitterSource | number,\n source?: EmitterSource,\n ): void {\n if (index == null) {\n // @ts-expect-error https://github.com/microsoft/TypeScript/issues/22609\n this.selection.setRange(null, length || Quill.sources.API);\n } else {\n // @ts-expect-error\n [index, length, , source] = overload(index, length, source);\n this.selection.setRange(new Range(Math.max(0, index), length), source);\n if (source !== Emitter.sources.SILENT) {\n this.scrollSelectionIntoView();\n }\n }\n }\n\n setText(text: string, source: EmitterSource = Emitter.sources.API) {\n const delta = new Delta().insert(text);\n return this.setContents(delta, source);\n }\n\n update(source: EmitterSource = Emitter.sources.USER) {\n const change = this.scroll.update(source); // Will update selection before selection.update() does if text changes\n this.selection.update(source);\n // TODO this is usually undefined\n return change;\n }\n\n updateContents(\n delta: Delta | Op[],\n source: EmitterSource = Emitter.sources.API,\n ): Delta {\n return modify.call(\n this,\n () => {\n delta = new Delta(delta);\n return this.editor.applyDelta(delta);\n },\n source,\n true,\n );\n }\n}\n\nfunction resolveSelector(selector: string | HTMLElement | null | undefined) {\n return typeof selector === 'string'\n ? document.querySelector(selector)\n : selector;\n}\n\nfunction expandModuleConfig(config: Record | undefined) {\n return Object.entries(config ?? {}).reduce(\n (expanded, [key, value]) => ({\n ...expanded,\n [key]: value === true ? {} : value,\n }),\n {} as Record,\n );\n}\n\nfunction omitUndefinedValuesFromOptions(obj: QuillOptions) {\n return Object.fromEntries(\n Object.entries(obj).filter((entry) => entry[1] !== undefined),\n );\n}\n\nfunction expandConfig(\n containerOrSelector: HTMLElement | string,\n options: QuillOptions,\n): ExpandedQuillOptions {\n const container = resolveSelector(containerOrSelector);\n if (!container) {\n throw new Error('Invalid Quill container');\n }\n\n const shouldUseDefaultTheme =\n !options.theme || options.theme === Quill.DEFAULTS.theme;\n const theme = shouldUseDefaultTheme\n ? Theme\n : Quill.import(`themes/${options.theme}`);\n if (!theme) {\n throw new Error(`Invalid theme ${options.theme}. Did you register it?`);\n }\n\n const { modules: quillModuleDefaults, ...quillDefaults } = Quill.DEFAULTS;\n const { modules: themeModuleDefaults, ...themeDefaults } = theme.DEFAULTS;\n\n let userModuleOptions = expandModuleConfig(options.modules);\n // Special case toolbar shorthand\n if (\n userModuleOptions != null &&\n userModuleOptions.toolbar &&\n userModuleOptions.toolbar.constructor !== Object\n ) {\n userModuleOptions = {\n ...userModuleOptions,\n toolbar: { container: userModuleOptions.toolbar },\n };\n }\n\n const modules: ExpandedQuillOptions['modules'] = merge(\n {},\n expandModuleConfig(quillModuleDefaults),\n expandModuleConfig(themeModuleDefaults),\n userModuleOptions,\n );\n\n const config = {\n ...quillDefaults,\n ...omitUndefinedValuesFromOptions(themeDefaults),\n ...omitUndefinedValuesFromOptions(options),\n };\n\n let registry = options.registry;\n if (registry) {\n if (options.formats) {\n debug.warn('Ignoring \"formats\" option because \"registry\" is specified');\n }\n } else {\n registry = options.formats\n ? createRegistryWithFormats(options.formats, config.registry, debug)\n : config.registry;\n }\n\n return {\n ...config,\n registry,\n container,\n theme,\n modules: Object.entries(modules).reduce(\n (modulesWithDefaults, [name, value]) => {\n if (!value) return modulesWithDefaults;\n\n const moduleClass = Quill.import(`modules/${name}`);\n if (moduleClass == null) {\n debug.error(\n `Cannot load ${name} module. Are you sure you registered it?`,\n );\n return modulesWithDefaults;\n }\n return {\n ...modulesWithDefaults,\n // @ts-expect-error\n [name]: merge({}, moduleClass.DEFAULTS || {}, value),\n };\n },\n {},\n ),\n bounds: resolveSelector(config.bounds),\n };\n}\n\n// Handle selection preservation and TEXT_CHANGE emission\n// common to modification APIs\nfunction modify(\n modifier: () => Delta,\n source: EmitterSource,\n index: number | boolean,\n shift: number | null,\n) {\n if (\n !this.isEnabled() &&\n source === Emitter.sources.USER &&\n !this.allowReadOnlyEdits\n ) {\n return new Delta();\n }\n let range = index == null ? null : this.getSelection();\n const oldDelta = this.editor.delta;\n const change = modifier();\n if (range != null) {\n if (index === true) {\n index = range.index; // eslint-disable-line prefer-destructuring\n }\n if (shift == null) {\n range = shiftRange(range, change, source);\n } else if (shift !== 0) {\n // @ts-expect-error index should always be number\n range = shiftRange(range, index, shift, source);\n }\n this.setSelection(range, Emitter.sources.SILENT);\n }\n if (change.length() > 0) {\n const args = [Emitter.events.TEXT_CHANGE, change, oldDelta, source];\n this.emitter.emit(Emitter.events.EDITOR_CHANGE, ...args);\n if (source !== Emitter.sources.SILENT) {\n this.emitter.emit(...args);\n }\n }\n return change;\n}\n\ntype NormalizedIndexLength = [\n number,\n number,\n Record,\n EmitterSource,\n];\nfunction overload(index: number, source?: EmitterSource): NormalizedIndexLength;\nfunction overload(\n index: number,\n length: number,\n source?: EmitterSource,\n): NormalizedIndexLength;\nfunction overload(\n index: number,\n length: number,\n format: string,\n value: unknown,\n source?: EmitterSource,\n): NormalizedIndexLength;\nfunction overload(\n index: number,\n length: number,\n format: Record,\n source?: EmitterSource,\n): NormalizedIndexLength;\nfunction overload(range: Range, source?: EmitterSource): NormalizedIndexLength;\nfunction overload(\n range: Range,\n format: string,\n value: unknown,\n source?: EmitterSource,\n): NormalizedIndexLength;\nfunction overload(\n range: Range,\n format: Record,\n source?: EmitterSource,\n): NormalizedIndexLength;\nfunction overload(\n index: Range | number,\n length?: number | string | Record | EmitterSource,\n name?: string | unknown | Record | EmitterSource,\n value?: unknown | EmitterSource,\n source?: EmitterSource,\n): NormalizedIndexLength {\n let formats: Record = {};\n // @ts-expect-error\n if (typeof index.index === 'number' && typeof index.length === 'number') {\n // Allow for throwaway end (used by insertText/insertEmbed)\n if (typeof length !== 'number') {\n // @ts-expect-error\n source = value;\n value = name;\n name = length;\n // @ts-expect-error\n length = index.length; // eslint-disable-line prefer-destructuring\n // @ts-expect-error\n index = index.index; // eslint-disable-line prefer-destructuring\n } else {\n // @ts-expect-error\n length = index.length; // eslint-disable-line prefer-destructuring\n // @ts-expect-error\n index = index.index; // eslint-disable-line prefer-destructuring\n }\n } else if (typeof length !== 'number') {\n // @ts-expect-error\n source = value;\n value = name;\n name = length;\n length = 0;\n }\n // Handle format being object, two format name/value strings or excluded\n if (typeof name === 'object') {\n // @ts-expect-error Fix me later\n formats = name;\n // @ts-expect-error\n source = value;\n } else if (typeof name === 'string') {\n if (value != null) {\n formats[name] = value;\n } else {\n // @ts-expect-error\n source = name;\n }\n }\n // Handle optional source\n source = source || Emitter.sources.API;\n // @ts-expect-error\n return [index, length, formats, source];\n}\n\nfunction shiftRange(range: Range, change: Delta, source?: EmitterSource): Range;\nfunction shiftRange(\n range: Range,\n index: number,\n length?: number,\n source?: EmitterSource,\n): Range;\nfunction shiftRange(\n range: Range,\n index: number | Delta,\n lengthOrSource?: number | EmitterSource,\n source?: EmitterSource,\n) {\n const length = typeof lengthOrSource === 'number' ? lengthOrSource : 0;\n if (range == null) return null;\n let start;\n let end;\n // @ts-expect-error -- TODO: add a better type guard around `index`\n if (index && typeof index.transformPosition === 'function') {\n [start, end] = [range.index, range.index + range.length].map((pos) =>\n // @ts-expect-error -- TODO: add a better type guard around `index`\n index.transformPosition(pos, source !== Emitter.sources.USER),\n );\n } else {\n [start, end] = [range.index, range.index + range.length].map((pos) => {\n // @ts-expect-error -- TODO: add a better type guard around `index`\n if (pos < index || (pos === index && source === Emitter.sources.USER))\n return pos;\n if (length >= 0) {\n return pos + length;\n }\n // @ts-expect-error -- TODO: add a better type guard around `index`\n return Math.max(index, pos + length);\n });\n }\n return new Range(start, end - start);\n}\n\nexport type { Bounds, DebugLevel, EmitterSource };\nexport { Parchment, Range };\n\nexport { globalRegistry, expandConfig, overload, Quill as default };\n","import { LeafBlot, Scope } from 'parchment';\nimport { cloneDeep, isEqual } from 'lodash-es';\nimport Emitter from './emitter.js';\nimport type { EmitterSource } from './emitter.js';\nimport logger from './logger.js';\nimport type Cursor from '../blots/cursor.js';\nimport type Scroll from '../blots/scroll.js';\n\nconst debug = logger('quill:selection');\n\ntype NativeRange = AbstractRange;\n\ninterface NormalizedRange {\n start: {\n node: NativeRange['startContainer'];\n offset: NativeRange['startOffset'];\n };\n end: { node: NativeRange['endContainer']; offset: NativeRange['endOffset'] };\n native: NativeRange;\n}\n\nexport interface Bounds {\n bottom: number;\n height: number;\n left: number;\n right: number;\n top: number;\n width: number;\n}\n\nexport class Range {\n constructor(\n public index: number,\n public length = 0,\n ) {}\n}\n\nclass Selection {\n scroll: Scroll;\n emitter: Emitter;\n composing: boolean;\n mouseDown: boolean;\n\n root: HTMLElement;\n cursor: Cursor;\n savedRange: Range;\n lastRange: Range | null;\n lastNative: NormalizedRange | null;\n\n constructor(scroll: Scroll, emitter: Emitter) {\n this.emitter = emitter;\n this.scroll = scroll;\n this.composing = false;\n this.mouseDown = false;\n this.root = this.scroll.domNode;\n // @ts-expect-error\n this.cursor = this.scroll.create('cursor', this);\n // savedRange is last non-null range\n this.savedRange = new Range(0, 0);\n this.lastRange = this.savedRange;\n this.lastNative = null;\n this.handleComposition();\n this.handleDragging();\n this.emitter.listenDOM('selectionchange', document, () => {\n if (!this.mouseDown && !this.composing) {\n setTimeout(this.update.bind(this, Emitter.sources.USER), 1);\n }\n });\n this.emitter.on(Emitter.events.SCROLL_BEFORE_UPDATE, () => {\n if (!this.hasFocus()) return;\n const native = this.getNativeRange();\n if (native == null) return;\n if (native.start.node === this.cursor.textNode) return; // cursor.restore() will handle\n this.emitter.once(\n Emitter.events.SCROLL_UPDATE,\n (source, mutations: MutationRecord[]) => {\n try {\n if (\n this.root.contains(native.start.node) &&\n this.root.contains(native.end.node)\n ) {\n this.setNativeRange(\n native.start.node,\n native.start.offset,\n native.end.node,\n native.end.offset,\n );\n }\n const triggeredByTyping = mutations.some(\n (mutation) =>\n mutation.type === 'characterData' ||\n mutation.type === 'childList' ||\n (mutation.type === 'attributes' &&\n mutation.target === this.root),\n );\n this.update(triggeredByTyping ? Emitter.sources.SILENT : source);\n } catch (ignored) {\n // ignore\n }\n },\n );\n });\n this.emitter.on(Emitter.events.SCROLL_OPTIMIZE, (mutations, context) => {\n if (context.range) {\n const { startNode, startOffset, endNode, endOffset } = context.range;\n this.setNativeRange(startNode, startOffset, endNode, endOffset);\n this.update(Emitter.sources.SILENT);\n }\n });\n this.update(Emitter.sources.SILENT);\n }\n\n handleComposition() {\n this.emitter.on(Emitter.events.COMPOSITION_BEFORE_START, () => {\n this.composing = true;\n });\n this.emitter.on(Emitter.events.COMPOSITION_END, () => {\n this.composing = false;\n if (this.cursor.parent) {\n const range = this.cursor.restore();\n if (!range) return;\n setTimeout(() => {\n this.setNativeRange(\n range.startNode,\n range.startOffset,\n range.endNode,\n range.endOffset,\n );\n }, 1);\n }\n });\n }\n\n handleDragging() {\n this.emitter.listenDOM('mousedown', document.body, () => {\n this.mouseDown = true;\n });\n this.emitter.listenDOM('mouseup', document.body, () => {\n this.mouseDown = false;\n this.update(Emitter.sources.USER);\n });\n }\n\n focus() {\n if (this.hasFocus()) return;\n this.root.focus({ preventScroll: true });\n this.setRange(this.savedRange);\n }\n\n format(format: string, value: unknown) {\n this.scroll.update();\n const nativeRange = this.getNativeRange();\n if (\n nativeRange == null ||\n !nativeRange.native.collapsed ||\n this.scroll.query(format, Scope.BLOCK)\n )\n return;\n if (nativeRange.start.node !== this.cursor.textNode) {\n const blot = this.scroll.find(nativeRange.start.node, false);\n if (blot == null) return;\n // TODO Give blot ability to not split\n if (blot instanceof LeafBlot) {\n const after = blot.split(nativeRange.start.offset);\n blot.parent.insertBefore(this.cursor, after);\n } else {\n // @ts-expect-error TODO: nativeRange.start.node doesn't seem to match function signature\n blot.insertBefore(this.cursor, nativeRange.start.node); // Should never happen\n }\n this.cursor.attach();\n }\n this.cursor.format(format, value);\n this.scroll.optimize();\n this.setNativeRange(this.cursor.textNode, this.cursor.textNode.data.length);\n this.update();\n }\n\n getBounds(index: number, length = 0) {\n const scrollLength = this.scroll.length();\n index = Math.min(index, scrollLength - 1);\n length = Math.min(index + length, scrollLength - 1) - index;\n let node: Node;\n let [leaf, offset] = this.scroll.leaf(index);\n if (leaf == null) return null;\n if (length > 0 && offset === leaf.length()) {\n const [next] = this.scroll.leaf(index + 1);\n if (next) {\n const [line] = this.scroll.line(index);\n const [nextLine] = this.scroll.line(index + 1);\n if (line === nextLine) {\n leaf = next;\n offset = 0;\n }\n }\n }\n [node, offset] = leaf.position(offset, true);\n const range = document.createRange();\n if (length > 0) {\n range.setStart(node, offset);\n [leaf, offset] = this.scroll.leaf(index + length);\n if (leaf == null) return null;\n [node, offset] = leaf.position(offset, true);\n range.setEnd(node, offset);\n return range.getBoundingClientRect();\n }\n let side: 'left' | 'right' = 'left';\n let rect: DOMRect;\n if (node instanceof Text) {\n // Return null if the text node is empty because it is\n // not able to get a useful client rect:\n // https://github.com/w3c/csswg-drafts/issues/2514.\n // Empty text nodes are most likely caused by TextBlot#optimize()\n // not getting called when editor content changes.\n if (!node.data.length) {\n return null;\n }\n if (offset < node.data.length) {\n range.setStart(node, offset);\n range.setEnd(node, offset + 1);\n } else {\n range.setStart(node, offset - 1);\n range.setEnd(node, offset);\n side = 'right';\n }\n rect = range.getBoundingClientRect();\n } else {\n if (!(leaf.domNode instanceof Element)) return null;\n rect = leaf.domNode.getBoundingClientRect();\n if (offset > 0) side = 'right';\n }\n return {\n bottom: rect.top + rect.height,\n height: rect.height,\n left: rect[side],\n right: rect[side],\n top: rect.top,\n width: 0,\n };\n }\n\n getNativeRange(): NormalizedRange | null {\n const selection = document.getSelection();\n if (selection == null || selection.rangeCount <= 0) return null;\n const nativeRange = selection.getRangeAt(0);\n if (nativeRange == null) return null;\n const range = this.normalizeNative(nativeRange);\n debug.info('getNativeRange', range);\n return range;\n }\n\n getRange(): [Range, NormalizedRange] | [null, null] {\n const root = this.scroll.domNode;\n if ('isConnected' in root && !root.isConnected) {\n // document.getSelection() forces layout on Blink, so we trend to\n // not calling it.\n return [null, null];\n }\n const normalized = this.getNativeRange();\n if (normalized == null) return [null, null];\n const range = this.normalizedToRange(normalized);\n return [range, normalized];\n }\n\n hasFocus(): boolean {\n return (\n document.activeElement === this.root ||\n (document.activeElement != null &&\n contains(this.root, document.activeElement))\n );\n }\n\n normalizedToRange(range: NormalizedRange) {\n const positions: [Node, number][] = [\n [range.start.node, range.start.offset],\n ];\n if (!range.native.collapsed) {\n positions.push([range.end.node, range.end.offset]);\n }\n const indexes = positions.map((position) => {\n const [node, offset] = position;\n const blot = this.scroll.find(node, true);\n // @ts-expect-error Fix me later\n const index = blot.offset(this.scroll);\n if (offset === 0) {\n return index;\n }\n if (blot instanceof LeafBlot) {\n return index + blot.index(node, offset);\n }\n // @ts-expect-error Fix me later\n return index + blot.length();\n });\n const end = Math.min(Math.max(...indexes), this.scroll.length() - 1);\n const start = Math.min(end, ...indexes);\n return new Range(start, end - start);\n }\n\n normalizeNative(nativeRange: NativeRange) {\n if (\n !contains(this.root, nativeRange.startContainer) ||\n (!nativeRange.collapsed && !contains(this.root, nativeRange.endContainer))\n ) {\n return null;\n }\n const range = {\n start: {\n node: nativeRange.startContainer,\n offset: nativeRange.startOffset,\n },\n end: { node: nativeRange.endContainer, offset: nativeRange.endOffset },\n native: nativeRange,\n };\n [range.start, range.end].forEach((position) => {\n let { node, offset } = position;\n while (!(node instanceof Text) && node.childNodes.length > 0) {\n if (node.childNodes.length > offset) {\n node = node.childNodes[offset];\n offset = 0;\n } else if (node.childNodes.length === offset) {\n // @ts-expect-error Fix me later\n node = node.lastChild;\n if (node instanceof Text) {\n offset = node.data.length;\n } else if (node.childNodes.length > 0) {\n // Container case\n offset = node.childNodes.length;\n } else {\n // Embed case\n offset = node.childNodes.length + 1;\n }\n } else {\n break;\n }\n }\n position.node = node;\n position.offset = offset;\n });\n return range;\n }\n\n rangeToNative(range: Range): [Node | null, number, Node | null, number] {\n const scrollLength = this.scroll.length();\n\n const getPosition = (\n index: number,\n inclusive: boolean,\n ): [Node | null, number] => {\n index = Math.min(scrollLength - 1, index);\n const [leaf, leafOffset] = this.scroll.leaf(index);\n return leaf ? leaf.position(leafOffset, inclusive) : [null, -1];\n };\n return [\n ...getPosition(range.index, false),\n ...getPosition(range.index + range.length, true),\n ];\n }\n\n setNativeRange(\n startNode: Node | null,\n startOffset?: number,\n endNode = startNode,\n endOffset = startOffset,\n force = false,\n ) {\n debug.info('setNativeRange', startNode, startOffset, endNode, endOffset);\n if (\n startNode != null &&\n (this.root.parentNode == null ||\n startNode.parentNode == null ||\n // @ts-expect-error Fix me later\n endNode.parentNode == null)\n ) {\n return;\n }\n const selection = document.getSelection();\n if (selection == null) return;\n if (startNode != null) {\n if (!this.hasFocus()) this.root.focus({ preventScroll: true });\n const { native } = this.getNativeRange() || {};\n if (\n native == null ||\n force ||\n startNode !== native.startContainer ||\n startOffset !== native.startOffset ||\n endNode !== native.endContainer ||\n endOffset !== native.endOffset\n ) {\n if (startNode instanceof Element && startNode.tagName === 'BR') {\n // @ts-expect-error Fix me later\n startOffset = Array.from(startNode.parentNode.childNodes).indexOf(\n startNode,\n );\n startNode = startNode.parentNode;\n }\n if (endNode instanceof Element && endNode.tagName === 'BR') {\n // @ts-expect-error Fix me later\n endOffset = Array.from(endNode.parentNode.childNodes).indexOf(\n endNode,\n );\n endNode = endNode.parentNode;\n }\n const range = document.createRange();\n // @ts-expect-error Fix me later\n range.setStart(startNode, startOffset);\n // @ts-expect-error Fix me later\n range.setEnd(endNode, endOffset);\n selection.removeAllRanges();\n selection.addRange(range);\n }\n } else {\n selection.removeAllRanges();\n this.root.blur();\n }\n }\n\n setRange(range: Range | null, force: boolean, source?: EmitterSource): void;\n setRange(range: Range | null, source?: EmitterSource): void;\n setRange(\n range: Range | null,\n force: boolean | EmitterSource = false,\n source: EmitterSource = Emitter.sources.API,\n ): void {\n if (typeof force === 'string') {\n source = force;\n force = false;\n }\n debug.info('setRange', range);\n if (range != null) {\n const args = this.rangeToNative(range);\n this.setNativeRange(...args, force);\n } else {\n this.setNativeRange(null);\n }\n this.update(source);\n }\n\n update(source: EmitterSource = Emitter.sources.USER) {\n const oldRange = this.lastRange;\n const [lastRange, nativeRange] = this.getRange();\n this.lastRange = lastRange;\n this.lastNative = nativeRange;\n if (this.lastRange != null) {\n this.savedRange = this.lastRange;\n }\n if (!isEqual(oldRange, this.lastRange)) {\n if (\n !this.composing &&\n nativeRange != null &&\n nativeRange.native.collapsed &&\n nativeRange.start.node !== this.cursor.textNode\n ) {\n const range = this.cursor.restore();\n if (range) {\n this.setNativeRange(\n range.startNode,\n range.startOffset,\n range.endNode,\n range.endOffset,\n );\n }\n }\n const args = [\n Emitter.events.SELECTION_CHANGE,\n cloneDeep(this.lastRange),\n cloneDeep(oldRange),\n source,\n ];\n this.emitter.emit(Emitter.events.EDITOR_CHANGE, ...args);\n if (source !== Emitter.sources.SILENT) {\n this.emitter.emit(...args);\n }\n }\n }\n}\n\nfunction contains(parent: Node, descendant: Node) {\n try {\n // Firefox inserts inaccessible nodes around video elements\n descendant.parentNode; // eslint-disable-line @typescript-eslint/no-unused-expressions\n } catch (e) {\n return false;\n }\n return parent.contains(descendant);\n}\n\nexport default Selection;\n","import type Quill from '../core.js';\nimport type Clipboard from '../modules/clipboard.js';\nimport type History from '../modules/history.js';\nimport type Keyboard from '../modules/keyboard.js';\nimport type { ToolbarProps } from '../modules/toolbar.js';\nimport type Uploader from '../modules/uploader.js';\n\nexport interface ThemeOptions {\n modules: Record & {\n toolbar?: null | ToolbarProps;\n };\n}\n\nclass Theme {\n static DEFAULTS: ThemeOptions = {\n modules: {},\n };\n\n static themes = {\n default: Theme,\n };\n\n modules: ThemeOptions['modules'] = {};\n\n constructor(\n protected quill: Quill,\n protected options: ThemeOptions,\n ) {}\n\n init() {\n Object.keys(this.options.modules).forEach((name) => {\n if (this.modules[name] == null) {\n this.addModule(name);\n }\n });\n }\n\n addModule(name: 'clipboard'): Clipboard;\n addModule(name: 'keyboard'): Keyboard;\n addModule(name: 'uploader'): Uploader;\n addModule(name: 'history'): History;\n addModule(name: string): unknown;\n addModule(name: string) {\n // @ts-expect-error\n const ModuleClass = this.quill.constructor.import(`modules/${name}`);\n this.modules[name] = new ModuleClass(\n this.quill,\n this.options.modules[name] || {},\n );\n return this.modules[name];\n }\n}\n\nexport interface ThemeConstructor {\n new (quill: Quill, options: unknown): Theme;\n DEFAULTS: ThemeOptions;\n}\n\nexport default Theme;\n","import { Attributor, ClassAttributor, Scope, StyleAttributor } from 'parchment';\n\nconst config = {\n scope: Scope.BLOCK,\n whitelist: ['right', 'center', 'justify'],\n};\n\nconst AlignAttribute = new Attributor('align', 'align', config);\nconst AlignClass = new ClassAttributor('align', 'ql-align', config);\nconst AlignStyle = new StyleAttributor('align', 'text-align', config);\n\nexport { AlignAttribute, AlignClass, AlignStyle };\n","import { ClassAttributor, Scope } from 'parchment';\nimport { ColorAttributor } from './color.js';\n\nconst BackgroundClass = new ClassAttributor('background', 'ql-bg', {\n scope: Scope.INLINE,\n});\nconst BackgroundStyle = new ColorAttributor('background', 'background-color', {\n scope: Scope.INLINE,\n});\n\nexport { BackgroundClass, BackgroundStyle };\n","import Block from '../blots/block.js';\nimport Break from '../blots/break.js';\nimport Cursor from '../blots/cursor.js';\nimport Inline from '../blots/inline.js';\nimport TextBlot, { escapeText } from '../blots/text.js';\nimport Container from '../blots/container.js';\nimport Quill from '../core/quill.js';\n\nclass CodeBlockContainer extends Container {\n static create(value: string) {\n const domNode = super.create(value) as Element;\n domNode.setAttribute('spellcheck', 'false');\n return domNode;\n }\n\n code(index: number, length: number) {\n return (\n this.children\n // @ts-expect-error\n .map((child) => (child.length() <= 1 ? '' : child.domNode.innerText))\n .join('\\n')\n .slice(index, index + length)\n );\n }\n\n html(index: number, length: number) {\n // `\\n`s are needed in order to support empty lines at the beginning and the end.\n // https://html.spec.whatwg.org/multipage/syntax.html#element-restrictions\n return `
    \\n${escapeText(this.code(index, length))}\\n
    `;\n }\n}\n\nclass CodeBlock extends Block {\n static TAB = ' ';\n\n static register() {\n Quill.register(CodeBlockContainer);\n }\n}\n\nclass Code extends Inline {}\nCode.blotName = 'code';\nCode.tagName = 'CODE';\n\nCodeBlock.blotName = 'code-block';\nCodeBlock.className = 'ql-code-block';\nCodeBlock.tagName = 'DIV';\nCodeBlockContainer.blotName = 'code-block-container';\nCodeBlockContainer.className = 'ql-code-block-container';\nCodeBlockContainer.tagName = 'DIV';\n\nCodeBlockContainer.allowedChildren = [CodeBlock];\n\nCodeBlock.allowedChildren = [TextBlot, Break, Cursor];\nCodeBlock.requiredContainer = CodeBlockContainer;\n\nexport { Code, CodeBlockContainer, CodeBlock as default };\n","import { ClassAttributor, Scope, StyleAttributor } from 'parchment';\n\nclass ColorAttributor extends StyleAttributor {\n value(domNode: HTMLElement) {\n let value = super.value(domNode) as string;\n if (!value.startsWith('rgb(')) return value;\n value = value.replace(/^[^\\d]+/, '').replace(/[^\\d]+$/, '');\n const hex = value\n .split(',')\n .map((component) => `00${parseInt(component, 10).toString(16)}`.slice(-2))\n .join('');\n return `#${hex}`;\n }\n}\n\nconst ColorClass = new ClassAttributor('color', 'ql-color', {\n scope: Scope.INLINE,\n});\nconst ColorStyle = new ColorAttributor('color', 'color', {\n scope: Scope.INLINE,\n});\n\nexport { ColorAttributor, ColorClass, ColorStyle };\n","import { Attributor, ClassAttributor, Scope, StyleAttributor } from 'parchment';\n\nconst config = {\n scope: Scope.BLOCK,\n whitelist: ['rtl'],\n};\n\nconst DirectionAttribute = new Attributor('direction', 'dir', config);\nconst DirectionClass = new ClassAttributor('direction', 'ql-direction', config);\nconst DirectionStyle = new StyleAttributor('direction', 'direction', config);\n\nexport { DirectionAttribute, DirectionClass, DirectionStyle };\n","import { ClassAttributor, Scope, StyleAttributor } from 'parchment';\n\nconst config = {\n scope: Scope.INLINE,\n whitelist: ['serif', 'monospace'],\n};\n\nconst FontClass = new ClassAttributor('font', 'ql-font', config);\n\nclass FontStyleAttributor extends StyleAttributor {\n value(node: HTMLElement) {\n return super.value(node).replace(/[\"']/g, '');\n }\n}\n\nconst FontStyle = new FontStyleAttributor('font', 'font-family', config);\n\nexport { FontStyle, FontClass };\n","import { ClassAttributor, Scope, StyleAttributor } from 'parchment';\n\nconst SizeClass = new ClassAttributor('size', 'ql-size', {\n scope: Scope.INLINE,\n whitelist: ['small', 'large', 'huge'],\n});\nconst SizeStyle = new StyleAttributor('size', 'font-size', {\n scope: Scope.INLINE,\n whitelist: ['10px', '18px', '32px'],\n});\n\nexport { SizeClass, SizeStyle };\n","const normalWeightRegexp = /font-weight:\\s*normal/;\nconst blockTagNames = ['P', 'OL', 'UL'];\n\nconst isBlockElement = (element: Element | null) => {\n return element && blockTagNames.includes(element.tagName);\n};\n\nconst normalizeEmptyLines = (doc: Document) => {\n Array.from(doc.querySelectorAll('br'))\n .filter(\n (br) =>\n isBlockElement(br.previousElementSibling) &&\n isBlockElement(br.nextElementSibling),\n )\n .forEach((br) => {\n br.parentNode?.removeChild(br);\n });\n};\n\nconst normalizeFontWeight = (doc: Document) => {\n Array.from(doc.querySelectorAll('b[style*=\"font-weight\"]'))\n .filter((node) => node.getAttribute('style')?.match(normalWeightRegexp))\n .forEach((node) => {\n const fragment = doc.createDocumentFragment();\n fragment.append(...node.childNodes);\n node.parentNode?.replaceChild(fragment, node);\n });\n};\n\nexport default function normalize(doc: Document) {\n if (doc.querySelector('[id^=\"docs-internal-guid-\"]')) {\n normalizeFontWeight(doc);\n normalizeEmptyLines(doc);\n }\n}\n","const ignoreRegexp = /\\bmso-list:[^;]*ignore/i;\nconst idRegexp = /\\bmso-list:[^;]*\\bl(\\d+)/i;\nconst indentRegexp = /\\bmso-list:[^;]*\\blevel(\\d+)/i;\n\nconst parseListItem = (element: Element, html: string) => {\n const style = element.getAttribute('style');\n const idMatch = style?.match(idRegexp);\n if (!idMatch) {\n return null;\n }\n const id = Number(idMatch[1]);\n\n const indentMatch = style?.match(indentRegexp);\n const indent = indentMatch ? Number(indentMatch[1]) : 1;\n\n const typeRegexp = new RegExp(\n `@list l${id}:level${indent}\\\\s*\\\\{[^\\\\}]*mso-level-number-format:\\\\s*([\\\\w-]+)`,\n 'i',\n );\n const typeMatch = html.match(typeRegexp);\n const type = typeMatch && typeMatch[1] === 'bullet' ? 'bullet' : 'ordered';\n\n return { id, indent, type, element };\n};\n\n// list items are represented as `p` tags with styles like `mso-list: l0 level1` where:\n// 1. \"0\" in \"l0\" means the list item id;\n// 2. \"1\" in \"level1\" means the indent level, starting from 1.\nconst normalizeListItem = (doc: Document) => {\n const msoList = Array.from(doc.querySelectorAll('[style*=mso-list]'));\n const ignored: Element[] = [];\n const others: Element[] = [];\n msoList.forEach((node) => {\n const shouldIgnore = (node.getAttribute('style') || '').match(ignoreRegexp);\n if (shouldIgnore) {\n ignored.push(node);\n } else {\n others.push(node);\n }\n });\n\n // Each list item contains a marker wrapped with \"mso-list: Ignore\".\n ignored.forEach((node) => node.parentNode?.removeChild(node));\n\n // The list stype is not defined inline with the tag, instead, it's in the\n // style tag so we need to pass the html as a string.\n const html = doc.documentElement.innerHTML;\n const listItems = others\n .map((element) => parseListItem(element, html))\n .filter((parsed) => parsed);\n\n while (listItems.length) {\n const childListItems = [];\n\n let current = listItems.shift();\n // Group continuous items into the same group (aka \"ul\")\n while (current) {\n childListItems.push(current);\n current =\n listItems.length &&\n listItems[0]?.element === current.element.nextElementSibling &&\n // Different id means the next item doesn't belong to this group.\n listItems[0].id === current.id\n ? listItems.shift()\n : null;\n }\n\n const ul = document.createElement('ul');\n childListItems.forEach((listItem) => {\n const li = document.createElement('li');\n li.setAttribute('data-list', listItem.type);\n if (listItem.indent > 1) {\n li.setAttribute('class', `ql-indent-${listItem.indent - 1}`);\n }\n li.innerHTML = listItem.element.innerHTML;\n ul.appendChild(li);\n });\n\n const element = childListItems[0]?.element;\n const { parentNode } = element ?? {};\n if (element) {\n parentNode?.replaceChild(ul, element);\n }\n childListItems.slice(1).forEach(({ element: e }) => {\n parentNode?.removeChild(e);\n });\n }\n};\n\nexport default function normalize(doc: Document) {\n if (\n doc.documentElement.getAttribute('xmlns:w') ===\n 'urn:schemas-microsoft-com:office:word'\n ) {\n normalizeListItem(doc);\n }\n}\n","import googleDocs from './normalizers/googleDocs.js';\nimport msWord from './normalizers/msWord.js';\n\nconst NORMALIZERS = [msWord, googleDocs];\n\nconst normalizeExternalHTML = (doc: Document) => {\n if (doc.documentElement) {\n NORMALIZERS.forEach((normalize) => {\n normalize(doc);\n });\n }\n};\n\nexport default normalizeExternalHTML;\n","import type { ScrollBlot } from 'parchment';\nimport {\n Attributor,\n BlockBlot,\n ClassAttributor,\n EmbedBlot,\n Scope,\n StyleAttributor,\n} from 'parchment';\nimport Delta from 'quill-delta';\nimport { BlockEmbed } from '../blots/block.js';\nimport type { EmitterSource } from '../core/emitter.js';\nimport logger from '../core/logger.js';\nimport Module from '../core/module.js';\nimport Quill from '../core/quill.js';\nimport type { Range } from '../core/selection.js';\nimport { AlignAttribute, AlignStyle } from '../formats/align.js';\nimport { BackgroundStyle } from '../formats/background.js';\nimport CodeBlock from '../formats/code.js';\nimport { ColorStyle } from '../formats/color.js';\nimport { DirectionAttribute, DirectionStyle } from '../formats/direction.js';\nimport { FontStyle } from '../formats/font.js';\nimport { SizeStyle } from '../formats/size.js';\nimport { deleteRange } from './keyboard.js';\nimport normalizeExternalHTML from './normalizeExternalHTML/index.js';\n\nconst debug = logger('quill:clipboard');\n\ntype Selector = string | Node['TEXT_NODE'] | Node['ELEMENT_NODE'];\ntype Matcher = (node: Node, delta: Delta, scroll: ScrollBlot) => Delta;\n\nconst CLIPBOARD_CONFIG: [Selector, Matcher][] = [\n [Node.TEXT_NODE, matchText],\n [Node.TEXT_NODE, matchNewline],\n ['br', matchBreak],\n [Node.ELEMENT_NODE, matchNewline],\n [Node.ELEMENT_NODE, matchBlot],\n [Node.ELEMENT_NODE, matchAttributor],\n [Node.ELEMENT_NODE, matchStyles],\n ['li', matchIndent],\n ['ol, ul', matchList],\n ['pre', matchCodeBlock],\n ['tr', matchTable],\n ['b', createMatchAlias('bold')],\n ['i', createMatchAlias('italic')],\n ['strike', createMatchAlias('strike')],\n ['style', matchIgnore],\n];\n\nconst ATTRIBUTE_ATTRIBUTORS = [AlignAttribute, DirectionAttribute].reduce(\n (memo: Record, attr) => {\n memo[attr.keyName] = attr;\n return memo;\n },\n {},\n);\n\nconst STYLE_ATTRIBUTORS = [\n AlignStyle,\n BackgroundStyle,\n ColorStyle,\n DirectionStyle,\n FontStyle,\n SizeStyle,\n].reduce((memo: Record, attr) => {\n memo[attr.keyName] = attr;\n return memo;\n}, {});\n\ninterface ClipboardOptions {\n matchers: [Selector, Matcher][];\n}\n\nclass Clipboard extends Module {\n static DEFAULTS: ClipboardOptions = {\n matchers: [],\n };\n\n matchers: [Selector, Matcher][];\n\n constructor(quill: Quill, options: Partial) {\n super(quill, options);\n this.quill.root.addEventListener('copy', (e) =>\n this.onCaptureCopy(e, false),\n );\n this.quill.root.addEventListener('cut', (e) => this.onCaptureCopy(e, true));\n this.quill.root.addEventListener('paste', this.onCapturePaste.bind(this));\n this.matchers = [];\n CLIPBOARD_CONFIG.concat(this.options.matchers ?? []).forEach(\n ([selector, matcher]) => {\n this.addMatcher(selector, matcher);\n },\n );\n }\n\n addMatcher(selector: Selector, matcher: Matcher) {\n this.matchers.push([selector, matcher]);\n }\n\n convert(\n { html, text }: { html?: string; text?: string },\n formats: Record = {},\n ) {\n if (formats[CodeBlock.blotName]) {\n return new Delta().insert(text || '', {\n [CodeBlock.blotName]: formats[CodeBlock.blotName],\n });\n }\n if (!html) {\n return new Delta().insert(text || '', formats);\n }\n const delta = this.convertHTML(html);\n // Remove trailing newline\n if (\n deltaEndsWith(delta, '\\n') &&\n (delta.ops[delta.ops.length - 1].attributes == null || formats.table)\n ) {\n return delta.compose(new Delta().retain(delta.length() - 1).delete(1));\n }\n return delta;\n }\n\n protected normalizeHTML(doc: Document) {\n normalizeExternalHTML(doc);\n }\n\n protected convertHTML(html: string) {\n const doc = new DOMParser().parseFromString(html, 'text/html');\n this.normalizeHTML(doc);\n const container = doc.body;\n const nodeMatches = new WeakMap();\n const [elementMatchers, textMatchers] = this.prepareMatching(\n container,\n nodeMatches,\n );\n return traverse(\n this.quill.scroll,\n container,\n elementMatchers,\n textMatchers,\n nodeMatches,\n );\n }\n\n dangerouslyPasteHTML(html: string, source?: EmitterSource): void;\n dangerouslyPasteHTML(\n index: number,\n html: string,\n source?: EmitterSource,\n ): void;\n dangerouslyPasteHTML(\n index: number | string,\n html?: string,\n source: EmitterSource = Quill.sources.API,\n ) {\n if (typeof index === 'string') {\n const delta = this.convert({ html: index, text: '' });\n // @ts-expect-error\n this.quill.setContents(delta, html);\n this.quill.setSelection(0, Quill.sources.SILENT);\n } else {\n const paste = this.convert({ html, text: '' });\n this.quill.updateContents(\n new Delta().retain(index).concat(paste),\n source,\n );\n this.quill.setSelection(index + paste.length(), Quill.sources.SILENT);\n }\n }\n\n onCaptureCopy(e: ClipboardEvent, isCut = false) {\n if (e.defaultPrevented) return;\n e.preventDefault();\n const [range] = this.quill.selection.getRange();\n if (range == null) return;\n const { html, text } = this.onCopy(range, isCut);\n e.clipboardData?.setData('text/plain', text);\n e.clipboardData?.setData('text/html', html);\n if (isCut) {\n deleteRange({ range, quill: this.quill });\n }\n }\n\n /*\n * https://www.iana.org/assignments/media-types/text/uri-list\n */\n private normalizeURIList(urlList: string) {\n return (\n urlList\n .split(/\\r?\\n/)\n // Ignore all comments\n .filter((url) => url[0] !== '#')\n .join('\\n')\n );\n }\n\n onCapturePaste(e: ClipboardEvent) {\n if (e.defaultPrevented || !this.quill.isEnabled()) return;\n e.preventDefault();\n const range = this.quill.getSelection(true);\n if (range == null) return;\n const html = e.clipboardData?.getData('text/html');\n let text = e.clipboardData?.getData('text/plain');\n if (!html && !text) {\n const urlList = e.clipboardData?.getData('text/uri-list');\n if (urlList) {\n text = this.normalizeURIList(urlList);\n }\n }\n const files = Array.from(e.clipboardData?.files || []);\n if (!html && files.length > 0) {\n this.quill.uploader.upload(range, files);\n return;\n }\n if (html && files.length > 0) {\n const doc = new DOMParser().parseFromString(html, 'text/html');\n if (\n doc.body.childElementCount === 1 &&\n doc.body.firstElementChild?.tagName === 'IMG'\n ) {\n this.quill.uploader.upload(range, files);\n return;\n }\n }\n this.onPaste(range, { html, text });\n }\n\n onCopy(range: Range, isCut: boolean): { html: string; text: string };\n onCopy(range: Range) {\n const text = this.quill.getText(range);\n const html = this.quill.getSemanticHTML(range);\n return { html, text };\n }\n\n onPaste(range: Range, { text, html }: { text?: string; html?: string }) {\n const formats = this.quill.getFormat(range.index);\n const pastedDelta = this.convert({ text, html }, formats);\n debug.log('onPaste', pastedDelta, { text, html });\n const delta = new Delta()\n .retain(range.index)\n .delete(range.length)\n .concat(pastedDelta);\n this.quill.updateContents(delta, Quill.sources.USER);\n // range.length contributes to delta.length()\n this.quill.setSelection(\n delta.length() - range.length,\n Quill.sources.SILENT,\n );\n this.quill.scrollSelectionIntoView();\n }\n\n prepareMatching(container: Element, nodeMatches: WeakMap) {\n const elementMatchers: Matcher[] = [];\n const textMatchers: Matcher[] = [];\n this.matchers.forEach((pair) => {\n const [selector, matcher] = pair;\n switch (selector) {\n case Node.TEXT_NODE:\n textMatchers.push(matcher);\n break;\n case Node.ELEMENT_NODE:\n elementMatchers.push(matcher);\n break;\n default:\n Array.from(container.querySelectorAll(selector)).forEach((node) => {\n if (nodeMatches.has(node)) {\n const matches = nodeMatches.get(node);\n matches?.push(matcher);\n } else {\n nodeMatches.set(node, [matcher]);\n }\n });\n break;\n }\n });\n return [elementMatchers, textMatchers];\n }\n}\n\nfunction applyFormat(\n delta: Delta,\n format: string,\n value: unknown,\n scroll: ScrollBlot,\n): Delta {\n if (!scroll.query(format)) {\n return delta;\n }\n\n return delta.reduce((newDelta, op) => {\n if (!op.insert) return newDelta;\n if (op.attributes && op.attributes[format]) {\n return newDelta.push(op);\n }\n const formats = value ? { [format]: value } : {};\n return newDelta.insert(op.insert, { ...formats, ...op.attributes });\n }, new Delta());\n}\n\nfunction deltaEndsWith(delta: Delta, text: string) {\n let endText = '';\n for (\n let i = delta.ops.length - 1;\n i >= 0 && endText.length < text.length;\n --i // eslint-disable-line no-plusplus\n ) {\n const op = delta.ops[i];\n if (typeof op.insert !== 'string') break;\n endText = op.insert + endText;\n }\n return endText.slice(-1 * text.length) === text;\n}\n\nfunction isLine(node: Node, scroll: ScrollBlot) {\n if (!(node instanceof Element)) return false;\n const match = scroll.query(node);\n // @ts-expect-error\n if (match && match.prototype instanceof EmbedBlot) return false;\n\n return [\n 'address',\n 'article',\n 'blockquote',\n 'canvas',\n 'dd',\n 'div',\n 'dl',\n 'dt',\n 'fieldset',\n 'figcaption',\n 'figure',\n 'footer',\n 'form',\n 'h1',\n 'h2',\n 'h3',\n 'h4',\n 'h5',\n 'h6',\n 'header',\n 'iframe',\n 'li',\n 'main',\n 'nav',\n 'ol',\n 'output',\n 'p',\n 'pre',\n 'section',\n 'table',\n 'td',\n 'tr',\n 'ul',\n 'video',\n ].includes(node.tagName.toLowerCase());\n}\n\nfunction isBetweenInlineElements(node: HTMLElement, scroll: ScrollBlot) {\n return (\n node.previousElementSibling &&\n node.nextElementSibling &&\n !isLine(node.previousElementSibling, scroll) &&\n !isLine(node.nextElementSibling, scroll)\n );\n}\n\nconst preNodes = new WeakMap();\nfunction isPre(node: Node | null) {\n if (node == null) return false;\n if (!preNodes.has(node)) {\n // @ts-expect-error\n if (node.tagName === 'PRE') {\n preNodes.set(node, true);\n } else {\n preNodes.set(node, isPre(node.parentNode));\n }\n }\n return preNodes.get(node);\n}\n\nfunction traverse(\n scroll: ScrollBlot,\n node: ChildNode,\n elementMatchers: Matcher[],\n textMatchers: Matcher[],\n nodeMatches: WeakMap,\n): Delta {\n // Post-order\n if (node.nodeType === node.TEXT_NODE) {\n return textMatchers.reduce((delta: Delta, matcher) => {\n return matcher(node, delta, scroll);\n }, new Delta());\n }\n if (node.nodeType === node.ELEMENT_NODE) {\n return Array.from(node.childNodes || []).reduce((delta, childNode) => {\n let childrenDelta = traverse(\n scroll,\n childNode,\n elementMatchers,\n textMatchers,\n nodeMatches,\n );\n if (childNode.nodeType === node.ELEMENT_NODE) {\n childrenDelta = elementMatchers.reduce((reducedDelta, matcher) => {\n return matcher(childNode as HTMLElement, reducedDelta, scroll);\n }, childrenDelta);\n childrenDelta = (nodeMatches.get(childNode) || []).reduce(\n (reducedDelta, matcher) => {\n return matcher(childNode, reducedDelta, scroll);\n },\n childrenDelta,\n );\n }\n return delta.concat(childrenDelta);\n }, new Delta());\n }\n return new Delta();\n}\n\nfunction createMatchAlias(format: string) {\n return (_node: Element, delta: Delta, scroll: ScrollBlot) => {\n return applyFormat(delta, format, true, scroll);\n };\n}\n\nfunction matchAttributor(node: HTMLElement, delta: Delta, scroll: ScrollBlot) {\n const attributes = Attributor.keys(node);\n const classes = ClassAttributor.keys(node);\n const styles = StyleAttributor.keys(node);\n const formats: Record = {};\n attributes\n .concat(classes)\n .concat(styles)\n .forEach((name) => {\n let attr = scroll.query(name, Scope.ATTRIBUTE) as Attributor;\n if (attr != null) {\n formats[attr.attrName] = attr.value(node);\n if (formats[attr.attrName]) return;\n }\n attr = ATTRIBUTE_ATTRIBUTORS[name];\n if (attr != null && (attr.attrName === name || attr.keyName === name)) {\n formats[attr.attrName] = attr.value(node) || undefined;\n }\n attr = STYLE_ATTRIBUTORS[name];\n if (attr != null && (attr.attrName === name || attr.keyName === name)) {\n attr = STYLE_ATTRIBUTORS[name];\n formats[attr.attrName] = attr.value(node) || undefined;\n }\n });\n\n return Object.entries(formats).reduce(\n (newDelta, [name, value]) => applyFormat(newDelta, name, value, scroll),\n delta,\n );\n}\n\nfunction matchBlot(node: Node, delta: Delta, scroll: ScrollBlot) {\n const match = scroll.query(node);\n if (match == null) return delta;\n // @ts-expect-error\n if (match.prototype instanceof EmbedBlot) {\n const embed = {};\n // @ts-expect-error\n const value = match.value(node);\n if (value != null) {\n // @ts-expect-error\n embed[match.blotName] = value;\n // @ts-expect-error\n return new Delta().insert(embed, match.formats(node, scroll));\n }\n } else {\n // @ts-expect-error\n if (match.prototype instanceof BlockBlot && !deltaEndsWith(delta, '\\n')) {\n delta.insert('\\n');\n }\n if (\n 'blotName' in match &&\n 'formats' in match &&\n typeof match.formats === 'function'\n ) {\n return applyFormat(\n delta,\n match.blotName,\n match.formats(node, scroll),\n scroll,\n );\n }\n }\n return delta;\n}\n\nfunction matchBreak(node: Node, delta: Delta) {\n if (!deltaEndsWith(delta, '\\n')) {\n delta.insert('\\n');\n }\n return delta;\n}\n\nfunction matchCodeBlock(node: Node, delta: Delta, scroll: ScrollBlot) {\n const match = scroll.query('code-block');\n const language =\n match && 'formats' in match && typeof match.formats === 'function'\n ? match.formats(node, scroll)\n : true;\n return applyFormat(delta, 'code-block', language, scroll);\n}\n\nfunction matchIgnore() {\n return new Delta();\n}\n\nfunction matchIndent(node: Node, delta: Delta, scroll: ScrollBlot) {\n const match = scroll.query(node);\n if (\n match == null ||\n // @ts-expect-error\n match.blotName !== 'list' ||\n !deltaEndsWith(delta, '\\n')\n ) {\n return delta;\n }\n let indent = -1;\n let parent = node.parentNode;\n while (parent != null) {\n // @ts-expect-error\n if (['OL', 'UL'].includes(parent.tagName)) {\n indent += 1;\n }\n parent = parent.parentNode;\n }\n if (indent <= 0) return delta;\n return delta.reduce((composed, op) => {\n if (!op.insert) return composed;\n if (op.attributes && typeof op.attributes.indent === 'number') {\n return composed.push(op);\n }\n return composed.insert(op.insert, { indent, ...(op.attributes || {}) });\n }, new Delta());\n}\n\nfunction matchList(node: Node, delta: Delta, scroll: ScrollBlot) {\n const element = node as Element;\n let list = element.tagName === 'OL' ? 'ordered' : 'bullet';\n\n const checkedAttr = element.getAttribute('data-checked');\n if (checkedAttr) {\n list = checkedAttr === 'true' ? 'checked' : 'unchecked';\n }\n\n return applyFormat(delta, 'list', list, scroll);\n}\n\nfunction matchNewline(node: Node, delta: Delta, scroll: ScrollBlot) {\n if (!deltaEndsWith(delta, '\\n')) {\n if (\n isLine(node, scroll) &&\n (node.childNodes.length > 0 || node instanceof HTMLParagraphElement)\n ) {\n return delta.insert('\\n');\n }\n if (delta.length() > 0 && node.nextSibling) {\n let nextSibling: Node | null = node.nextSibling;\n while (nextSibling != null) {\n if (isLine(nextSibling, scroll)) {\n return delta.insert('\\n');\n }\n const match = scroll.query(nextSibling);\n // @ts-expect-error\n if (match && match.prototype instanceof BlockEmbed) {\n return delta.insert('\\n');\n }\n nextSibling = nextSibling.firstChild;\n }\n }\n }\n return delta;\n}\n\nfunction matchStyles(node: HTMLElement, delta: Delta, scroll: ScrollBlot) {\n const formats: Record = {};\n const style: Partial = node.style || {};\n if (style.fontStyle === 'italic') {\n formats.italic = true;\n }\n if (style.textDecoration === 'underline') {\n formats.underline = true;\n }\n if (style.textDecoration === 'line-through') {\n formats.strike = true;\n }\n if (\n style.fontWeight?.startsWith('bold') ||\n // @ts-expect-error Fix me later\n parseInt(style.fontWeight, 10) >= 700\n ) {\n formats.bold = true;\n }\n delta = Object.entries(formats).reduce(\n (newDelta, [name, value]) => applyFormat(newDelta, name, value, scroll),\n delta,\n );\n // @ts-expect-error\n if (parseFloat(style.textIndent || 0) > 0) {\n // Could be 0.5in\n return new Delta().insert('\\t').concat(delta);\n }\n return delta;\n}\n\nfunction matchTable(\n node: HTMLTableRowElement,\n delta: Delta,\n scroll: ScrollBlot,\n) {\n const table =\n node.parentElement?.tagName === 'TABLE'\n ? node.parentElement\n : node.parentElement?.parentElement;\n if (table != null) {\n const rows = Array.from(table.querySelectorAll('tr'));\n const row = rows.indexOf(node) + 1;\n return applyFormat(delta, 'table', row, scroll);\n }\n return delta;\n}\n\nfunction matchText(node: HTMLElement, delta: Delta, scroll: ScrollBlot) {\n // @ts-expect-error\n let text = node.data as string;\n // Word represents empty line with  \n if (node.parentElement?.tagName === 'O:P') {\n return delta.insert(text.trim());\n }\n if (!isPre(node)) {\n if (\n text.trim().length === 0 &&\n text.includes('\\n') &&\n !isBetweenInlineElements(node, scroll)\n ) {\n return delta;\n }\n // convert all non-nbsp whitespace into regular space\n text = text.replace(/[^\\S\\u00a0]/g, ' ');\n // collapse consecutive spaces into one\n text = text.replace(/ {2,}/g, ' ');\n if (\n (node.previousSibling == null &&\n node.parentElement != null &&\n isLine(node.parentElement, scroll)) ||\n (node.previousSibling instanceof Element &&\n isLine(node.previousSibling, scroll))\n ) {\n // block structure means we don't need leading space\n text = text.replace(/^ /, '');\n }\n if (\n (node.nextSibling == null &&\n node.parentElement != null &&\n isLine(node.parentElement, scroll)) ||\n (node.nextSibling instanceof Element && isLine(node.nextSibling, scroll))\n ) {\n // block structure means we don't need trailing space\n text = text.replace(/ $/, '');\n }\n // done removing whitespace and can normalize all to regular space\n text = text.replaceAll('\\u00a0', ' ');\n }\n return delta.insert(text);\n}\n\nexport {\n Clipboard as default,\n matchAttributor,\n matchBlot,\n matchNewline,\n matchText,\n traverse,\n};\n","import { cloneDeep, isEqual } from 'lodash-es';\nimport Delta, { AttributeMap } from 'quill-delta';\nimport { EmbedBlot, Scope, TextBlot } from 'parchment';\nimport type { Blot, BlockBlot } from 'parchment';\nimport Quill from '../core/quill.js';\nimport logger from '../core/logger.js';\nimport Module from '../core/module.js';\nimport type { BlockEmbed } from '../blots/block.js';\nimport type { Range } from '../core/selection.js';\n\nconst debug = logger('quill:keyboard');\n\nconst SHORTKEY = /Mac/i.test(navigator.platform) ? 'metaKey' : 'ctrlKey';\n\nexport interface Context {\n collapsed: boolean;\n empty: boolean;\n offset: number;\n prefix: string;\n suffix: string;\n format: Record;\n event: KeyboardEvent;\n line: BlockEmbed | BlockBlot;\n}\n\ninterface BindingObject\n extends Partial> {\n key: number | string | string[];\n shortKey?: boolean | null;\n shiftKey?: boolean | null;\n altKey?: boolean | null;\n metaKey?: boolean | null;\n ctrlKey?: boolean | null;\n prefix?: RegExp;\n suffix?: RegExp;\n format?: Record | string[];\n handler?: (\n this: { quill: Quill },\n range: Range,\n curContext: Context,\n // eslint-disable-next-line no-use-before-define\n binding: NormalizedBinding,\n ) => boolean | void;\n}\n\ntype Binding = BindingObject | string | number;\n\ninterface NormalizedBinding extends Omit {\n key: string | number;\n}\n\ninterface KeyboardOptions {\n bindings: Record;\n}\n\ninterface KeyboardOptions {\n bindings: Record;\n}\n\nclass Keyboard extends Module {\n static DEFAULTS: KeyboardOptions;\n\n static match(evt: KeyboardEvent, binding: BindingObject) {\n if (\n (['altKey', 'ctrlKey', 'metaKey', 'shiftKey'] as const).some((key) => {\n return !!binding[key] !== evt[key] && binding[key] !== null;\n })\n ) {\n return false;\n }\n return binding.key === evt.key || binding.key === evt.which;\n }\n\n bindings: Record;\n\n constructor(quill: Quill, options: Partial) {\n super(quill, options);\n this.bindings = {};\n // @ts-expect-error Fix me later\n Object.keys(this.options.bindings).forEach((name) => {\n // @ts-expect-error Fix me later\n if (this.options.bindings[name]) {\n // @ts-expect-error Fix me later\n this.addBinding(this.options.bindings[name]);\n }\n });\n this.addBinding({ key: 'Enter', shiftKey: null }, this.handleEnter);\n this.addBinding(\n { key: 'Enter', metaKey: null, ctrlKey: null, altKey: null },\n () => {},\n );\n if (/Firefox/i.test(navigator.userAgent)) {\n // Need to handle delete and backspace for Firefox in the general case #1171\n this.addBinding(\n { key: 'Backspace' },\n { collapsed: true },\n this.handleBackspace,\n );\n this.addBinding(\n { key: 'Delete' },\n { collapsed: true },\n this.handleDelete,\n );\n } else {\n this.addBinding(\n { key: 'Backspace' },\n { collapsed: true, prefix: /^.?$/ },\n this.handleBackspace,\n );\n this.addBinding(\n { key: 'Delete' },\n { collapsed: true, suffix: /^.?$/ },\n this.handleDelete,\n );\n }\n this.addBinding(\n { key: 'Backspace' },\n { collapsed: false },\n this.handleDeleteRange,\n );\n this.addBinding(\n { key: 'Delete' },\n { collapsed: false },\n this.handleDeleteRange,\n );\n this.addBinding(\n {\n key: 'Backspace',\n altKey: null,\n ctrlKey: null,\n metaKey: null,\n shiftKey: null,\n },\n { collapsed: true, offset: 0 },\n this.handleBackspace,\n );\n this.listen();\n }\n\n addBinding(\n keyBinding: Binding,\n context:\n | Required\n | Partial> = {},\n handler:\n | Required\n | Partial> = {},\n ) {\n const binding = normalize(keyBinding);\n if (binding == null) {\n debug.warn('Attempted to add invalid keyboard binding', binding);\n return;\n }\n if (typeof context === 'function') {\n context = { handler: context };\n }\n if (typeof handler === 'function') {\n handler = { handler };\n }\n const keys = Array.isArray(binding.key) ? binding.key : [binding.key];\n keys.forEach((key) => {\n const singleBinding = {\n ...binding,\n key,\n ...context,\n ...handler,\n };\n this.bindings[singleBinding.key] = this.bindings[singleBinding.key] || [];\n this.bindings[singleBinding.key].push(singleBinding);\n });\n }\n\n listen() {\n this.quill.root.addEventListener('keydown', (evt) => {\n if (evt.defaultPrevented || evt.isComposing) return;\n\n // evt.isComposing is false when pressing Enter/Backspace when composing in Safari\n // https://bugs.webkit.org/show_bug.cgi?id=165004\n const isComposing =\n evt.keyCode === 229 && (evt.key === 'Enter' || evt.key === 'Backspace');\n if (isComposing) return;\n\n const bindings = (this.bindings[evt.key] || []).concat(\n this.bindings[evt.which] || [],\n );\n const matches = bindings.filter((binding) =>\n Keyboard.match(evt, binding),\n );\n if (matches.length === 0) return;\n // @ts-expect-error\n const blot = Quill.find(evt.target, true);\n if (blot && blot.scroll !== this.quill.scroll) return;\n const range = this.quill.getSelection();\n if (range == null || !this.quill.hasFocus()) return;\n const [line, offset] = this.quill.getLine(range.index);\n const [leafStart, offsetStart] = this.quill.getLeaf(range.index);\n const [leafEnd, offsetEnd] =\n range.length === 0\n ? [leafStart, offsetStart]\n : this.quill.getLeaf(range.index + range.length);\n const prefixText =\n leafStart instanceof TextBlot\n ? leafStart.value().slice(0, offsetStart)\n : '';\n const suffixText =\n leafEnd instanceof TextBlot ? leafEnd.value().slice(offsetEnd) : '';\n const curContext = {\n collapsed: range.length === 0,\n // @ts-expect-error Fix me later\n empty: range.length === 0 && line.length() <= 1,\n format: this.quill.getFormat(range),\n line,\n offset,\n prefix: prefixText,\n suffix: suffixText,\n event: evt,\n };\n const prevented = matches.some((binding) => {\n if (\n binding.collapsed != null &&\n binding.collapsed !== curContext.collapsed\n ) {\n return false;\n }\n if (binding.empty != null && binding.empty !== curContext.empty) {\n return false;\n }\n if (binding.offset != null && binding.offset !== curContext.offset) {\n return false;\n }\n if (Array.isArray(binding.format)) {\n // any format is present\n if (binding.format.every((name) => curContext.format[name] == null)) {\n return false;\n }\n } else if (typeof binding.format === 'object') {\n // all formats must match\n if (\n !Object.keys(binding.format).every((name) => {\n // @ts-expect-error Fix me later\n if (binding.format[name] === true)\n return curContext.format[name] != null;\n // @ts-expect-error Fix me later\n if (binding.format[name] === false)\n return curContext.format[name] == null;\n // @ts-expect-error Fix me later\n return isEqual(binding.format[name], curContext.format[name]);\n })\n ) {\n return false;\n }\n }\n if (binding.prefix != null && !binding.prefix.test(curContext.prefix)) {\n return false;\n }\n if (binding.suffix != null && !binding.suffix.test(curContext.suffix)) {\n return false;\n }\n // @ts-expect-error Fix me later\n return binding.handler.call(this, range, curContext, binding) !== true;\n });\n if (prevented) {\n evt.preventDefault();\n }\n });\n }\n\n handleBackspace(range: Range, context: Context) {\n // Check for astral symbols\n const length = /[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]$/.test(context.prefix)\n ? 2\n : 1;\n if (range.index === 0 || this.quill.getLength() <= 1) return;\n let formats = {};\n const [line] = this.quill.getLine(range.index);\n let delta = new Delta().retain(range.index - length).delete(length);\n if (context.offset === 0) {\n // Always deleting newline here, length always 1\n const [prev] = this.quill.getLine(range.index - 1);\n if (prev) {\n const isPrevLineEmpty =\n prev.statics.blotName === 'block' && prev.length() <= 1;\n if (!isPrevLineEmpty) {\n // @ts-expect-error Fix me later\n const curFormats = line.formats();\n const prevFormats = this.quill.getFormat(range.index - 1, 1);\n formats = AttributeMap.diff(curFormats, prevFormats) || {};\n if (Object.keys(formats).length > 0) {\n // line.length() - 1 targets \\n in line, another -1 for newline being deleted\n const formatDelta = new Delta()\n // @ts-expect-error Fix me later\n .retain(range.index + line.length() - 2)\n .retain(1, formats);\n delta = delta.compose(formatDelta);\n }\n }\n }\n }\n this.quill.updateContents(delta, Quill.sources.USER);\n this.quill.focus();\n }\n\n handleDelete(range: Range, context: Context) {\n // Check for astral symbols\n const length = /^[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/.test(context.suffix)\n ? 2\n : 1;\n if (range.index >= this.quill.getLength() - length) return;\n let formats = {};\n const [line] = this.quill.getLine(range.index);\n let delta = new Delta().retain(range.index).delete(length);\n // @ts-expect-error Fix me later\n if (context.offset >= line.length() - 1) {\n const [next] = this.quill.getLine(range.index + 1);\n if (next) {\n // @ts-expect-error Fix me later\n const curFormats = line.formats();\n const nextFormats = this.quill.getFormat(range.index, 1);\n formats = AttributeMap.diff(curFormats, nextFormats) || {};\n if (Object.keys(formats).length > 0) {\n delta = delta.retain(next.length() - 1).retain(1, formats);\n }\n }\n }\n this.quill.updateContents(delta, Quill.sources.USER);\n this.quill.focus();\n }\n\n handleDeleteRange(range: Range) {\n deleteRange({ range, quill: this.quill });\n this.quill.focus();\n }\n\n handleEnter(range: Range, context: Context) {\n const lineFormats = Object.keys(context.format).reduce(\n (formats: Record, format) => {\n if (\n this.quill.scroll.query(format, Scope.BLOCK) &&\n !Array.isArray(context.format[format])\n ) {\n formats[format] = context.format[format];\n }\n return formats;\n },\n {},\n );\n const delta = new Delta()\n .retain(range.index)\n .delete(range.length)\n .insert('\\n', lineFormats);\n this.quill.updateContents(delta, Quill.sources.USER);\n this.quill.setSelection(range.index + 1, Quill.sources.SILENT);\n this.quill.focus();\n }\n}\n\nconst defaultOptions: KeyboardOptions = {\n bindings: {\n bold: makeFormatHandler('bold'),\n italic: makeFormatHandler('italic'),\n underline: makeFormatHandler('underline'),\n indent: {\n // highlight tab or tab at beginning of list, indent or blockquote\n key: 'Tab',\n format: ['blockquote', 'indent', 'list'],\n handler(range, context) {\n if (context.collapsed && context.offset !== 0) return true;\n this.quill.format('indent', '+1', Quill.sources.USER);\n return false;\n },\n },\n outdent: {\n key: 'Tab',\n shiftKey: true,\n format: ['blockquote', 'indent', 'list'],\n // highlight tab or tab at beginning of list, indent or blockquote\n handler(range, context) {\n if (context.collapsed && context.offset !== 0) return true;\n this.quill.format('indent', '-1', Quill.sources.USER);\n return false;\n },\n },\n 'outdent backspace': {\n key: 'Backspace',\n collapsed: true,\n shiftKey: null,\n metaKey: null,\n ctrlKey: null,\n altKey: null,\n format: ['indent', 'list'],\n offset: 0,\n handler(range, context) {\n if (context.format.indent != null) {\n this.quill.format('indent', '-1', Quill.sources.USER);\n } else if (context.format.list != null) {\n this.quill.format('list', false, Quill.sources.USER);\n }\n },\n },\n 'indent code-block': makeCodeBlockHandler(true),\n 'outdent code-block': makeCodeBlockHandler(false),\n 'remove tab': {\n key: 'Tab',\n shiftKey: true,\n collapsed: true,\n prefix: /\\t$/,\n handler(range) {\n this.quill.deleteText(range.index - 1, 1, Quill.sources.USER);\n },\n },\n tab: {\n key: 'Tab',\n handler(range, context) {\n if (context.format.table) return true;\n this.quill.history.cutoff();\n const delta = new Delta()\n .retain(range.index)\n .delete(range.length)\n .insert('\\t');\n this.quill.updateContents(delta, Quill.sources.USER);\n this.quill.history.cutoff();\n this.quill.setSelection(range.index + 1, Quill.sources.SILENT);\n return false;\n },\n },\n 'blockquote empty enter': {\n key: 'Enter',\n collapsed: true,\n format: ['blockquote'],\n empty: true,\n handler() {\n this.quill.format('blockquote', false, Quill.sources.USER);\n },\n },\n 'list empty enter': {\n key: 'Enter',\n collapsed: true,\n format: ['list'],\n empty: true,\n handler(range, context) {\n const formats: Record = { list: false };\n if (context.format.indent) {\n formats.indent = false;\n }\n this.quill.formatLine(\n range.index,\n range.length,\n formats,\n Quill.sources.USER,\n );\n },\n },\n 'checklist enter': {\n key: 'Enter',\n collapsed: true,\n format: { list: 'checked' },\n handler(range) {\n const [line, offset] = this.quill.getLine(range.index);\n const formats = {\n // @ts-expect-error Fix me later\n ...line.formats(),\n list: 'checked',\n };\n const delta = new Delta()\n .retain(range.index)\n .insert('\\n', formats)\n // @ts-expect-error Fix me later\n .retain(line.length() - offset - 1)\n .retain(1, { list: 'unchecked' });\n this.quill.updateContents(delta, Quill.sources.USER);\n this.quill.setSelection(range.index + 1, Quill.sources.SILENT);\n this.quill.scrollSelectionIntoView();\n },\n },\n 'header enter': {\n key: 'Enter',\n collapsed: true,\n format: ['header'],\n suffix: /^$/,\n handler(range, context) {\n const [line, offset] = this.quill.getLine(range.index);\n const delta = new Delta()\n .retain(range.index)\n .insert('\\n', context.format)\n // @ts-expect-error Fix me later\n .retain(line.length() - offset - 1)\n .retain(1, { header: null });\n this.quill.updateContents(delta, Quill.sources.USER);\n this.quill.setSelection(range.index + 1, Quill.sources.SILENT);\n this.quill.scrollSelectionIntoView();\n },\n },\n 'table backspace': {\n key: 'Backspace',\n format: ['table'],\n collapsed: true,\n offset: 0,\n handler() {},\n },\n 'table delete': {\n key: 'Delete',\n format: ['table'],\n collapsed: true,\n suffix: /^$/,\n handler() {},\n },\n 'table enter': {\n key: 'Enter',\n shiftKey: null,\n format: ['table'],\n handler(range) {\n const module = this.quill.getModule('table');\n if (module) {\n // @ts-expect-error\n const [table, row, cell, offset] = module.getTable(range);\n const shift = tableSide(table, row, cell, offset);\n if (shift == null) return;\n let index = table.offset();\n if (shift < 0) {\n const delta = new Delta().retain(index).insert('\\n');\n this.quill.updateContents(delta, Quill.sources.USER);\n this.quill.setSelection(\n range.index + 1,\n range.length,\n Quill.sources.SILENT,\n );\n } else if (shift > 0) {\n index += table.length();\n const delta = new Delta().retain(index).insert('\\n');\n this.quill.updateContents(delta, Quill.sources.USER);\n this.quill.setSelection(index, Quill.sources.USER);\n }\n }\n },\n },\n 'table tab': {\n key: 'Tab',\n shiftKey: null,\n format: ['table'],\n handler(range, context) {\n const { event, line: cell } = context;\n const offset = cell.offset(this.quill.scroll);\n if (event.shiftKey) {\n this.quill.setSelection(offset - 1, Quill.sources.USER);\n } else {\n this.quill.setSelection(offset + cell.length(), Quill.sources.USER);\n }\n },\n },\n 'list autofill': {\n key: ' ',\n shiftKey: null,\n collapsed: true,\n format: {\n 'code-block': false,\n blockquote: false,\n table: false,\n },\n prefix: /^\\s*?(\\d+\\.|-|\\*|\\[ ?\\]|\\[x\\])$/,\n handler(range, context) {\n if (this.quill.scroll.query('list') == null) return true;\n const { length } = context.prefix;\n const [line, offset] = this.quill.getLine(range.index);\n if (offset > length) return true;\n let value;\n switch (context.prefix.trim()) {\n case '[]':\n case '[ ]':\n value = 'unchecked';\n break;\n case '[x]':\n value = 'checked';\n break;\n case '-':\n case '*':\n value = 'bullet';\n break;\n default:\n value = 'ordered';\n }\n this.quill.insertText(range.index, ' ', Quill.sources.USER);\n this.quill.history.cutoff();\n const delta = new Delta()\n .retain(range.index - offset)\n .delete(length + 1)\n // @ts-expect-error Fix me later\n .retain(line.length() - 2 - offset)\n .retain(1, { list: value });\n this.quill.updateContents(delta, Quill.sources.USER);\n this.quill.history.cutoff();\n this.quill.setSelection(range.index - length, Quill.sources.SILENT);\n return false;\n },\n },\n 'code exit': {\n key: 'Enter',\n collapsed: true,\n format: ['code-block'],\n prefix: /^$/,\n suffix: /^\\s*$/,\n handler(range) {\n const [line, offset] = this.quill.getLine(range.index);\n let numLines = 2;\n let cur = line;\n while (\n cur != null &&\n cur.length() <= 1 &&\n cur.formats()['code-block']\n ) {\n // @ts-expect-error\n cur = cur.prev;\n numLines -= 1;\n // Requisite prev lines are empty\n if (numLines <= 0) {\n const delta = new Delta()\n // @ts-expect-error Fix me later\n .retain(range.index + line.length() - offset - 2)\n .retain(1, { 'code-block': null })\n .delete(1);\n this.quill.updateContents(delta, Quill.sources.USER);\n this.quill.setSelection(range.index - 1, Quill.sources.SILENT);\n return false;\n }\n }\n return true;\n },\n },\n 'embed left': makeEmbedArrowHandler('ArrowLeft', false),\n 'embed left shift': makeEmbedArrowHandler('ArrowLeft', true),\n 'embed right': makeEmbedArrowHandler('ArrowRight', false),\n 'embed right shift': makeEmbedArrowHandler('ArrowRight', true),\n 'table down': makeTableArrowHandler(false),\n 'table up': makeTableArrowHandler(true),\n },\n};\n\nKeyboard.DEFAULTS = defaultOptions;\n\nfunction makeCodeBlockHandler(indent: boolean): BindingObject {\n return {\n key: 'Tab',\n shiftKey: !indent,\n format: { 'code-block': true },\n handler(range, { event }) {\n const CodeBlock = this.quill.scroll.query('code-block');\n // @ts-expect-error\n const { TAB } = CodeBlock;\n if (range.length === 0 && !event.shiftKey) {\n this.quill.insertText(range.index, TAB, Quill.sources.USER);\n this.quill.setSelection(range.index + TAB.length, Quill.sources.SILENT);\n return;\n }\n\n const lines =\n range.length === 0\n ? this.quill.getLines(range.index, 1)\n : this.quill.getLines(range);\n let { index, length } = range;\n lines.forEach((line, i) => {\n if (indent) {\n line.insertAt(0, TAB);\n if (i === 0) {\n index += TAB.length;\n } else {\n length += TAB.length;\n }\n // @ts-expect-error Fix me later\n } else if (line.domNode.textContent.startsWith(TAB)) {\n line.deleteAt(0, TAB.length);\n if (i === 0) {\n index -= TAB.length;\n } else {\n length -= TAB.length;\n }\n }\n });\n this.quill.update(Quill.sources.USER);\n this.quill.setSelection(index, length, Quill.sources.SILENT);\n },\n };\n}\n\nfunction makeEmbedArrowHandler(\n key: string,\n shiftKey: boolean | null,\n): BindingObject {\n const where = key === 'ArrowLeft' ? 'prefix' : 'suffix';\n return {\n key,\n shiftKey,\n altKey: null,\n [where]: /^$/,\n handler(range) {\n let { index } = range;\n if (key === 'ArrowRight') {\n index += range.length + 1;\n }\n const [leaf] = this.quill.getLeaf(index);\n if (!(leaf instanceof EmbedBlot)) return true;\n if (key === 'ArrowLeft') {\n if (shiftKey) {\n this.quill.setSelection(\n range.index - 1,\n range.length + 1,\n Quill.sources.USER,\n );\n } else {\n this.quill.setSelection(range.index - 1, Quill.sources.USER);\n }\n } else if (shiftKey) {\n this.quill.setSelection(\n range.index,\n range.length + 1,\n Quill.sources.USER,\n );\n } else {\n this.quill.setSelection(\n range.index + range.length + 1,\n Quill.sources.USER,\n );\n }\n return false;\n },\n };\n}\n\nfunction makeFormatHandler(format: string): BindingObject {\n return {\n key: format[0],\n shortKey: true,\n handler(range, context) {\n this.quill.format(format, !context.format[format], Quill.sources.USER);\n },\n };\n}\n\nfunction makeTableArrowHandler(up: boolean): BindingObject {\n return {\n key: up ? 'ArrowUp' : 'ArrowDown',\n collapsed: true,\n format: ['table'],\n handler(range, context) {\n // TODO move to table module\n const key = up ? 'prev' : 'next';\n const cell = context.line;\n const targetRow = cell.parent[key];\n if (targetRow != null) {\n if (targetRow.statics.blotName === 'table-row') {\n // @ts-expect-error\n let targetCell = targetRow.children.head;\n let cur = cell;\n while (cur.prev != null) {\n // @ts-expect-error\n cur = cur.prev;\n targetCell = targetCell.next;\n }\n const index =\n targetCell.offset(this.quill.scroll) +\n Math.min(context.offset, targetCell.length() - 1);\n this.quill.setSelection(index, 0, Quill.sources.USER);\n }\n } else {\n // @ts-expect-error\n const targetLine = cell.table()[key];\n if (targetLine != null) {\n if (up) {\n this.quill.setSelection(\n targetLine.offset(this.quill.scroll) + targetLine.length() - 1,\n 0,\n Quill.sources.USER,\n );\n } else {\n this.quill.setSelection(\n targetLine.offset(this.quill.scroll),\n 0,\n Quill.sources.USER,\n );\n }\n }\n }\n return false;\n },\n };\n}\n\nfunction normalize(binding: Binding): BindingObject | null {\n if (typeof binding === 'string' || typeof binding === 'number') {\n binding = { key: binding };\n } else if (typeof binding === 'object') {\n binding = cloneDeep(binding);\n } else {\n return null;\n }\n if (binding.shortKey) {\n binding[SHORTKEY] = binding.shortKey;\n delete binding.shortKey;\n }\n return binding;\n}\n\n// TODO: Move into quill.ts or editor.ts\nfunction deleteRange({ quill, range }: { quill: Quill; range: Range }) {\n const lines = quill.getLines(range);\n let formats = {};\n if (lines.length > 1) {\n const firstFormats = lines[0].formats();\n const lastFormats = lines[lines.length - 1].formats();\n formats = AttributeMap.diff(lastFormats, firstFormats) || {};\n }\n quill.deleteText(range, Quill.sources.USER);\n if (Object.keys(formats).length > 0) {\n quill.formatLine(range.index, 1, formats, Quill.sources.USER);\n }\n quill.setSelection(range.index, Quill.sources.SILENT);\n}\n\nfunction tableSide(_table: unknown, row: Blot, cell: Blot, offset: number) {\n if (row.prev == null && row.next == null) {\n if (cell.prev == null && cell.next == null) {\n return offset === 0 ? -1 : 1;\n }\n return cell.prev == null ? -1 : 1;\n }\n if (row.prev == null) {\n return -1;\n }\n if (row.next == null) {\n return 1;\n }\n return null;\n}\n\nexport { Keyboard as default, SHORTKEY, normalize, deleteRange };\n","'use strict';\n\nvar has = Object.prototype.hasOwnProperty\n , prefix = '~';\n\n/**\n * Constructor to create a storage for our `EE` objects.\n * An `Events` instance is a plain object whose properties are event names.\n *\n * @constructor\n * @private\n */\nfunction Events() {}\n\n//\n// We try to not inherit from `Object.prototype`. In some engines creating an\n// instance in this way is faster than calling `Object.create(null)` directly.\n// If `Object.create(null)` is not supported we prefix the event names with a\n// character to make sure that the built-in object properties are not\n// overridden or used as an attack vector.\n//\nif (Object.create) {\n Events.prototype = Object.create(null);\n\n //\n // This hack is needed because the `__proto__` property is still inherited in\n // some old browsers like Android 4, iPhone 5.1, Opera 11 and Safari 5.\n //\n if (!new Events().__proto__) prefix = false;\n}\n\n/**\n * Representation of a single event listener.\n *\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} [once=false] Specify if the listener is a one-time listener.\n * @constructor\n * @private\n */\nfunction EE(fn, context, once) {\n this.fn = fn;\n this.context = context;\n this.once = once || false;\n}\n\n/**\n * Add a listener for a given event.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} once Specify if the listener is a one-time listener.\n * @returns {EventEmitter}\n * @private\n */\nfunction addListener(emitter, event, fn, context, once) {\n if (typeof fn !== 'function') {\n throw new TypeError('The listener must be a function');\n }\n\n var listener = new EE(fn, context || emitter, once)\n , evt = prefix ? prefix + event : event;\n\n if (!emitter._events[evt]) emitter._events[evt] = listener, emitter._eventsCount++;\n else if (!emitter._events[evt].fn) emitter._events[evt].push(listener);\n else emitter._events[evt] = [emitter._events[evt], listener];\n\n return emitter;\n}\n\n/**\n * Clear event by name.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} evt The Event name.\n * @private\n */\nfunction clearEvent(emitter, evt) {\n if (--emitter._eventsCount === 0) emitter._events = new Events();\n else delete emitter._events[evt];\n}\n\n/**\n * Minimal `EventEmitter` interface that is molded against the Node.js\n * `EventEmitter` interface.\n *\n * @constructor\n * @public\n */\nfunction EventEmitter() {\n this._events = new Events();\n this._eventsCount = 0;\n}\n\n/**\n * Return an array listing the events for which the emitter has registered\n * listeners.\n *\n * @returns {Array}\n * @public\n */\nEventEmitter.prototype.eventNames = function eventNames() {\n var names = []\n , events\n , name;\n\n if (this._eventsCount === 0) return names;\n\n for (name in (events = this._events)) {\n if (has.call(events, name)) names.push(prefix ? name.slice(1) : name);\n }\n\n if (Object.getOwnPropertySymbols) {\n return names.concat(Object.getOwnPropertySymbols(events));\n }\n\n return names;\n};\n\n/**\n * Return the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Array} The registered listeners.\n * @public\n */\nEventEmitter.prototype.listeners = function listeners(event) {\n var evt = prefix ? prefix + event : event\n , handlers = this._events[evt];\n\n if (!handlers) return [];\n if (handlers.fn) return [handlers.fn];\n\n for (var i = 0, l = handlers.length, ee = new Array(l); i < l; i++) {\n ee[i] = handlers[i].fn;\n }\n\n return ee;\n};\n\n/**\n * Return the number of listeners listening to a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Number} The number of listeners.\n * @public\n */\nEventEmitter.prototype.listenerCount = function listenerCount(event) {\n var evt = prefix ? prefix + event : event\n , listeners = this._events[evt];\n\n if (!listeners) return 0;\n if (listeners.fn) return 1;\n return listeners.length;\n};\n\n/**\n * Calls each of the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Boolean} `true` if the event had listeners, else `false`.\n * @public\n */\nEventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {\n var evt = prefix ? prefix + event : event;\n\n if (!this._events[evt]) return false;\n\n var listeners = this._events[evt]\n , len = arguments.length\n , args\n , i;\n\n if (listeners.fn) {\n if (listeners.once) this.removeListener(event, listeners.fn, undefined, true);\n\n switch (len) {\n case 1: return listeners.fn.call(listeners.context), true;\n case 2: return listeners.fn.call(listeners.context, a1), true;\n case 3: return listeners.fn.call(listeners.context, a1, a2), true;\n case 4: return listeners.fn.call(listeners.context, a1, a2, a3), true;\n case 5: return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;\n case 6: return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;\n }\n\n for (i = 1, args = new Array(len -1); i < len; i++) {\n args[i - 1] = arguments[i];\n }\n\n listeners.fn.apply(listeners.context, args);\n } else {\n var length = listeners.length\n , j;\n\n for (i = 0; i < length; i++) {\n if (listeners[i].once) this.removeListener(event, listeners[i].fn, undefined, true);\n\n switch (len) {\n case 1: listeners[i].fn.call(listeners[i].context); break;\n case 2: listeners[i].fn.call(listeners[i].context, a1); break;\n case 3: listeners[i].fn.call(listeners[i].context, a1, a2); break;\n case 4: listeners[i].fn.call(listeners[i].context, a1, a2, a3); break;\n default:\n if (!args) for (j = 1, args = new Array(len -1); j < len; j++) {\n args[j - 1] = arguments[j];\n }\n\n listeners[i].fn.apply(listeners[i].context, args);\n }\n }\n }\n\n return true;\n};\n\n/**\n * Add a listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.on = function on(event, fn, context) {\n return addListener(this, event, fn, context, false);\n};\n\n/**\n * Add a one-time listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.once = function once(event, fn, context) {\n return addListener(this, event, fn, context, true);\n};\n\n/**\n * Remove the listeners of a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn Only remove the listeners that match this function.\n * @param {*} context Only remove the listeners that have this context.\n * @param {Boolean} once Only remove one-time listeners.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) {\n var evt = prefix ? prefix + event : event;\n\n if (!this._events[evt]) return this;\n if (!fn) {\n clearEvent(this, evt);\n return this;\n }\n\n var listeners = this._events[evt];\n\n if (listeners.fn) {\n if (\n listeners.fn === fn &&\n (!once || listeners.once) &&\n (!context || listeners.context === context)\n ) {\n clearEvent(this, evt);\n }\n } else {\n for (var i = 0, events = [], length = listeners.length; i < length; i++) {\n if (\n listeners[i].fn !== fn ||\n (once && !listeners[i].once) ||\n (context && listeners[i].context !== context)\n ) {\n events.push(listeners[i]);\n }\n }\n\n //\n // Reset the array, or remove it completely if we have no more listeners.\n //\n if (events.length) this._events[evt] = events.length === 1 ? events[0] : events;\n else clearEvent(this, evt);\n }\n\n return this;\n};\n\n/**\n * Remove all listeners, or those of the specified event.\n *\n * @param {(String|Symbol)} [event] The event name.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeAllListeners = function removeAllListeners(event) {\n var evt;\n\n if (event) {\n evt = prefix ? prefix + event : event;\n if (this._events[evt]) clearEvent(this, evt);\n } else {\n this._events = new Events();\n this._eventsCount = 0;\n }\n\n return this;\n};\n\n//\n// Alias methods names because people roll like that.\n//\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\nEventEmitter.prototype.addListener = EventEmitter.prototype.on;\n\n//\n// Expose the prefix.\n//\nEventEmitter.prefixed = prefix;\n\n//\n// Allow `EventEmitter` to be imported as module namespace.\n//\nEventEmitter.EventEmitter = EventEmitter;\n\n//\n// Expose the module.\n//\nif ('undefined' !== typeof module) {\n module.exports = EventEmitter;\n}\n","/**\n * This library modifies the diff-patch-match library by Neil Fraser\n * by removing the patch and match functionality and certain advanced\n * options in the diff function. The original license is as follows:\n *\n * ===\n *\n * Diff Match and Patch\n *\n * Copyright 2006 Google Inc.\n * http://code.google.com/p/google-diff-match-patch/\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * The data structure representing a diff is an array of tuples:\n * [[DIFF_DELETE, 'Hello'], [DIFF_INSERT, 'Goodbye'], [DIFF_EQUAL, ' world.']]\n * which means: delete 'Hello', add 'Goodbye' and keep ' world.'\n */\nvar DIFF_DELETE = -1;\nvar DIFF_INSERT = 1;\nvar DIFF_EQUAL = 0;\n\n/**\n * Find the differences between two texts. Simplifies the problem by stripping\n * any common prefix or suffix off the texts before diffing.\n * @param {string} text1 Old string to be diffed.\n * @param {string} text2 New string to be diffed.\n * @param {Int|Object} [cursor_pos] Edit position in text1 or object with more info\n * @param {boolean} [cleanup] Apply semantic cleanup before returning.\n * @return {Array} Array of diff tuples.\n */\nfunction diff_main(text1, text2, cursor_pos, cleanup, _fix_unicode) {\n // Check for equality\n if (text1 === text2) {\n if (text1) {\n return [[DIFF_EQUAL, text1]];\n }\n return [];\n }\n\n if (cursor_pos != null) {\n var editdiff = find_cursor_edit_diff(text1, text2, cursor_pos);\n if (editdiff) {\n return editdiff;\n }\n }\n\n // Trim off common prefix (speedup).\n var commonlength = diff_commonPrefix(text1, text2);\n var commonprefix = text1.substring(0, commonlength);\n text1 = text1.substring(commonlength);\n text2 = text2.substring(commonlength);\n\n // Trim off common suffix (speedup).\n commonlength = diff_commonSuffix(text1, text2);\n var commonsuffix = text1.substring(text1.length - commonlength);\n text1 = text1.substring(0, text1.length - commonlength);\n text2 = text2.substring(0, text2.length - commonlength);\n\n // Compute the diff on the middle block.\n var diffs = diff_compute_(text1, text2);\n\n // Restore the prefix and suffix.\n if (commonprefix) {\n diffs.unshift([DIFF_EQUAL, commonprefix]);\n }\n if (commonsuffix) {\n diffs.push([DIFF_EQUAL, commonsuffix]);\n }\n diff_cleanupMerge(diffs, _fix_unicode);\n if (cleanup) {\n diff_cleanupSemantic(diffs);\n }\n return diffs;\n}\n\n/**\n * Find the differences between two texts. Assumes that the texts do not\n * have any common prefix or suffix.\n * @param {string} text1 Old string to be diffed.\n * @param {string} text2 New string to be diffed.\n * @return {Array} Array of diff tuples.\n */\nfunction diff_compute_(text1, text2) {\n var diffs;\n\n if (!text1) {\n // Just add some text (speedup).\n return [[DIFF_INSERT, text2]];\n }\n\n if (!text2) {\n // Just delete some text (speedup).\n return [[DIFF_DELETE, text1]];\n }\n\n var longtext = text1.length > text2.length ? text1 : text2;\n var shorttext = text1.length > text2.length ? text2 : text1;\n var i = longtext.indexOf(shorttext);\n if (i !== -1) {\n // Shorter text is inside the longer text (speedup).\n diffs = [\n [DIFF_INSERT, longtext.substring(0, i)],\n [DIFF_EQUAL, shorttext],\n [DIFF_INSERT, longtext.substring(i + shorttext.length)],\n ];\n // Swap insertions for deletions if diff is reversed.\n if (text1.length > text2.length) {\n diffs[0][0] = diffs[2][0] = DIFF_DELETE;\n }\n return diffs;\n }\n\n if (shorttext.length === 1) {\n // Single character string.\n // After the previous speedup, the character can't be an equality.\n return [\n [DIFF_DELETE, text1],\n [DIFF_INSERT, text2],\n ];\n }\n\n // Check to see if the problem can be split in two.\n var hm = diff_halfMatch_(text1, text2);\n if (hm) {\n // A half-match was found, sort out the return data.\n var text1_a = hm[0];\n var text1_b = hm[1];\n var text2_a = hm[2];\n var text2_b = hm[3];\n var mid_common = hm[4];\n // Send both pairs off for separate processing.\n var diffs_a = diff_main(text1_a, text2_a);\n var diffs_b = diff_main(text1_b, text2_b);\n // Merge the results.\n return diffs_a.concat([[DIFF_EQUAL, mid_common]], diffs_b);\n }\n\n return diff_bisect_(text1, text2);\n}\n\n/**\n * Find the 'middle snake' of a diff, split the problem in two\n * and return the recursively constructed diff.\n * See Myers 1986 paper: An O(ND) Difference Algorithm and Its Variations.\n * @param {string} text1 Old string to be diffed.\n * @param {string} text2 New string to be diffed.\n * @return {Array} Array of diff tuples.\n * @private\n */\nfunction diff_bisect_(text1, text2) {\n // Cache the text lengths to prevent multiple calls.\n var text1_length = text1.length;\n var text2_length = text2.length;\n var max_d = Math.ceil((text1_length + text2_length) / 2);\n var v_offset = max_d;\n var v_length = 2 * max_d;\n var v1 = new Array(v_length);\n var v2 = new Array(v_length);\n // Setting all elements to -1 is faster in Chrome & Firefox than mixing\n // integers and undefined.\n for (var x = 0; x < v_length; x++) {\n v1[x] = -1;\n v2[x] = -1;\n }\n v1[v_offset + 1] = 0;\n v2[v_offset + 1] = 0;\n var delta = text1_length - text2_length;\n // If the total number of characters is odd, then the front path will collide\n // with the reverse path.\n var front = delta % 2 !== 0;\n // Offsets for start and end of k loop.\n // Prevents mapping of space beyond the grid.\n var k1start = 0;\n var k1end = 0;\n var k2start = 0;\n var k2end = 0;\n for (var d = 0; d < max_d; d++) {\n // Walk the front path one step.\n for (var k1 = -d + k1start; k1 <= d - k1end; k1 += 2) {\n var k1_offset = v_offset + k1;\n var x1;\n if (k1 === -d || (k1 !== d && v1[k1_offset - 1] < v1[k1_offset + 1])) {\n x1 = v1[k1_offset + 1];\n } else {\n x1 = v1[k1_offset - 1] + 1;\n }\n var y1 = x1 - k1;\n while (\n x1 < text1_length &&\n y1 < text2_length &&\n text1.charAt(x1) === text2.charAt(y1)\n ) {\n x1++;\n y1++;\n }\n v1[k1_offset] = x1;\n if (x1 > text1_length) {\n // Ran off the right of the graph.\n k1end += 2;\n } else if (y1 > text2_length) {\n // Ran off the bottom of the graph.\n k1start += 2;\n } else if (front) {\n var k2_offset = v_offset + delta - k1;\n if (k2_offset >= 0 && k2_offset < v_length && v2[k2_offset] !== -1) {\n // Mirror x2 onto top-left coordinate system.\n var x2 = text1_length - v2[k2_offset];\n if (x1 >= x2) {\n // Overlap detected.\n return diff_bisectSplit_(text1, text2, x1, y1);\n }\n }\n }\n }\n\n // Walk the reverse path one step.\n for (var k2 = -d + k2start; k2 <= d - k2end; k2 += 2) {\n var k2_offset = v_offset + k2;\n var x2;\n if (k2 === -d || (k2 !== d && v2[k2_offset - 1] < v2[k2_offset + 1])) {\n x2 = v2[k2_offset + 1];\n } else {\n x2 = v2[k2_offset - 1] + 1;\n }\n var y2 = x2 - k2;\n while (\n x2 < text1_length &&\n y2 < text2_length &&\n text1.charAt(text1_length - x2 - 1) ===\n text2.charAt(text2_length - y2 - 1)\n ) {\n x2++;\n y2++;\n }\n v2[k2_offset] = x2;\n if (x2 > text1_length) {\n // Ran off the left of the graph.\n k2end += 2;\n } else if (y2 > text2_length) {\n // Ran off the top of the graph.\n k2start += 2;\n } else if (!front) {\n var k1_offset = v_offset + delta - k2;\n if (k1_offset >= 0 && k1_offset < v_length && v1[k1_offset] !== -1) {\n var x1 = v1[k1_offset];\n var y1 = v_offset + x1 - k1_offset;\n // Mirror x2 onto top-left coordinate system.\n x2 = text1_length - x2;\n if (x1 >= x2) {\n // Overlap detected.\n return diff_bisectSplit_(text1, text2, x1, y1);\n }\n }\n }\n }\n }\n // Diff took too long and hit the deadline or\n // number of diffs equals number of characters, no commonality at all.\n return [\n [DIFF_DELETE, text1],\n [DIFF_INSERT, text2],\n ];\n}\n\n/**\n * Given the location of the 'middle snake', split the diff in two parts\n * and recurse.\n * @param {string} text1 Old string to be diffed.\n * @param {string} text2 New string to be diffed.\n * @param {number} x Index of split point in text1.\n * @param {number} y Index of split point in text2.\n * @return {Array} Array of diff tuples.\n */\nfunction diff_bisectSplit_(text1, text2, x, y) {\n var text1a = text1.substring(0, x);\n var text2a = text2.substring(0, y);\n var text1b = text1.substring(x);\n var text2b = text2.substring(y);\n\n // Compute both diffs serially.\n var diffs = diff_main(text1a, text2a);\n var diffsb = diff_main(text1b, text2b);\n\n return diffs.concat(diffsb);\n}\n\n/**\n * Determine the common prefix of two strings.\n * @param {string} text1 First string.\n * @param {string} text2 Second string.\n * @return {number} The number of characters common to the start of each\n * string.\n */\nfunction diff_commonPrefix(text1, text2) {\n // Quick check for common null cases.\n if (!text1 || !text2 || text1.charAt(0) !== text2.charAt(0)) {\n return 0;\n }\n // Binary search.\n // Performance analysis: http://neil.fraser.name/news/2007/10/09/\n var pointermin = 0;\n var pointermax = Math.min(text1.length, text2.length);\n var pointermid = pointermax;\n var pointerstart = 0;\n while (pointermin < pointermid) {\n if (\n text1.substring(pointerstart, pointermid) ==\n text2.substring(pointerstart, pointermid)\n ) {\n pointermin = pointermid;\n pointerstart = pointermin;\n } else {\n pointermax = pointermid;\n }\n pointermid = Math.floor((pointermax - pointermin) / 2 + pointermin);\n }\n\n if (is_surrogate_pair_start(text1.charCodeAt(pointermid - 1))) {\n pointermid--;\n }\n\n return pointermid;\n}\n\n/**\n * Determine if the suffix of one string is the prefix of another.\n * @param {string} text1 First string.\n * @param {string} text2 Second string.\n * @return {number} The number of characters common to the end of the first\n * string and the start of the second string.\n * @private\n */\nfunction diff_commonOverlap_(text1, text2) {\n // Cache the text lengths to prevent multiple calls.\n var text1_length = text1.length;\n var text2_length = text2.length;\n // Eliminate the null case.\n if (text1_length == 0 || text2_length == 0) {\n return 0;\n }\n // Truncate the longer string.\n if (text1_length > text2_length) {\n text1 = text1.substring(text1_length - text2_length);\n } else if (text1_length < text2_length) {\n text2 = text2.substring(0, text1_length);\n }\n var text_length = Math.min(text1_length, text2_length);\n // Quick check for the worst case.\n if (text1 == text2) {\n return text_length;\n }\n\n // Start by looking for a single character match\n // and increase length until no match is found.\n // Performance analysis: http://neil.fraser.name/news/2010/11/04/\n var best = 0;\n var length = 1;\n while (true) {\n var pattern = text1.substring(text_length - length);\n var found = text2.indexOf(pattern);\n if (found == -1) {\n return best;\n }\n length += found;\n if (\n found == 0 ||\n text1.substring(text_length - length) == text2.substring(0, length)\n ) {\n best = length;\n length++;\n }\n }\n}\n\n/**\n * Determine the common suffix of two strings.\n * @param {string} text1 First string.\n * @param {string} text2 Second string.\n * @return {number} The number of characters common to the end of each string.\n */\nfunction diff_commonSuffix(text1, text2) {\n // Quick check for common null cases.\n if (!text1 || !text2 || text1.slice(-1) !== text2.slice(-1)) {\n return 0;\n }\n // Binary search.\n // Performance analysis: http://neil.fraser.name/news/2007/10/09/\n var pointermin = 0;\n var pointermax = Math.min(text1.length, text2.length);\n var pointermid = pointermax;\n var pointerend = 0;\n while (pointermin < pointermid) {\n if (\n text1.substring(text1.length - pointermid, text1.length - pointerend) ==\n text2.substring(text2.length - pointermid, text2.length - pointerend)\n ) {\n pointermin = pointermid;\n pointerend = pointermin;\n } else {\n pointermax = pointermid;\n }\n pointermid = Math.floor((pointermax - pointermin) / 2 + pointermin);\n }\n\n if (is_surrogate_pair_end(text1.charCodeAt(text1.length - pointermid))) {\n pointermid--;\n }\n\n return pointermid;\n}\n\n/**\n * Do the two texts share a substring which is at least half the length of the\n * longer text?\n * This speedup can produce non-minimal diffs.\n * @param {string} text1 First string.\n * @param {string} text2 Second string.\n * @return {Array.} Five element Array, containing the prefix of\n * text1, the suffix of text1, the prefix of text2, the suffix of\n * text2 and the common middle. Or null if there was no match.\n */\nfunction diff_halfMatch_(text1, text2) {\n var longtext = text1.length > text2.length ? text1 : text2;\n var shorttext = text1.length > text2.length ? text2 : text1;\n if (longtext.length < 4 || shorttext.length * 2 < longtext.length) {\n return null; // Pointless.\n }\n\n /**\n * Does a substring of shorttext exist within longtext such that the substring\n * is at least half the length of longtext?\n * Closure, but does not reference any external variables.\n * @param {string} longtext Longer string.\n * @param {string} shorttext Shorter string.\n * @param {number} i Start index of quarter length substring within longtext.\n * @return {Array.} Five element Array, containing the prefix of\n * longtext, the suffix of longtext, the prefix of shorttext, the suffix\n * of shorttext and the common middle. Or null if there was no match.\n * @private\n */\n function diff_halfMatchI_(longtext, shorttext, i) {\n // Start with a 1/4 length substring at position i as a seed.\n var seed = longtext.substring(i, i + Math.floor(longtext.length / 4));\n var j = -1;\n var best_common = \"\";\n var best_longtext_a, best_longtext_b, best_shorttext_a, best_shorttext_b;\n while ((j = shorttext.indexOf(seed, j + 1)) !== -1) {\n var prefixLength = diff_commonPrefix(\n longtext.substring(i),\n shorttext.substring(j)\n );\n var suffixLength = diff_commonSuffix(\n longtext.substring(0, i),\n shorttext.substring(0, j)\n );\n if (best_common.length < suffixLength + prefixLength) {\n best_common =\n shorttext.substring(j - suffixLength, j) +\n shorttext.substring(j, j + prefixLength);\n best_longtext_a = longtext.substring(0, i - suffixLength);\n best_longtext_b = longtext.substring(i + prefixLength);\n best_shorttext_a = shorttext.substring(0, j - suffixLength);\n best_shorttext_b = shorttext.substring(j + prefixLength);\n }\n }\n if (best_common.length * 2 >= longtext.length) {\n return [\n best_longtext_a,\n best_longtext_b,\n best_shorttext_a,\n best_shorttext_b,\n best_common,\n ];\n } else {\n return null;\n }\n }\n\n // First check if the second quarter is the seed for a half-match.\n var hm1 = diff_halfMatchI_(\n longtext,\n shorttext,\n Math.ceil(longtext.length / 4)\n );\n // Check again based on the third quarter.\n var hm2 = diff_halfMatchI_(\n longtext,\n shorttext,\n Math.ceil(longtext.length / 2)\n );\n var hm;\n if (!hm1 && !hm2) {\n return null;\n } else if (!hm2) {\n hm = hm1;\n } else if (!hm1) {\n hm = hm2;\n } else {\n // Both matched. Select the longest.\n hm = hm1[4].length > hm2[4].length ? hm1 : hm2;\n }\n\n // A half-match was found, sort out the return data.\n var text1_a, text1_b, text2_a, text2_b;\n if (text1.length > text2.length) {\n text1_a = hm[0];\n text1_b = hm[1];\n text2_a = hm[2];\n text2_b = hm[3];\n } else {\n text2_a = hm[0];\n text2_b = hm[1];\n text1_a = hm[2];\n text1_b = hm[3];\n }\n var mid_common = hm[4];\n return [text1_a, text1_b, text2_a, text2_b, mid_common];\n}\n\n/**\n * Reduce the number of edits by eliminating semantically trivial equalities.\n * @param {!Array.} diffs Array of diff tuples.\n */\nfunction diff_cleanupSemantic(diffs) {\n var changes = false;\n var equalities = []; // Stack of indices where equalities are found.\n var equalitiesLength = 0; // Keeping our own length var is faster in JS.\n /** @type {?string} */\n var lastequality = null;\n // Always equal to diffs[equalities[equalitiesLength - 1]][1]\n var pointer = 0; // Index of current position.\n // Number of characters that changed prior to the equality.\n var length_insertions1 = 0;\n var length_deletions1 = 0;\n // Number of characters that changed after the equality.\n var length_insertions2 = 0;\n var length_deletions2 = 0;\n while (pointer < diffs.length) {\n if (diffs[pointer][0] == DIFF_EQUAL) {\n // Equality found.\n equalities[equalitiesLength++] = pointer;\n length_insertions1 = length_insertions2;\n length_deletions1 = length_deletions2;\n length_insertions2 = 0;\n length_deletions2 = 0;\n lastequality = diffs[pointer][1];\n } else {\n // An insertion or deletion.\n if (diffs[pointer][0] == DIFF_INSERT) {\n length_insertions2 += diffs[pointer][1].length;\n } else {\n length_deletions2 += diffs[pointer][1].length;\n }\n // Eliminate an equality that is smaller or equal to the edits on both\n // sides of it.\n if (\n lastequality &&\n lastequality.length <=\n Math.max(length_insertions1, length_deletions1) &&\n lastequality.length <= Math.max(length_insertions2, length_deletions2)\n ) {\n // Duplicate record.\n diffs.splice(equalities[equalitiesLength - 1], 0, [\n DIFF_DELETE,\n lastequality,\n ]);\n // Change second copy to insert.\n diffs[equalities[equalitiesLength - 1] + 1][0] = DIFF_INSERT;\n // Throw away the equality we just deleted.\n equalitiesLength--;\n // Throw away the previous equality (it needs to be reevaluated).\n equalitiesLength--;\n pointer = equalitiesLength > 0 ? equalities[equalitiesLength - 1] : -1;\n length_insertions1 = 0; // Reset the counters.\n length_deletions1 = 0;\n length_insertions2 = 0;\n length_deletions2 = 0;\n lastequality = null;\n changes = true;\n }\n }\n pointer++;\n }\n\n // Normalize the diff.\n if (changes) {\n diff_cleanupMerge(diffs);\n }\n diff_cleanupSemanticLossless(diffs);\n\n // Find any overlaps between deletions and insertions.\n // e.g: abcxxxxxxdef\n // -> abcxxxdef\n // e.g: xxxabcdefxxx\n // -> defxxxabc\n // Only extract an overlap if it is as big as the edit ahead or behind it.\n pointer = 1;\n while (pointer < diffs.length) {\n if (\n diffs[pointer - 1][0] == DIFF_DELETE &&\n diffs[pointer][0] == DIFF_INSERT\n ) {\n var deletion = diffs[pointer - 1][1];\n var insertion = diffs[pointer][1];\n var overlap_length1 = diff_commonOverlap_(deletion, insertion);\n var overlap_length2 = diff_commonOverlap_(insertion, deletion);\n if (overlap_length1 >= overlap_length2) {\n if (\n overlap_length1 >= deletion.length / 2 ||\n overlap_length1 >= insertion.length / 2\n ) {\n // Overlap found. Insert an equality and trim the surrounding edits.\n diffs.splice(pointer, 0, [\n DIFF_EQUAL,\n insertion.substring(0, overlap_length1),\n ]);\n diffs[pointer - 1][1] = deletion.substring(\n 0,\n deletion.length - overlap_length1\n );\n diffs[pointer + 1][1] = insertion.substring(overlap_length1);\n pointer++;\n }\n } else {\n if (\n overlap_length2 >= deletion.length / 2 ||\n overlap_length2 >= insertion.length / 2\n ) {\n // Reverse overlap found.\n // Insert an equality and swap and trim the surrounding edits.\n diffs.splice(pointer, 0, [\n DIFF_EQUAL,\n deletion.substring(0, overlap_length2),\n ]);\n diffs[pointer - 1][0] = DIFF_INSERT;\n diffs[pointer - 1][1] = insertion.substring(\n 0,\n insertion.length - overlap_length2\n );\n diffs[pointer + 1][0] = DIFF_DELETE;\n diffs[pointer + 1][1] = deletion.substring(overlap_length2);\n pointer++;\n }\n }\n pointer++;\n }\n pointer++;\n }\n}\n\nvar nonAlphaNumericRegex_ = /[^a-zA-Z0-9]/;\nvar whitespaceRegex_ = /\\s/;\nvar linebreakRegex_ = /[\\r\\n]/;\nvar blanklineEndRegex_ = /\\n\\r?\\n$/;\nvar blanklineStartRegex_ = /^\\r?\\n\\r?\\n/;\n\n/**\n * Look for single edits surrounded on both sides by equalities\n * which can be shifted sideways to align the edit to a word boundary.\n * e.g: The cat came. -> The cat came.\n * @param {!Array.} diffs Array of diff tuples.\n */\nfunction diff_cleanupSemanticLossless(diffs) {\n /**\n * Given two strings, compute a score representing whether the internal\n * boundary falls on logical boundaries.\n * Scores range from 6 (best) to 0 (worst).\n * Closure, but does not reference any external variables.\n * @param {string} one First string.\n * @param {string} two Second string.\n * @return {number} The score.\n * @private\n */\n function diff_cleanupSemanticScore_(one, two) {\n if (!one || !two) {\n // Edges are the best.\n return 6;\n }\n\n // Each port of this function behaves slightly differently due to\n // subtle differences in each language's definition of things like\n // 'whitespace'. Since this function's purpose is largely cosmetic,\n // the choice has been made to use each language's native features\n // rather than force total conformity.\n var char1 = one.charAt(one.length - 1);\n var char2 = two.charAt(0);\n var nonAlphaNumeric1 = char1.match(nonAlphaNumericRegex_);\n var nonAlphaNumeric2 = char2.match(nonAlphaNumericRegex_);\n var whitespace1 = nonAlphaNumeric1 && char1.match(whitespaceRegex_);\n var whitespace2 = nonAlphaNumeric2 && char2.match(whitespaceRegex_);\n var lineBreak1 = whitespace1 && char1.match(linebreakRegex_);\n var lineBreak2 = whitespace2 && char2.match(linebreakRegex_);\n var blankLine1 = lineBreak1 && one.match(blanklineEndRegex_);\n var blankLine2 = lineBreak2 && two.match(blanklineStartRegex_);\n\n if (blankLine1 || blankLine2) {\n // Five points for blank lines.\n return 5;\n } else if (lineBreak1 || lineBreak2) {\n // Four points for line breaks.\n return 4;\n } else if (nonAlphaNumeric1 && !whitespace1 && whitespace2) {\n // Three points for end of sentences.\n return 3;\n } else if (whitespace1 || whitespace2) {\n // Two points for whitespace.\n return 2;\n } else if (nonAlphaNumeric1 || nonAlphaNumeric2) {\n // One point for non-alphanumeric.\n return 1;\n }\n return 0;\n }\n\n var pointer = 1;\n // Intentionally ignore the first and last element (don't need checking).\n while (pointer < diffs.length - 1) {\n if (\n diffs[pointer - 1][0] == DIFF_EQUAL &&\n diffs[pointer + 1][0] == DIFF_EQUAL\n ) {\n // This is a single edit surrounded by equalities.\n var equality1 = diffs[pointer - 1][1];\n var edit = diffs[pointer][1];\n var equality2 = diffs[pointer + 1][1];\n\n // First, shift the edit as far left as possible.\n var commonOffset = diff_commonSuffix(equality1, edit);\n if (commonOffset) {\n var commonString = edit.substring(edit.length - commonOffset);\n equality1 = equality1.substring(0, equality1.length - commonOffset);\n edit = commonString + edit.substring(0, edit.length - commonOffset);\n equality2 = commonString + equality2;\n }\n\n // Second, step character by character right, looking for the best fit.\n var bestEquality1 = equality1;\n var bestEdit = edit;\n var bestEquality2 = equality2;\n var bestScore =\n diff_cleanupSemanticScore_(equality1, edit) +\n diff_cleanupSemanticScore_(edit, equality2);\n while (edit.charAt(0) === equality2.charAt(0)) {\n equality1 += edit.charAt(0);\n edit = edit.substring(1) + equality2.charAt(0);\n equality2 = equality2.substring(1);\n var score =\n diff_cleanupSemanticScore_(equality1, edit) +\n diff_cleanupSemanticScore_(edit, equality2);\n // The >= encourages trailing rather than leading whitespace on edits.\n if (score >= bestScore) {\n bestScore = score;\n bestEquality1 = equality1;\n bestEdit = edit;\n bestEquality2 = equality2;\n }\n }\n\n if (diffs[pointer - 1][1] != bestEquality1) {\n // We have an improvement, save it back to the diff.\n if (bestEquality1) {\n diffs[pointer - 1][1] = bestEquality1;\n } else {\n diffs.splice(pointer - 1, 1);\n pointer--;\n }\n diffs[pointer][1] = bestEdit;\n if (bestEquality2) {\n diffs[pointer + 1][1] = bestEquality2;\n } else {\n diffs.splice(pointer + 1, 1);\n pointer--;\n }\n }\n }\n pointer++;\n }\n}\n\n/**\n * Reorder and merge like edit sections. Merge equalities.\n * Any edit section can move as long as it doesn't cross an equality.\n * @param {Array} diffs Array of diff tuples.\n * @param {boolean} fix_unicode Whether to normalize to a unicode-correct diff\n */\nfunction diff_cleanupMerge(diffs, fix_unicode) {\n diffs.push([DIFF_EQUAL, \"\"]); // Add a dummy entry at the end.\n var pointer = 0;\n var count_delete = 0;\n var count_insert = 0;\n var text_delete = \"\";\n var text_insert = \"\";\n var commonlength;\n while (pointer < diffs.length) {\n if (pointer < diffs.length - 1 && !diffs[pointer][1]) {\n diffs.splice(pointer, 1);\n continue;\n }\n switch (diffs[pointer][0]) {\n case DIFF_INSERT:\n count_insert++;\n text_insert += diffs[pointer][1];\n pointer++;\n break;\n case DIFF_DELETE:\n count_delete++;\n text_delete += diffs[pointer][1];\n pointer++;\n break;\n case DIFF_EQUAL:\n var previous_equality = pointer - count_insert - count_delete - 1;\n if (fix_unicode) {\n // prevent splitting of unicode surrogate pairs. when fix_unicode is true,\n // we assume that the old and new text in the diff are complete and correct\n // unicode-encoded JS strings, but the tuple boundaries may fall between\n // surrogate pairs. we fix this by shaving off stray surrogates from the end\n // of the previous equality and the beginning of this equality. this may create\n // empty equalities or a common prefix or suffix. for example, if AB and AC are\n // emojis, `[[0, 'A'], [-1, 'BA'], [0, 'C']]` would turn into deleting 'ABAC' and\n // inserting 'AC', and then the common suffix 'AC' will be eliminated. in this\n // particular case, both equalities go away, we absorb any previous inequalities,\n // and we keep scanning for the next equality before rewriting the tuples.\n if (\n previous_equality >= 0 &&\n ends_with_pair_start(diffs[previous_equality][1])\n ) {\n var stray = diffs[previous_equality][1].slice(-1);\n diffs[previous_equality][1] = diffs[previous_equality][1].slice(\n 0,\n -1\n );\n text_delete = stray + text_delete;\n text_insert = stray + text_insert;\n if (!diffs[previous_equality][1]) {\n // emptied out previous equality, so delete it and include previous delete/insert\n diffs.splice(previous_equality, 1);\n pointer--;\n var k = previous_equality - 1;\n if (diffs[k] && diffs[k][0] === DIFF_INSERT) {\n count_insert++;\n text_insert = diffs[k][1] + text_insert;\n k--;\n }\n if (diffs[k] && diffs[k][0] === DIFF_DELETE) {\n count_delete++;\n text_delete = diffs[k][1] + text_delete;\n k--;\n }\n previous_equality = k;\n }\n }\n if (starts_with_pair_end(diffs[pointer][1])) {\n var stray = diffs[pointer][1].charAt(0);\n diffs[pointer][1] = diffs[pointer][1].slice(1);\n text_delete += stray;\n text_insert += stray;\n }\n }\n if (pointer < diffs.length - 1 && !diffs[pointer][1]) {\n // for empty equality not at end, wait for next equality\n diffs.splice(pointer, 1);\n break;\n }\n if (text_delete.length > 0 || text_insert.length > 0) {\n // note that diff_commonPrefix and diff_commonSuffix are unicode-aware\n if (text_delete.length > 0 && text_insert.length > 0) {\n // Factor out any common prefixes.\n commonlength = diff_commonPrefix(text_insert, text_delete);\n if (commonlength !== 0) {\n if (previous_equality >= 0) {\n diffs[previous_equality][1] += text_insert.substring(\n 0,\n commonlength\n );\n } else {\n diffs.splice(0, 0, [\n DIFF_EQUAL,\n text_insert.substring(0, commonlength),\n ]);\n pointer++;\n }\n text_insert = text_insert.substring(commonlength);\n text_delete = text_delete.substring(commonlength);\n }\n // Factor out any common suffixes.\n commonlength = diff_commonSuffix(text_insert, text_delete);\n if (commonlength !== 0) {\n diffs[pointer][1] =\n text_insert.substring(text_insert.length - commonlength) +\n diffs[pointer][1];\n text_insert = text_insert.substring(\n 0,\n text_insert.length - commonlength\n );\n text_delete = text_delete.substring(\n 0,\n text_delete.length - commonlength\n );\n }\n }\n // Delete the offending records and add the merged ones.\n var n = count_insert + count_delete;\n if (text_delete.length === 0 && text_insert.length === 0) {\n diffs.splice(pointer - n, n);\n pointer = pointer - n;\n } else if (text_delete.length === 0) {\n diffs.splice(pointer - n, n, [DIFF_INSERT, text_insert]);\n pointer = pointer - n + 1;\n } else if (text_insert.length === 0) {\n diffs.splice(pointer - n, n, [DIFF_DELETE, text_delete]);\n pointer = pointer - n + 1;\n } else {\n diffs.splice(\n pointer - n,\n n,\n [DIFF_DELETE, text_delete],\n [DIFF_INSERT, text_insert]\n );\n pointer = pointer - n + 2;\n }\n }\n if (pointer !== 0 && diffs[pointer - 1][0] === DIFF_EQUAL) {\n // Merge this equality with the previous one.\n diffs[pointer - 1][1] += diffs[pointer][1];\n diffs.splice(pointer, 1);\n } else {\n pointer++;\n }\n count_insert = 0;\n count_delete = 0;\n text_delete = \"\";\n text_insert = \"\";\n break;\n }\n }\n if (diffs[diffs.length - 1][1] === \"\") {\n diffs.pop(); // Remove the dummy entry at the end.\n }\n\n // Second pass: look for single edits surrounded on both sides by equalities\n // which can be shifted sideways to eliminate an equality.\n // e.g: ABAC -> ABAC\n var changes = false;\n pointer = 1;\n // Intentionally ignore the first and last element (don't need checking).\n while (pointer < diffs.length - 1) {\n if (\n diffs[pointer - 1][0] === DIFF_EQUAL &&\n diffs[pointer + 1][0] === DIFF_EQUAL\n ) {\n // This is a single edit surrounded by equalities.\n if (\n diffs[pointer][1].substring(\n diffs[pointer][1].length - diffs[pointer - 1][1].length\n ) === diffs[pointer - 1][1]\n ) {\n // Shift the edit over the previous equality.\n diffs[pointer][1] =\n diffs[pointer - 1][1] +\n diffs[pointer][1].substring(\n 0,\n diffs[pointer][1].length - diffs[pointer - 1][1].length\n );\n diffs[pointer + 1][1] = diffs[pointer - 1][1] + diffs[pointer + 1][1];\n diffs.splice(pointer - 1, 1);\n changes = true;\n } else if (\n diffs[pointer][1].substring(0, diffs[pointer + 1][1].length) ==\n diffs[pointer + 1][1]\n ) {\n // Shift the edit over the next equality.\n diffs[pointer - 1][1] += diffs[pointer + 1][1];\n diffs[pointer][1] =\n diffs[pointer][1].substring(diffs[pointer + 1][1].length) +\n diffs[pointer + 1][1];\n diffs.splice(pointer + 1, 1);\n changes = true;\n }\n }\n pointer++;\n }\n // If shifts were made, the diff needs reordering and another shift sweep.\n if (changes) {\n diff_cleanupMerge(diffs, fix_unicode);\n }\n}\n\nfunction is_surrogate_pair_start(charCode) {\n return charCode >= 0xd800 && charCode <= 0xdbff;\n}\n\nfunction is_surrogate_pair_end(charCode) {\n return charCode >= 0xdc00 && charCode <= 0xdfff;\n}\n\nfunction starts_with_pair_end(str) {\n return is_surrogate_pair_end(str.charCodeAt(0));\n}\n\nfunction ends_with_pair_start(str) {\n return is_surrogate_pair_start(str.charCodeAt(str.length - 1));\n}\n\nfunction remove_empty_tuples(tuples) {\n var ret = [];\n for (var i = 0; i < tuples.length; i++) {\n if (tuples[i][1].length > 0) {\n ret.push(tuples[i]);\n }\n }\n return ret;\n}\n\nfunction make_edit_splice(before, oldMiddle, newMiddle, after) {\n if (ends_with_pair_start(before) || starts_with_pair_end(after)) {\n return null;\n }\n return remove_empty_tuples([\n [DIFF_EQUAL, before],\n [DIFF_DELETE, oldMiddle],\n [DIFF_INSERT, newMiddle],\n [DIFF_EQUAL, after],\n ]);\n}\n\nfunction find_cursor_edit_diff(oldText, newText, cursor_pos) {\n // note: this runs after equality check has ruled out exact equality\n var oldRange =\n typeof cursor_pos === \"number\"\n ? { index: cursor_pos, length: 0 }\n : cursor_pos.oldRange;\n var newRange = typeof cursor_pos === \"number\" ? null : cursor_pos.newRange;\n // take into account the old and new selection to generate the best diff\n // possible for a text edit. for example, a text change from \"xxx\" to \"xx\"\n // could be a delete or forwards-delete of any one of the x's, or the\n // result of selecting two of the x's and typing \"x\".\n var oldLength = oldText.length;\n var newLength = newText.length;\n if (oldRange.length === 0 && (newRange === null || newRange.length === 0)) {\n // see if we have an insert or delete before or after cursor\n var oldCursor = oldRange.index;\n var oldBefore = oldText.slice(0, oldCursor);\n var oldAfter = oldText.slice(oldCursor);\n var maybeNewCursor = newRange ? newRange.index : null;\n editBefore: {\n // is this an insert or delete right before oldCursor?\n var newCursor = oldCursor + newLength - oldLength;\n if (maybeNewCursor !== null && maybeNewCursor !== newCursor) {\n break editBefore;\n }\n if (newCursor < 0 || newCursor > newLength) {\n break editBefore;\n }\n var newBefore = newText.slice(0, newCursor);\n var newAfter = newText.slice(newCursor);\n if (newAfter !== oldAfter) {\n break editBefore;\n }\n var prefixLength = Math.min(oldCursor, newCursor);\n var oldPrefix = oldBefore.slice(0, prefixLength);\n var newPrefix = newBefore.slice(0, prefixLength);\n if (oldPrefix !== newPrefix) {\n break editBefore;\n }\n var oldMiddle = oldBefore.slice(prefixLength);\n var newMiddle = newBefore.slice(prefixLength);\n return make_edit_splice(oldPrefix, oldMiddle, newMiddle, oldAfter);\n }\n editAfter: {\n // is this an insert or delete right after oldCursor?\n if (maybeNewCursor !== null && maybeNewCursor !== oldCursor) {\n break editAfter;\n }\n var cursor = oldCursor;\n var newBefore = newText.slice(0, cursor);\n var newAfter = newText.slice(cursor);\n if (newBefore !== oldBefore) {\n break editAfter;\n }\n var suffixLength = Math.min(oldLength - cursor, newLength - cursor);\n var oldSuffix = oldAfter.slice(oldAfter.length - suffixLength);\n var newSuffix = newAfter.slice(newAfter.length - suffixLength);\n if (oldSuffix !== newSuffix) {\n break editAfter;\n }\n var oldMiddle = oldAfter.slice(0, oldAfter.length - suffixLength);\n var newMiddle = newAfter.slice(0, newAfter.length - suffixLength);\n return make_edit_splice(oldBefore, oldMiddle, newMiddle, oldSuffix);\n }\n }\n if (oldRange.length > 0 && newRange && newRange.length === 0) {\n replaceRange: {\n // see if diff could be a splice of the old selection range\n var oldPrefix = oldText.slice(0, oldRange.index);\n var oldSuffix = oldText.slice(oldRange.index + oldRange.length);\n var prefixLength = oldPrefix.length;\n var suffixLength = oldSuffix.length;\n if (newLength < prefixLength + suffixLength) {\n break replaceRange;\n }\n var newPrefix = newText.slice(0, prefixLength);\n var newSuffix = newText.slice(newLength - suffixLength);\n if (oldPrefix !== newPrefix || oldSuffix !== newSuffix) {\n break replaceRange;\n }\n var oldMiddle = oldText.slice(prefixLength, oldLength - suffixLength);\n var newMiddle = newText.slice(prefixLength, newLength - suffixLength);\n return make_edit_splice(oldPrefix, oldMiddle, newMiddle, oldSuffix);\n }\n }\n\n return null;\n}\n\nfunction diff(text1, text2, cursor_pos, cleanup) {\n // only pass fix_unicode=true at the top level, not when diff_main is\n // recursively invoked\n return diff_main(text1, text2, cursor_pos, cleanup, true);\n}\n\ndiff.INSERT = DIFF_INSERT;\ndiff.DELETE = DIFF_DELETE;\ndiff.EQUAL = DIFF_EQUAL;\n\nmodule.exports = diff;\n","/**\n * lodash (Custom Build) \n * Build: `lodash modularize exports=\"npm\" -o ./`\n * Copyright jQuery Foundation and other contributors \n * Released under MIT license \n * Based on Underscore.js 1.8.3 \n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n\n/** Used as the size to enable large array optimizations. */\nvar LARGE_ARRAY_SIZE = 200;\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n errorTag = '[object Error]',\n funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n objectTag = '[object Object]',\n promiseTag = '[object Promise]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n symbolTag = '[object Symbol]',\n weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]',\n float32Tag = '[object Float32Array]',\n float64Tag = '[object Float64Array]',\n int8Tag = '[object Int8Array]',\n int16Tag = '[object Int16Array]',\n int32Tag = '[object Int32Array]',\n uint8Tag = '[object Uint8Array]',\n uint8ClampedTag = '[object Uint8ClampedArray]',\n uint16Tag = '[object Uint16Array]',\n uint32Tag = '[object Uint32Array]';\n\n/**\n * Used to match `RegExp`\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n */\nvar reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g;\n\n/** Used to match `RegExp` flags from their coerced string values. */\nvar reFlags = /\\w*$/;\n\n/** Used to detect host constructors (Safari). */\nvar reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n/** Used to detect unsigned integer values. */\nvar reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n/** Used to identify `toStringTag` values supported by `_.clone`. */\nvar cloneableTags = {};\ncloneableTags[argsTag] = cloneableTags[arrayTag] =\ncloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] =\ncloneableTags[boolTag] = cloneableTags[dateTag] =\ncloneableTags[float32Tag] = cloneableTags[float64Tag] =\ncloneableTags[int8Tag] = cloneableTags[int16Tag] =\ncloneableTags[int32Tag] = cloneableTags[mapTag] =\ncloneableTags[numberTag] = cloneableTags[objectTag] =\ncloneableTags[regexpTag] = cloneableTags[setTag] =\ncloneableTags[stringTag] = cloneableTags[symbolTag] =\ncloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] =\ncloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true;\ncloneableTags[errorTag] = cloneableTags[funcTag] =\ncloneableTags[weakMapTag] = false;\n\n/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/**\n * Adds the key-value `pair` to `map`.\n *\n * @private\n * @param {Object} map The map to modify.\n * @param {Array} pair The key-value pair to add.\n * @returns {Object} Returns `map`.\n */\nfunction addMapEntry(map, pair) {\n // Don't return `map.set` because it's not chainable in IE 11.\n map.set(pair[0], pair[1]);\n return map;\n}\n\n/**\n * Adds `value` to `set`.\n *\n * @private\n * @param {Object} set The set to modify.\n * @param {*} value The value to add.\n * @returns {Object} Returns `set`.\n */\nfunction addSetEntry(set, value) {\n // Don't return `set.add` because it's not chainable in IE 11.\n set.add(value);\n return set;\n}\n\n/**\n * A specialized version of `_.forEach` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns `array`.\n */\nfunction arrayEach(array, iteratee) {\n var index = -1,\n length = array ? array.length : 0;\n\n while (++index < length) {\n if (iteratee(array[index], index, array) === false) {\n break;\n }\n }\n return array;\n}\n\n/**\n * Appends the elements of `values` to `array`.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {Array} values The values to append.\n * @returns {Array} Returns `array`.\n */\nfunction arrayPush(array, values) {\n var index = -1,\n length = values.length,\n offset = array.length;\n\n while (++index < length) {\n array[offset + index] = values[index];\n }\n return array;\n}\n\n/**\n * A specialized version of `_.reduce` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {*} [accumulator] The initial value.\n * @param {boolean} [initAccum] Specify using the first element of `array` as\n * the initial value.\n * @returns {*} Returns the accumulated value.\n */\nfunction arrayReduce(array, iteratee, accumulator, initAccum) {\n var index = -1,\n length = array ? array.length : 0;\n\n if (initAccum && length) {\n accumulator = array[++index];\n }\n while (++index < length) {\n accumulator = iteratee(accumulator, array[index], index, array);\n }\n return accumulator;\n}\n\n/**\n * The base implementation of `_.times` without support for iteratee shorthands\n * or max array length checks.\n *\n * @private\n * @param {number} n The number of times to invoke `iteratee`.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the array of results.\n */\nfunction baseTimes(n, iteratee) {\n var index = -1,\n result = Array(n);\n\n while (++index < n) {\n result[index] = iteratee(index);\n }\n return result;\n}\n\n/**\n * Gets the value at `key` of `object`.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\nfunction getValue(object, key) {\n return object == null ? undefined : object[key];\n}\n\n/**\n * Checks if `value` is a host object in IE < 9.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a host object, else `false`.\n */\nfunction isHostObject(value) {\n // Many host objects are `Object` objects that can coerce to strings\n // despite having improperly defined `toString` methods.\n var result = false;\n if (value != null && typeof value.toString != 'function') {\n try {\n result = !!(value + '');\n } catch (e) {}\n }\n return result;\n}\n\n/**\n * Converts `map` to its key-value pairs.\n *\n * @private\n * @param {Object} map The map to convert.\n * @returns {Array} Returns the key-value pairs.\n */\nfunction mapToArray(map) {\n var index = -1,\n result = Array(map.size);\n\n map.forEach(function(value, key) {\n result[++index] = [key, value];\n });\n return result;\n}\n\n/**\n * Creates a unary function that invokes `func` with its argument transformed.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {Function} transform The argument transform.\n * @returns {Function} Returns the new function.\n */\nfunction overArg(func, transform) {\n return function(arg) {\n return func(transform(arg));\n };\n}\n\n/**\n * Converts `set` to an array of its values.\n *\n * @private\n * @param {Object} set The set to convert.\n * @returns {Array} Returns the values.\n */\nfunction setToArray(set) {\n var index = -1,\n result = Array(set.size);\n\n set.forEach(function(value) {\n result[++index] = value;\n });\n return result;\n}\n\n/** Used for built-in method references. */\nvar arrayProto = Array.prototype,\n funcProto = Function.prototype,\n objectProto = Object.prototype;\n\n/** Used to detect overreaching core-js shims. */\nvar coreJsData = root['__core-js_shared__'];\n\n/** Used to detect methods masquerading as native. */\nvar maskSrcKey = (function() {\n var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n return uid ? ('Symbol(src)_1.' + uid) : '';\n}());\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objectToString = objectProto.toString;\n\n/** Used to detect if a method is native. */\nvar reIsNative = RegExp('^' +\n funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n);\n\n/** Built-in value references. */\nvar Buffer = moduleExports ? root.Buffer : undefined,\n Symbol = root.Symbol,\n Uint8Array = root.Uint8Array,\n getPrototype = overArg(Object.getPrototypeOf, Object),\n objectCreate = Object.create,\n propertyIsEnumerable = objectProto.propertyIsEnumerable,\n splice = arrayProto.splice;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeGetSymbols = Object.getOwnPropertySymbols,\n nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined,\n nativeKeys = overArg(Object.keys, Object);\n\n/* Built-in method references that are verified to be native. */\nvar DataView = getNative(root, 'DataView'),\n Map = getNative(root, 'Map'),\n Promise = getNative(root, 'Promise'),\n Set = getNative(root, 'Set'),\n WeakMap = getNative(root, 'WeakMap'),\n nativeCreate = getNative(Object, 'create');\n\n/** Used to detect maps, sets, and weakmaps. */\nvar dataViewCtorString = toSource(DataView),\n mapCtorString = toSource(Map),\n promiseCtorString = toSource(Promise),\n setCtorString = toSource(Set),\n weakMapCtorString = toSource(WeakMap);\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;\n\n/**\n * Creates a hash object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Hash(entries) {\n var index = -1,\n length = entries ? entries.length : 0;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n/**\n * Removes all key-value entries from the hash.\n *\n * @private\n * @name clear\n * @memberOf Hash\n */\nfunction hashClear() {\n this.__data__ = nativeCreate ? nativeCreate(null) : {};\n}\n\n/**\n * Removes `key` and its value from the hash.\n *\n * @private\n * @name delete\n * @memberOf Hash\n * @param {Object} hash The hash to modify.\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction hashDelete(key) {\n return this.has(key) && delete this.__data__[key];\n}\n\n/**\n * Gets the hash value for `key`.\n *\n * @private\n * @name get\n * @memberOf Hash\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction hashGet(key) {\n var data = this.__data__;\n if (nativeCreate) {\n var result = data[key];\n return result === HASH_UNDEFINED ? undefined : result;\n }\n return hasOwnProperty.call(data, key) ? data[key] : undefined;\n}\n\n/**\n * Checks if a hash value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Hash\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction hashHas(key) {\n var data = this.__data__;\n return nativeCreate ? data[key] !== undefined : hasOwnProperty.call(data, key);\n}\n\n/**\n * Sets the hash `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Hash\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the hash instance.\n */\nfunction hashSet(key, value) {\n var data = this.__data__;\n data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n return this;\n}\n\n// Add methods to `Hash`.\nHash.prototype.clear = hashClear;\nHash.prototype['delete'] = hashDelete;\nHash.prototype.get = hashGet;\nHash.prototype.has = hashHas;\nHash.prototype.set = hashSet;\n\n/**\n * Creates an list cache object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction ListCache(entries) {\n var index = -1,\n length = entries ? entries.length : 0;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n/**\n * Removes all key-value entries from the list cache.\n *\n * @private\n * @name clear\n * @memberOf ListCache\n */\nfunction listCacheClear() {\n this.__data__ = [];\n}\n\n/**\n * Removes `key` and its value from the list cache.\n *\n * @private\n * @name delete\n * @memberOf ListCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction listCacheDelete(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n return false;\n }\n var lastIndex = data.length - 1;\n if (index == lastIndex) {\n data.pop();\n } else {\n splice.call(data, index, 1);\n }\n return true;\n}\n\n/**\n * Gets the list cache value for `key`.\n *\n * @private\n * @name get\n * @memberOf ListCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction listCacheGet(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n return index < 0 ? undefined : data[index][1];\n}\n\n/**\n * Checks if a list cache value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf ListCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction listCacheHas(key) {\n return assocIndexOf(this.__data__, key) > -1;\n}\n\n/**\n * Sets the list cache `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf ListCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the list cache instance.\n */\nfunction listCacheSet(key, value) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n data.push([key, value]);\n } else {\n data[index][1] = value;\n }\n return this;\n}\n\n// Add methods to `ListCache`.\nListCache.prototype.clear = listCacheClear;\nListCache.prototype['delete'] = listCacheDelete;\nListCache.prototype.get = listCacheGet;\nListCache.prototype.has = listCacheHas;\nListCache.prototype.set = listCacheSet;\n\n/**\n * Creates a map cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction MapCache(entries) {\n var index = -1,\n length = entries ? entries.length : 0;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n/**\n * Removes all key-value entries from the map.\n *\n * @private\n * @name clear\n * @memberOf MapCache\n */\nfunction mapCacheClear() {\n this.__data__ = {\n 'hash': new Hash,\n 'map': new (Map || ListCache),\n 'string': new Hash\n };\n}\n\n/**\n * Removes `key` and its value from the map.\n *\n * @private\n * @name delete\n * @memberOf MapCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction mapCacheDelete(key) {\n return getMapData(this, key)['delete'](key);\n}\n\n/**\n * Gets the map value for `key`.\n *\n * @private\n * @name get\n * @memberOf MapCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction mapCacheGet(key) {\n return getMapData(this, key).get(key);\n}\n\n/**\n * Checks if a map value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf MapCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction mapCacheHas(key) {\n return getMapData(this, key).has(key);\n}\n\n/**\n * Sets the map `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf MapCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the map cache instance.\n */\nfunction mapCacheSet(key, value) {\n getMapData(this, key).set(key, value);\n return this;\n}\n\n// Add methods to `MapCache`.\nMapCache.prototype.clear = mapCacheClear;\nMapCache.prototype['delete'] = mapCacheDelete;\nMapCache.prototype.get = mapCacheGet;\nMapCache.prototype.has = mapCacheHas;\nMapCache.prototype.set = mapCacheSet;\n\n/**\n * Creates a stack cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Stack(entries) {\n this.__data__ = new ListCache(entries);\n}\n\n/**\n * Removes all key-value entries from the stack.\n *\n * @private\n * @name clear\n * @memberOf Stack\n */\nfunction stackClear() {\n this.__data__ = new ListCache;\n}\n\n/**\n * Removes `key` and its value from the stack.\n *\n * @private\n * @name delete\n * @memberOf Stack\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction stackDelete(key) {\n return this.__data__['delete'](key);\n}\n\n/**\n * Gets the stack value for `key`.\n *\n * @private\n * @name get\n * @memberOf Stack\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction stackGet(key) {\n return this.__data__.get(key);\n}\n\n/**\n * Checks if a stack value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Stack\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction stackHas(key) {\n return this.__data__.has(key);\n}\n\n/**\n * Sets the stack `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Stack\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the stack cache instance.\n */\nfunction stackSet(key, value) {\n var cache = this.__data__;\n if (cache instanceof ListCache) {\n var pairs = cache.__data__;\n if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {\n pairs.push([key, value]);\n return this;\n }\n cache = this.__data__ = new MapCache(pairs);\n }\n cache.set(key, value);\n return this;\n}\n\n// Add methods to `Stack`.\nStack.prototype.clear = stackClear;\nStack.prototype['delete'] = stackDelete;\nStack.prototype.get = stackGet;\nStack.prototype.has = stackHas;\nStack.prototype.set = stackSet;\n\n/**\n * Creates an array of the enumerable property names of the array-like `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @param {boolean} inherited Specify returning inherited property names.\n * @returns {Array} Returns the array of property names.\n */\nfunction arrayLikeKeys(value, inherited) {\n // Safari 8.1 makes `arguments.callee` enumerable in strict mode.\n // Safari 9 makes `arguments.length` enumerable in strict mode.\n var result = (isArray(value) || isArguments(value))\n ? baseTimes(value.length, String)\n : [];\n\n var length = result.length,\n skipIndexes = !!length;\n\n for (var key in value) {\n if ((inherited || hasOwnProperty.call(value, key)) &&\n !(skipIndexes && (key == 'length' || isIndex(key, length)))) {\n result.push(key);\n }\n }\n return result;\n}\n\n/**\n * Assigns `value` to `key` of `object` if the existing value is not equivalent\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction assignValue(object, key, value) {\n var objValue = object[key];\n if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||\n (value === undefined && !(key in object))) {\n object[key] = value;\n }\n}\n\n/**\n * Gets the index at which the `key` is found in `array` of key-value pairs.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} key The key to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction assocIndexOf(array, key) {\n var length = array.length;\n while (length--) {\n if (eq(array[length][0], key)) {\n return length;\n }\n }\n return -1;\n}\n\n/**\n * The base implementation of `_.assign` without support for multiple sources\n * or `customizer` functions.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @returns {Object} Returns `object`.\n */\nfunction baseAssign(object, source) {\n return object && copyObject(source, keys(source), object);\n}\n\n/**\n * The base implementation of `_.clone` and `_.cloneDeep` which tracks\n * traversed objects.\n *\n * @private\n * @param {*} value The value to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @param {boolean} [isFull] Specify a clone including symbols.\n * @param {Function} [customizer] The function to customize cloning.\n * @param {string} [key] The key of `value`.\n * @param {Object} [object] The parent object of `value`.\n * @param {Object} [stack] Tracks traversed objects and their clone counterparts.\n * @returns {*} Returns the cloned value.\n */\nfunction baseClone(value, isDeep, isFull, customizer, key, object, stack) {\n var result;\n if (customizer) {\n result = object ? customizer(value, key, object, stack) : customizer(value);\n }\n if (result !== undefined) {\n return result;\n }\n if (!isObject(value)) {\n return value;\n }\n var isArr = isArray(value);\n if (isArr) {\n result = initCloneArray(value);\n if (!isDeep) {\n return copyArray(value, result);\n }\n } else {\n var tag = getTag(value),\n isFunc = tag == funcTag || tag == genTag;\n\n if (isBuffer(value)) {\n return cloneBuffer(value, isDeep);\n }\n if (tag == objectTag || tag == argsTag || (isFunc && !object)) {\n if (isHostObject(value)) {\n return object ? value : {};\n }\n result = initCloneObject(isFunc ? {} : value);\n if (!isDeep) {\n return copySymbols(value, baseAssign(result, value));\n }\n } else {\n if (!cloneableTags[tag]) {\n return object ? value : {};\n }\n result = initCloneByTag(value, tag, baseClone, isDeep);\n }\n }\n // Check for circular references and return its corresponding clone.\n stack || (stack = new Stack);\n var stacked = stack.get(value);\n if (stacked) {\n return stacked;\n }\n stack.set(value, result);\n\n if (!isArr) {\n var props = isFull ? getAllKeys(value) : keys(value);\n }\n arrayEach(props || value, function(subValue, key) {\n if (props) {\n key = subValue;\n subValue = value[key];\n }\n // Recursively populate clone (susceptible to call stack limits).\n assignValue(result, key, baseClone(subValue, isDeep, isFull, customizer, key, value, stack));\n });\n return result;\n}\n\n/**\n * The base implementation of `_.create` without support for assigning\n * properties to the created object.\n *\n * @private\n * @param {Object} prototype The object to inherit from.\n * @returns {Object} Returns the new object.\n */\nfunction baseCreate(proto) {\n return isObject(proto) ? objectCreate(proto) : {};\n}\n\n/**\n * The base implementation of `getAllKeys` and `getAllKeysIn` which uses\n * `keysFunc` and `symbolsFunc` to get the enumerable property names and\n * symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @param {Function} symbolsFunc The function to get the symbols of `object`.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction baseGetAllKeys(object, keysFunc, symbolsFunc) {\n var result = keysFunc(object);\n return isArray(object) ? result : arrayPush(result, symbolsFunc(object));\n}\n\n/**\n * The base implementation of `getTag`.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n return objectToString.call(value);\n}\n\n/**\n * The base implementation of `_.isNative` without bad shim checks.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function,\n * else `false`.\n */\nfunction baseIsNative(value) {\n if (!isObject(value) || isMasked(value)) {\n return false;\n }\n var pattern = (isFunction(value) || isHostObject(value)) ? reIsNative : reIsHostCtor;\n return pattern.test(toSource(value));\n}\n\n/**\n * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeys(object) {\n if (!isPrototype(object)) {\n return nativeKeys(object);\n }\n var result = [];\n for (var key in Object(object)) {\n if (hasOwnProperty.call(object, key) && key != 'constructor') {\n result.push(key);\n }\n }\n return result;\n}\n\n/**\n * Creates a clone of `buffer`.\n *\n * @private\n * @param {Buffer} buffer The buffer to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Buffer} Returns the cloned buffer.\n */\nfunction cloneBuffer(buffer, isDeep) {\n if (isDeep) {\n return buffer.slice();\n }\n var result = new buffer.constructor(buffer.length);\n buffer.copy(result);\n return result;\n}\n\n/**\n * Creates a clone of `arrayBuffer`.\n *\n * @private\n * @param {ArrayBuffer} arrayBuffer The array buffer to clone.\n * @returns {ArrayBuffer} Returns the cloned array buffer.\n */\nfunction cloneArrayBuffer(arrayBuffer) {\n var result = new arrayBuffer.constructor(arrayBuffer.byteLength);\n new Uint8Array(result).set(new Uint8Array(arrayBuffer));\n return result;\n}\n\n/**\n * Creates a clone of `dataView`.\n *\n * @private\n * @param {Object} dataView The data view to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the cloned data view.\n */\nfunction cloneDataView(dataView, isDeep) {\n var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer;\n return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength);\n}\n\n/**\n * Creates a clone of `map`.\n *\n * @private\n * @param {Object} map The map to clone.\n * @param {Function} cloneFunc The function to clone values.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the cloned map.\n */\nfunction cloneMap(map, isDeep, cloneFunc) {\n var array = isDeep ? cloneFunc(mapToArray(map), true) : mapToArray(map);\n return arrayReduce(array, addMapEntry, new map.constructor);\n}\n\n/**\n * Creates a clone of `regexp`.\n *\n * @private\n * @param {Object} regexp The regexp to clone.\n * @returns {Object} Returns the cloned regexp.\n */\nfunction cloneRegExp(regexp) {\n var result = new regexp.constructor(regexp.source, reFlags.exec(regexp));\n result.lastIndex = regexp.lastIndex;\n return result;\n}\n\n/**\n * Creates a clone of `set`.\n *\n * @private\n * @param {Object} set The set to clone.\n * @param {Function} cloneFunc The function to clone values.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the cloned set.\n */\nfunction cloneSet(set, isDeep, cloneFunc) {\n var array = isDeep ? cloneFunc(setToArray(set), true) : setToArray(set);\n return arrayReduce(array, addSetEntry, new set.constructor);\n}\n\n/**\n * Creates a clone of the `symbol` object.\n *\n * @private\n * @param {Object} symbol The symbol object to clone.\n * @returns {Object} Returns the cloned symbol object.\n */\nfunction cloneSymbol(symbol) {\n return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {};\n}\n\n/**\n * Creates a clone of `typedArray`.\n *\n * @private\n * @param {Object} typedArray The typed array to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the cloned typed array.\n */\nfunction cloneTypedArray(typedArray, isDeep) {\n var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;\n return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);\n}\n\n/**\n * Copies the values of `source` to `array`.\n *\n * @private\n * @param {Array} source The array to copy values from.\n * @param {Array} [array=[]] The array to copy values to.\n * @returns {Array} Returns `array`.\n */\nfunction copyArray(source, array) {\n var index = -1,\n length = source.length;\n\n array || (array = Array(length));\n while (++index < length) {\n array[index] = source[index];\n }\n return array;\n}\n\n/**\n * Copies properties of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy properties from.\n * @param {Array} props The property identifiers to copy.\n * @param {Object} [object={}] The object to copy properties to.\n * @param {Function} [customizer] The function to customize copied values.\n * @returns {Object} Returns `object`.\n */\nfunction copyObject(source, props, object, customizer) {\n object || (object = {});\n\n var index = -1,\n length = props.length;\n\n while (++index < length) {\n var key = props[index];\n\n var newValue = customizer\n ? customizer(object[key], source[key], key, object, source)\n : undefined;\n\n assignValue(object, key, newValue === undefined ? source[key] : newValue);\n }\n return object;\n}\n\n/**\n * Copies own symbol properties of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy symbols from.\n * @param {Object} [object={}] The object to copy symbols to.\n * @returns {Object} Returns `object`.\n */\nfunction copySymbols(source, object) {\n return copyObject(source, getSymbols(source), object);\n}\n\n/**\n * Creates an array of own enumerable property names and symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction getAllKeys(object) {\n return baseGetAllKeys(object, keys, getSymbols);\n}\n\n/**\n * Gets the data for `map`.\n *\n * @private\n * @param {Object} map The map to query.\n * @param {string} key The reference key.\n * @returns {*} Returns the map data.\n */\nfunction getMapData(map, key) {\n var data = map.__data__;\n return isKeyable(key)\n ? data[typeof key == 'string' ? 'string' : 'hash']\n : data.map;\n}\n\n/**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */\nfunction getNative(object, key) {\n var value = getValue(object, key);\n return baseIsNative(value) ? value : undefined;\n}\n\n/**\n * Creates an array of the own enumerable symbol properties of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of symbols.\n */\nvar getSymbols = nativeGetSymbols ? overArg(nativeGetSymbols, Object) : stubArray;\n\n/**\n * Gets the `toStringTag` of `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nvar getTag = baseGetTag;\n\n// Fallback for data views, maps, sets, and weak maps in IE 11,\n// for data views in Edge < 14, and promises in Node.js.\nif ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||\n (Map && getTag(new Map) != mapTag) ||\n (Promise && getTag(Promise.resolve()) != promiseTag) ||\n (Set && getTag(new Set) != setTag) ||\n (WeakMap && getTag(new WeakMap) != weakMapTag)) {\n getTag = function(value) {\n var result = objectToString.call(value),\n Ctor = result == objectTag ? value.constructor : undefined,\n ctorString = Ctor ? toSource(Ctor) : undefined;\n\n if (ctorString) {\n switch (ctorString) {\n case dataViewCtorString: return dataViewTag;\n case mapCtorString: return mapTag;\n case promiseCtorString: return promiseTag;\n case setCtorString: return setTag;\n case weakMapCtorString: return weakMapTag;\n }\n }\n return result;\n };\n}\n\n/**\n * Initializes an array clone.\n *\n * @private\n * @param {Array} array The array to clone.\n * @returns {Array} Returns the initialized clone.\n */\nfunction initCloneArray(array) {\n var length = array.length,\n result = array.constructor(length);\n\n // Add properties assigned by `RegExp#exec`.\n if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) {\n result.index = array.index;\n result.input = array.input;\n }\n return result;\n}\n\n/**\n * Initializes an object clone.\n *\n * @private\n * @param {Object} object The object to clone.\n * @returns {Object} Returns the initialized clone.\n */\nfunction initCloneObject(object) {\n return (typeof object.constructor == 'function' && !isPrototype(object))\n ? baseCreate(getPrototype(object))\n : {};\n}\n\n/**\n * Initializes an object clone based on its `toStringTag`.\n *\n * **Note:** This function only supports cloning values with tags of\n * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.\n *\n * @private\n * @param {Object} object The object to clone.\n * @param {string} tag The `toStringTag` of the object to clone.\n * @param {Function} cloneFunc The function to clone values.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the initialized clone.\n */\nfunction initCloneByTag(object, tag, cloneFunc, isDeep) {\n var Ctor = object.constructor;\n switch (tag) {\n case arrayBufferTag:\n return cloneArrayBuffer(object);\n\n case boolTag:\n case dateTag:\n return new Ctor(+object);\n\n case dataViewTag:\n return cloneDataView(object, isDeep);\n\n case float32Tag: case float64Tag:\n case int8Tag: case int16Tag: case int32Tag:\n case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag:\n return cloneTypedArray(object, isDeep);\n\n case mapTag:\n return cloneMap(object, isDeep, cloneFunc);\n\n case numberTag:\n case stringTag:\n return new Ctor(object);\n\n case regexpTag:\n return cloneRegExp(object);\n\n case setTag:\n return cloneSet(object, isDeep, cloneFunc);\n\n case symbolTag:\n return cloneSymbol(object);\n }\n}\n\n/**\n * Checks if `value` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n */\nfunction isIndex(value, length) {\n length = length == null ? MAX_SAFE_INTEGER : length;\n return !!length &&\n (typeof value == 'number' || reIsUint.test(value)) &&\n (value > -1 && value % 1 == 0 && value < length);\n}\n\n/**\n * Checks if `value` is suitable for use as unique object key.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n */\nfunction isKeyable(value) {\n var type = typeof value;\n return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n ? (value !== '__proto__')\n : (value === null);\n}\n\n/**\n * Checks if `func` has its source masked.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n */\nfunction isMasked(func) {\n return !!maskSrcKey && (maskSrcKey in func);\n}\n\n/**\n * Checks if `value` is likely a prototype object.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n */\nfunction isPrototype(value) {\n var Ctor = value && value.constructor,\n proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\n return value === proto;\n}\n\n/**\n * Converts `func` to its source code.\n *\n * @private\n * @param {Function} func The function to process.\n * @returns {string} Returns the source code.\n */\nfunction toSource(func) {\n if (func != null) {\n try {\n return funcToString.call(func);\n } catch (e) {}\n try {\n return (func + '');\n } catch (e) {}\n }\n return '';\n}\n\n/**\n * This method is like `_.clone` except that it recursively clones `value`.\n *\n * @static\n * @memberOf _\n * @since 1.0.0\n * @category Lang\n * @param {*} value The value to recursively clone.\n * @returns {*} Returns the deep cloned value.\n * @see _.clone\n * @example\n *\n * var objects = [{ 'a': 1 }, { 'b': 2 }];\n *\n * var deep = _.cloneDeep(objects);\n * console.log(deep[0] === objects[0]);\n * // => false\n */\nfunction cloneDeep(value) {\n return baseClone(value, true, true);\n}\n\n/**\n * Performs a\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\nfunction eq(value, other) {\n return value === other || (value !== value && other !== other);\n}\n\n/**\n * Checks if `value` is likely an `arguments` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n * else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\nfunction isArguments(value) {\n // Safari 8.1 makes `arguments.callee` enumerable in strict mode.\n return isArrayLikeObject(value) && hasOwnProperty.call(value, 'callee') &&\n (!propertyIsEnumerable.call(value, 'callee') || objectToString.call(value) == argsTag);\n}\n\n/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\n/**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\nfunction isArrayLike(value) {\n return value != null && isLength(value.length) && !isFunction(value);\n}\n\n/**\n * This method is like `_.isArrayLike` except that it also checks if `value`\n * is an object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array-like object,\n * else `false`.\n * @example\n *\n * _.isArrayLikeObject([1, 2, 3]);\n * // => true\n *\n * _.isArrayLikeObject(document.body.children);\n * // => true\n *\n * _.isArrayLikeObject('abc');\n * // => false\n *\n * _.isArrayLikeObject(_.noop);\n * // => false\n */\nfunction isArrayLikeObject(value) {\n return isObjectLike(value) && isArrayLike(value);\n}\n\n/**\n * Checks if `value` is a buffer.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.\n * @example\n *\n * _.isBuffer(new Buffer(2));\n * // => true\n *\n * _.isBuffer(new Uint8Array(2));\n * // => false\n */\nvar isBuffer = nativeIsBuffer || stubFalse;\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in Safari 8-9 which returns 'object' for typed array and other constructors.\n var tag = isObject(value) ? objectToString.call(value) : '';\n return tag == funcTag || tag == genTag;\n}\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This method is loosely based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\nfunction isLength(value) {\n return typeof value == 'number' &&\n value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\n/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return !!value && (type == 'object' || type == 'function');\n}\n\n/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return !!value && typeof value == 'object';\n}\n\n/**\n * Creates an array of the own enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects. See the\n * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * for more details.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keys(new Foo);\n * // => ['a', 'b'] (iteration order is not guaranteed)\n *\n * _.keys('hi');\n * // => ['0', '1']\n */\nfunction keys(object) {\n return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);\n}\n\n/**\n * This method returns a new empty array.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {Array} Returns the new empty array.\n * @example\n *\n * var arrays = _.times(2, _.stubArray);\n *\n * console.log(arrays);\n * // => [[], []]\n *\n * console.log(arrays[0] === arrays[1]);\n * // => false\n */\nfunction stubArray() {\n return [];\n}\n\n/**\n * This method returns `false`.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {boolean} Returns `false`.\n * @example\n *\n * _.times(2, _.stubFalse);\n * // => [false, false]\n */\nfunction stubFalse() {\n return false;\n}\n\nmodule.exports = cloneDeep;\n","/**\n * Lodash (Custom Build) \n * Build: `lodash modularize exports=\"npm\" -o ./`\n * Copyright JS Foundation and other contributors \n * Released under MIT license \n * Based on Underscore.js 1.8.3 \n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n\n/** Used as the size to enable large array optimizations. */\nvar LARGE_ARRAY_SIZE = 200;\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n COMPARE_UNORDERED_FLAG = 2;\n\n/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n asyncTag = '[object AsyncFunction]',\n boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n errorTag = '[object Error]',\n funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n nullTag = '[object Null]',\n objectTag = '[object Object]',\n promiseTag = '[object Promise]',\n proxyTag = '[object Proxy]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n symbolTag = '[object Symbol]',\n undefinedTag = '[object Undefined]',\n weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]',\n float32Tag = '[object Float32Array]',\n float64Tag = '[object Float64Array]',\n int8Tag = '[object Int8Array]',\n int16Tag = '[object Int16Array]',\n int32Tag = '[object Int32Array]',\n uint8Tag = '[object Uint8Array]',\n uint8ClampedTag = '[object Uint8ClampedArray]',\n uint16Tag = '[object Uint16Array]',\n uint32Tag = '[object Uint32Array]';\n\n/**\n * Used to match `RegExp`\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n */\nvar reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g;\n\n/** Used to detect host constructors (Safari). */\nvar reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n/** Used to detect unsigned integer values. */\nvar reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n/** Used to identify `toStringTag` values of typed arrays. */\nvar typedArrayTags = {};\ntypedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\ntypedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\ntypedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\ntypedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\ntypedArrayTags[uint32Tag] = true;\ntypedArrayTags[argsTag] = typedArrayTags[arrayTag] =\ntypedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\ntypedArrayTags[dataViewTag] = typedArrayTags[dateTag] =\ntypedArrayTags[errorTag] = typedArrayTags[funcTag] =\ntypedArrayTags[mapTag] = typedArrayTags[numberTag] =\ntypedArrayTags[objectTag] = typedArrayTags[regexpTag] =\ntypedArrayTags[setTag] = typedArrayTags[stringTag] =\ntypedArrayTags[weakMapTag] = false;\n\n/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Detect free variable `process` from Node.js. */\nvar freeProcess = moduleExports && freeGlobal.process;\n\n/** Used to access faster Node.js helpers. */\nvar nodeUtil = (function() {\n try {\n return freeProcess && freeProcess.binding && freeProcess.binding('util');\n } catch (e) {}\n}());\n\n/* Node.js helper references. */\nvar nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;\n\n/**\n * A specialized version of `_.filter` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n */\nfunction arrayFilter(array, predicate) {\n var index = -1,\n length = array == null ? 0 : array.length,\n resIndex = 0,\n result = [];\n\n while (++index < length) {\n var value = array[index];\n if (predicate(value, index, array)) {\n result[resIndex++] = value;\n }\n }\n return result;\n}\n\n/**\n * Appends the elements of `values` to `array`.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {Array} values The values to append.\n * @returns {Array} Returns `array`.\n */\nfunction arrayPush(array, values) {\n var index = -1,\n length = values.length,\n offset = array.length;\n\n while (++index < length) {\n array[offset + index] = values[index];\n }\n return array;\n}\n\n/**\n * A specialized version of `_.some` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns `true` if any element passes the predicate check,\n * else `false`.\n */\nfunction arraySome(array, predicate) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n if (predicate(array[index], index, array)) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * The base implementation of `_.times` without support for iteratee shorthands\n * or max array length checks.\n *\n * @private\n * @param {number} n The number of times to invoke `iteratee`.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the array of results.\n */\nfunction baseTimes(n, iteratee) {\n var index = -1,\n result = Array(n);\n\n while (++index < n) {\n result[index] = iteratee(index);\n }\n return result;\n}\n\n/**\n * The base implementation of `_.unary` without support for storing metadata.\n *\n * @private\n * @param {Function} func The function to cap arguments for.\n * @returns {Function} Returns the new capped function.\n */\nfunction baseUnary(func) {\n return function(value) {\n return func(value);\n };\n}\n\n/**\n * Checks if a `cache` value for `key` exists.\n *\n * @private\n * @param {Object} cache The cache to query.\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction cacheHas(cache, key) {\n return cache.has(key);\n}\n\n/**\n * Gets the value at `key` of `object`.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\nfunction getValue(object, key) {\n return object == null ? undefined : object[key];\n}\n\n/**\n * Converts `map` to its key-value pairs.\n *\n * @private\n * @param {Object} map The map to convert.\n * @returns {Array} Returns the key-value pairs.\n */\nfunction mapToArray(map) {\n var index = -1,\n result = Array(map.size);\n\n map.forEach(function(value, key) {\n result[++index] = [key, value];\n });\n return result;\n}\n\n/**\n * Creates a unary function that invokes `func` with its argument transformed.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {Function} transform The argument transform.\n * @returns {Function} Returns the new function.\n */\nfunction overArg(func, transform) {\n return function(arg) {\n return func(transform(arg));\n };\n}\n\n/**\n * Converts `set` to an array of its values.\n *\n * @private\n * @param {Object} set The set to convert.\n * @returns {Array} Returns the values.\n */\nfunction setToArray(set) {\n var index = -1,\n result = Array(set.size);\n\n set.forEach(function(value) {\n result[++index] = value;\n });\n return result;\n}\n\n/** Used for built-in method references. */\nvar arrayProto = Array.prototype,\n funcProto = Function.prototype,\n objectProto = Object.prototype;\n\n/** Used to detect overreaching core-js shims. */\nvar coreJsData = root['__core-js_shared__'];\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Used to detect methods masquerading as native. */\nvar maskSrcKey = (function() {\n var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n return uid ? ('Symbol(src)_1.' + uid) : '';\n}());\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/** Used to detect if a method is native. */\nvar reIsNative = RegExp('^' +\n funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n);\n\n/** Built-in value references. */\nvar Buffer = moduleExports ? root.Buffer : undefined,\n Symbol = root.Symbol,\n Uint8Array = root.Uint8Array,\n propertyIsEnumerable = objectProto.propertyIsEnumerable,\n splice = arrayProto.splice,\n symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeGetSymbols = Object.getOwnPropertySymbols,\n nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined,\n nativeKeys = overArg(Object.keys, Object);\n\n/* Built-in method references that are verified to be native. */\nvar DataView = getNative(root, 'DataView'),\n Map = getNative(root, 'Map'),\n Promise = getNative(root, 'Promise'),\n Set = getNative(root, 'Set'),\n WeakMap = getNative(root, 'WeakMap'),\n nativeCreate = getNative(Object, 'create');\n\n/** Used to detect maps, sets, and weakmaps. */\nvar dataViewCtorString = toSource(DataView),\n mapCtorString = toSource(Map),\n promiseCtorString = toSource(Promise),\n setCtorString = toSource(Set),\n weakMapCtorString = toSource(WeakMap);\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;\n\n/**\n * Creates a hash object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Hash(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n/**\n * Removes all key-value entries from the hash.\n *\n * @private\n * @name clear\n * @memberOf Hash\n */\nfunction hashClear() {\n this.__data__ = nativeCreate ? nativeCreate(null) : {};\n this.size = 0;\n}\n\n/**\n * Removes `key` and its value from the hash.\n *\n * @private\n * @name delete\n * @memberOf Hash\n * @param {Object} hash The hash to modify.\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction hashDelete(key) {\n var result = this.has(key) && delete this.__data__[key];\n this.size -= result ? 1 : 0;\n return result;\n}\n\n/**\n * Gets the hash value for `key`.\n *\n * @private\n * @name get\n * @memberOf Hash\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction hashGet(key) {\n var data = this.__data__;\n if (nativeCreate) {\n var result = data[key];\n return result === HASH_UNDEFINED ? undefined : result;\n }\n return hasOwnProperty.call(data, key) ? data[key] : undefined;\n}\n\n/**\n * Checks if a hash value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Hash\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction hashHas(key) {\n var data = this.__data__;\n return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);\n}\n\n/**\n * Sets the hash `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Hash\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the hash instance.\n */\nfunction hashSet(key, value) {\n var data = this.__data__;\n this.size += this.has(key) ? 0 : 1;\n data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n return this;\n}\n\n// Add methods to `Hash`.\nHash.prototype.clear = hashClear;\nHash.prototype['delete'] = hashDelete;\nHash.prototype.get = hashGet;\nHash.prototype.has = hashHas;\nHash.prototype.set = hashSet;\n\n/**\n * Creates an list cache object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction ListCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n/**\n * Removes all key-value entries from the list cache.\n *\n * @private\n * @name clear\n * @memberOf ListCache\n */\nfunction listCacheClear() {\n this.__data__ = [];\n this.size = 0;\n}\n\n/**\n * Removes `key` and its value from the list cache.\n *\n * @private\n * @name delete\n * @memberOf ListCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction listCacheDelete(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n return false;\n }\n var lastIndex = data.length - 1;\n if (index == lastIndex) {\n data.pop();\n } else {\n splice.call(data, index, 1);\n }\n --this.size;\n return true;\n}\n\n/**\n * Gets the list cache value for `key`.\n *\n * @private\n * @name get\n * @memberOf ListCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction listCacheGet(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n return index < 0 ? undefined : data[index][1];\n}\n\n/**\n * Checks if a list cache value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf ListCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction listCacheHas(key) {\n return assocIndexOf(this.__data__, key) > -1;\n}\n\n/**\n * Sets the list cache `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf ListCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the list cache instance.\n */\nfunction listCacheSet(key, value) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n ++this.size;\n data.push([key, value]);\n } else {\n data[index][1] = value;\n }\n return this;\n}\n\n// Add methods to `ListCache`.\nListCache.prototype.clear = listCacheClear;\nListCache.prototype['delete'] = listCacheDelete;\nListCache.prototype.get = listCacheGet;\nListCache.prototype.has = listCacheHas;\nListCache.prototype.set = listCacheSet;\n\n/**\n * Creates a map cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction MapCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n/**\n * Removes all key-value entries from the map.\n *\n * @private\n * @name clear\n * @memberOf MapCache\n */\nfunction mapCacheClear() {\n this.size = 0;\n this.__data__ = {\n 'hash': new Hash,\n 'map': new (Map || ListCache),\n 'string': new Hash\n };\n}\n\n/**\n * Removes `key` and its value from the map.\n *\n * @private\n * @name delete\n * @memberOf MapCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction mapCacheDelete(key) {\n var result = getMapData(this, key)['delete'](key);\n this.size -= result ? 1 : 0;\n return result;\n}\n\n/**\n * Gets the map value for `key`.\n *\n * @private\n * @name get\n * @memberOf MapCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction mapCacheGet(key) {\n return getMapData(this, key).get(key);\n}\n\n/**\n * Checks if a map value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf MapCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction mapCacheHas(key) {\n return getMapData(this, key).has(key);\n}\n\n/**\n * Sets the map `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf MapCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the map cache instance.\n */\nfunction mapCacheSet(key, value) {\n var data = getMapData(this, key),\n size = data.size;\n\n data.set(key, value);\n this.size += data.size == size ? 0 : 1;\n return this;\n}\n\n// Add methods to `MapCache`.\nMapCache.prototype.clear = mapCacheClear;\nMapCache.prototype['delete'] = mapCacheDelete;\nMapCache.prototype.get = mapCacheGet;\nMapCache.prototype.has = mapCacheHas;\nMapCache.prototype.set = mapCacheSet;\n\n/**\n *\n * Creates an array cache object to store unique values.\n *\n * @private\n * @constructor\n * @param {Array} [values] The values to cache.\n */\nfunction SetCache(values) {\n var index = -1,\n length = values == null ? 0 : values.length;\n\n this.__data__ = new MapCache;\n while (++index < length) {\n this.add(values[index]);\n }\n}\n\n/**\n * Adds `value` to the array cache.\n *\n * @private\n * @name add\n * @memberOf SetCache\n * @alias push\n * @param {*} value The value to cache.\n * @returns {Object} Returns the cache instance.\n */\nfunction setCacheAdd(value) {\n this.__data__.set(value, HASH_UNDEFINED);\n return this;\n}\n\n/**\n * Checks if `value` is in the array cache.\n *\n * @private\n * @name has\n * @memberOf SetCache\n * @param {*} value The value to search for.\n * @returns {number} Returns `true` if `value` is found, else `false`.\n */\nfunction setCacheHas(value) {\n return this.__data__.has(value);\n}\n\n// Add methods to `SetCache`.\nSetCache.prototype.add = SetCache.prototype.push = setCacheAdd;\nSetCache.prototype.has = setCacheHas;\n\n/**\n * Creates a stack cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Stack(entries) {\n var data = this.__data__ = new ListCache(entries);\n this.size = data.size;\n}\n\n/**\n * Removes all key-value entries from the stack.\n *\n * @private\n * @name clear\n * @memberOf Stack\n */\nfunction stackClear() {\n this.__data__ = new ListCache;\n this.size = 0;\n}\n\n/**\n * Removes `key` and its value from the stack.\n *\n * @private\n * @name delete\n * @memberOf Stack\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction stackDelete(key) {\n var data = this.__data__,\n result = data['delete'](key);\n\n this.size = data.size;\n return result;\n}\n\n/**\n * Gets the stack value for `key`.\n *\n * @private\n * @name get\n * @memberOf Stack\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction stackGet(key) {\n return this.__data__.get(key);\n}\n\n/**\n * Checks if a stack value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Stack\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction stackHas(key) {\n return this.__data__.has(key);\n}\n\n/**\n * Sets the stack `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Stack\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the stack cache instance.\n */\nfunction stackSet(key, value) {\n var data = this.__data__;\n if (data instanceof ListCache) {\n var pairs = data.__data__;\n if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {\n pairs.push([key, value]);\n this.size = ++data.size;\n return this;\n }\n data = this.__data__ = new MapCache(pairs);\n }\n data.set(key, value);\n this.size = data.size;\n return this;\n}\n\n// Add methods to `Stack`.\nStack.prototype.clear = stackClear;\nStack.prototype['delete'] = stackDelete;\nStack.prototype.get = stackGet;\nStack.prototype.has = stackHas;\nStack.prototype.set = stackSet;\n\n/**\n * Creates an array of the enumerable property names of the array-like `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @param {boolean} inherited Specify returning inherited property names.\n * @returns {Array} Returns the array of property names.\n */\nfunction arrayLikeKeys(value, inherited) {\n var isArr = isArray(value),\n isArg = !isArr && isArguments(value),\n isBuff = !isArr && !isArg && isBuffer(value),\n isType = !isArr && !isArg && !isBuff && isTypedArray(value),\n skipIndexes = isArr || isArg || isBuff || isType,\n result = skipIndexes ? baseTimes(value.length, String) : [],\n length = result.length;\n\n for (var key in value) {\n if ((inherited || hasOwnProperty.call(value, key)) &&\n !(skipIndexes && (\n // Safari 9 has enumerable `arguments.length` in strict mode.\n key == 'length' ||\n // Node.js 0.10 has enumerable non-index properties on buffers.\n (isBuff && (key == 'offset' || key == 'parent')) ||\n // PhantomJS 2 has enumerable non-index properties on typed arrays.\n (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||\n // Skip index properties.\n isIndex(key, length)\n ))) {\n result.push(key);\n }\n }\n return result;\n}\n\n/**\n * Gets the index at which the `key` is found in `array` of key-value pairs.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} key The key to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction assocIndexOf(array, key) {\n var length = array.length;\n while (length--) {\n if (eq(array[length][0], key)) {\n return length;\n }\n }\n return -1;\n}\n\n/**\n * The base implementation of `getAllKeys` and `getAllKeysIn` which uses\n * `keysFunc` and `symbolsFunc` to get the enumerable property names and\n * symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @param {Function} symbolsFunc The function to get the symbols of `object`.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction baseGetAllKeys(object, keysFunc, symbolsFunc) {\n var result = keysFunc(object);\n return isArray(object) ? result : arrayPush(result, symbolsFunc(object));\n}\n\n/**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n if (value == null) {\n return value === undefined ? undefinedTag : nullTag;\n }\n return (symToStringTag && symToStringTag in Object(value))\n ? getRawTag(value)\n : objectToString(value);\n}\n\n/**\n * The base implementation of `_.isArguments`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n */\nfunction baseIsArguments(value) {\n return isObjectLike(value) && baseGetTag(value) == argsTag;\n}\n\n/**\n * The base implementation of `_.isEqual` which supports partial comparisons\n * and tracks traversed objects.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @param {boolean} bitmask The bitmask flags.\n * 1 - Unordered comparison\n * 2 - Partial comparison\n * @param {Function} [customizer] The function to customize comparisons.\n * @param {Object} [stack] Tracks traversed `value` and `other` objects.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n */\nfunction baseIsEqual(value, other, bitmask, customizer, stack) {\n if (value === other) {\n return true;\n }\n if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {\n return value !== value && other !== other;\n }\n return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);\n}\n\n/**\n * A specialized version of `baseIsEqual` for arrays and objects which performs\n * deep comparisons and tracks traversed objects enabling objects with circular\n * references to be compared.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} [stack] Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {\n var objIsArr = isArray(object),\n othIsArr = isArray(other),\n objTag = objIsArr ? arrayTag : getTag(object),\n othTag = othIsArr ? arrayTag : getTag(other);\n\n objTag = objTag == argsTag ? objectTag : objTag;\n othTag = othTag == argsTag ? objectTag : othTag;\n\n var objIsObj = objTag == objectTag,\n othIsObj = othTag == objectTag,\n isSameTag = objTag == othTag;\n\n if (isSameTag && isBuffer(object)) {\n if (!isBuffer(other)) {\n return false;\n }\n objIsArr = true;\n objIsObj = false;\n }\n if (isSameTag && !objIsObj) {\n stack || (stack = new Stack);\n return (objIsArr || isTypedArray(object))\n ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)\n : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);\n }\n if (!(bitmask & COMPARE_PARTIAL_FLAG)) {\n var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),\n othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');\n\n if (objIsWrapped || othIsWrapped) {\n var objUnwrapped = objIsWrapped ? object.value() : object,\n othUnwrapped = othIsWrapped ? other.value() : other;\n\n stack || (stack = new Stack);\n return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);\n }\n }\n if (!isSameTag) {\n return false;\n }\n stack || (stack = new Stack);\n return equalObjects(object, other, bitmask, customizer, equalFunc, stack);\n}\n\n/**\n * The base implementation of `_.isNative` without bad shim checks.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function,\n * else `false`.\n */\nfunction baseIsNative(value) {\n if (!isObject(value) || isMasked(value)) {\n return false;\n }\n var pattern = isFunction(value) ? reIsNative : reIsHostCtor;\n return pattern.test(toSource(value));\n}\n\n/**\n * The base implementation of `_.isTypedArray` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n */\nfunction baseIsTypedArray(value) {\n return isObjectLike(value) &&\n isLength(value.length) && !!typedArrayTags[baseGetTag(value)];\n}\n\n/**\n * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeys(object) {\n if (!isPrototype(object)) {\n return nativeKeys(object);\n }\n var result = [];\n for (var key in Object(object)) {\n if (hasOwnProperty.call(object, key) && key != 'constructor') {\n result.push(key);\n }\n }\n return result;\n}\n\n/**\n * A specialized version of `baseIsEqualDeep` for arrays with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Array} array The array to compare.\n * @param {Array} other The other array to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `array` and `other` objects.\n * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.\n */\nfunction equalArrays(array, other, bitmask, customizer, equalFunc, stack) {\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n arrLength = array.length,\n othLength = other.length;\n\n if (arrLength != othLength && !(isPartial && othLength > arrLength)) {\n return false;\n }\n // Assume cyclic values are equal.\n var stacked = stack.get(array);\n if (stacked && stack.get(other)) {\n return stacked == other;\n }\n var index = -1,\n result = true,\n seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined;\n\n stack.set(array, other);\n stack.set(other, array);\n\n // Ignore non-index properties.\n while (++index < arrLength) {\n var arrValue = array[index],\n othValue = other[index];\n\n if (customizer) {\n var compared = isPartial\n ? customizer(othValue, arrValue, index, other, array, stack)\n : customizer(arrValue, othValue, index, array, other, stack);\n }\n if (compared !== undefined) {\n if (compared) {\n continue;\n }\n result = false;\n break;\n }\n // Recursively compare arrays (susceptible to call stack limits).\n if (seen) {\n if (!arraySome(other, function(othValue, othIndex) {\n if (!cacheHas(seen, othIndex) &&\n (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {\n return seen.push(othIndex);\n }\n })) {\n result = false;\n break;\n }\n } else if (!(\n arrValue === othValue ||\n equalFunc(arrValue, othValue, bitmask, customizer, stack)\n )) {\n result = false;\n break;\n }\n }\n stack['delete'](array);\n stack['delete'](other);\n return result;\n}\n\n/**\n * A specialized version of `baseIsEqualDeep` for comparing objects of\n * the same `toStringTag`.\n *\n * **Note:** This function only supports comparing values with tags of\n * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {string} tag The `toStringTag` of the objects to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {\n switch (tag) {\n case dataViewTag:\n if ((object.byteLength != other.byteLength) ||\n (object.byteOffset != other.byteOffset)) {\n return false;\n }\n object = object.buffer;\n other = other.buffer;\n\n case arrayBufferTag:\n if ((object.byteLength != other.byteLength) ||\n !equalFunc(new Uint8Array(object), new Uint8Array(other))) {\n return false;\n }\n return true;\n\n case boolTag:\n case dateTag:\n case numberTag:\n // Coerce booleans to `1` or `0` and dates to milliseconds.\n // Invalid dates are coerced to `NaN`.\n return eq(+object, +other);\n\n case errorTag:\n return object.name == other.name && object.message == other.message;\n\n case regexpTag:\n case stringTag:\n // Coerce regexes to strings and treat strings, primitives and objects,\n // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring\n // for more details.\n return object == (other + '');\n\n case mapTag:\n var convert = mapToArray;\n\n case setTag:\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG;\n convert || (convert = setToArray);\n\n if (object.size != other.size && !isPartial) {\n return false;\n }\n // Assume cyclic values are equal.\n var stacked = stack.get(object);\n if (stacked) {\n return stacked == other;\n }\n bitmask |= COMPARE_UNORDERED_FLAG;\n\n // Recursively compare objects (susceptible to call stack limits).\n stack.set(object, other);\n var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);\n stack['delete'](object);\n return result;\n\n case symbolTag:\n if (symbolValueOf) {\n return symbolValueOf.call(object) == symbolValueOf.call(other);\n }\n }\n return false;\n}\n\n/**\n * A specialized version of `baseIsEqualDeep` for objects with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction equalObjects(object, other, bitmask, customizer, equalFunc, stack) {\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n objProps = getAllKeys(object),\n objLength = objProps.length,\n othProps = getAllKeys(other),\n othLength = othProps.length;\n\n if (objLength != othLength && !isPartial) {\n return false;\n }\n var index = objLength;\n while (index--) {\n var key = objProps[index];\n if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {\n return false;\n }\n }\n // Assume cyclic values are equal.\n var stacked = stack.get(object);\n if (stacked && stack.get(other)) {\n return stacked == other;\n }\n var result = true;\n stack.set(object, other);\n stack.set(other, object);\n\n var skipCtor = isPartial;\n while (++index < objLength) {\n key = objProps[index];\n var objValue = object[key],\n othValue = other[key];\n\n if (customizer) {\n var compared = isPartial\n ? customizer(othValue, objValue, key, other, object, stack)\n : customizer(objValue, othValue, key, object, other, stack);\n }\n // Recursively compare objects (susceptible to call stack limits).\n if (!(compared === undefined\n ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack))\n : compared\n )) {\n result = false;\n break;\n }\n skipCtor || (skipCtor = key == 'constructor');\n }\n if (result && !skipCtor) {\n var objCtor = object.constructor,\n othCtor = other.constructor;\n\n // Non `Object` object instances with different constructors are not equal.\n if (objCtor != othCtor &&\n ('constructor' in object && 'constructor' in other) &&\n !(typeof objCtor == 'function' && objCtor instanceof objCtor &&\n typeof othCtor == 'function' && othCtor instanceof othCtor)) {\n result = false;\n }\n }\n stack['delete'](object);\n stack['delete'](other);\n return result;\n}\n\n/**\n * Creates an array of own enumerable property names and symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction getAllKeys(object) {\n return baseGetAllKeys(object, keys, getSymbols);\n}\n\n/**\n * Gets the data for `map`.\n *\n * @private\n * @param {Object} map The map to query.\n * @param {string} key The reference key.\n * @returns {*} Returns the map data.\n */\nfunction getMapData(map, key) {\n var data = map.__data__;\n return isKeyable(key)\n ? data[typeof key == 'string' ? 'string' : 'hash']\n : data.map;\n}\n\n/**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */\nfunction getNative(object, key) {\n var value = getValue(object, key);\n return baseIsNative(value) ? value : undefined;\n}\n\n/**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\nfunction getRawTag(value) {\n var isOwn = hasOwnProperty.call(value, symToStringTag),\n tag = value[symToStringTag];\n\n try {\n value[symToStringTag] = undefined;\n var unmasked = true;\n } catch (e) {}\n\n var result = nativeObjectToString.call(value);\n if (unmasked) {\n if (isOwn) {\n value[symToStringTag] = tag;\n } else {\n delete value[symToStringTag];\n }\n }\n return result;\n}\n\n/**\n * Creates an array of the own enumerable symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of symbols.\n */\nvar getSymbols = !nativeGetSymbols ? stubArray : function(object) {\n if (object == null) {\n return [];\n }\n object = Object(object);\n return arrayFilter(nativeGetSymbols(object), function(symbol) {\n return propertyIsEnumerable.call(object, symbol);\n });\n};\n\n/**\n * Gets the `toStringTag` of `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nvar getTag = baseGetTag;\n\n// Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.\nif ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||\n (Map && getTag(new Map) != mapTag) ||\n (Promise && getTag(Promise.resolve()) != promiseTag) ||\n (Set && getTag(new Set) != setTag) ||\n (WeakMap && getTag(new WeakMap) != weakMapTag)) {\n getTag = function(value) {\n var result = baseGetTag(value),\n Ctor = result == objectTag ? value.constructor : undefined,\n ctorString = Ctor ? toSource(Ctor) : '';\n\n if (ctorString) {\n switch (ctorString) {\n case dataViewCtorString: return dataViewTag;\n case mapCtorString: return mapTag;\n case promiseCtorString: return promiseTag;\n case setCtorString: return setTag;\n case weakMapCtorString: return weakMapTag;\n }\n }\n return result;\n };\n}\n\n/**\n * Checks if `value` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n */\nfunction isIndex(value, length) {\n length = length == null ? MAX_SAFE_INTEGER : length;\n return !!length &&\n (typeof value == 'number' || reIsUint.test(value)) &&\n (value > -1 && value % 1 == 0 && value < length);\n}\n\n/**\n * Checks if `value` is suitable for use as unique object key.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n */\nfunction isKeyable(value) {\n var type = typeof value;\n return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n ? (value !== '__proto__')\n : (value === null);\n}\n\n/**\n * Checks if `func` has its source masked.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n */\nfunction isMasked(func) {\n return !!maskSrcKey && (maskSrcKey in func);\n}\n\n/**\n * Checks if `value` is likely a prototype object.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n */\nfunction isPrototype(value) {\n var Ctor = value && value.constructor,\n proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\n return value === proto;\n}\n\n/**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\nfunction objectToString(value) {\n return nativeObjectToString.call(value);\n}\n\n/**\n * Converts `func` to its source code.\n *\n * @private\n * @param {Function} func The function to convert.\n * @returns {string} Returns the source code.\n */\nfunction toSource(func) {\n if (func != null) {\n try {\n return funcToString.call(func);\n } catch (e) {}\n try {\n return (func + '');\n } catch (e) {}\n }\n return '';\n}\n\n/**\n * Performs a\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\nfunction eq(value, other) {\n return value === other || (value !== value && other !== other);\n}\n\n/**\n * Checks if `value` is likely an `arguments` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n * else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\nvar isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {\n return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&\n !propertyIsEnumerable.call(value, 'callee');\n};\n\n/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\n/**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\nfunction isArrayLike(value) {\n return value != null && isLength(value.length) && !isFunction(value);\n}\n\n/**\n * Checks if `value` is a buffer.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.\n * @example\n *\n * _.isBuffer(new Buffer(2));\n * // => true\n *\n * _.isBuffer(new Uint8Array(2));\n * // => false\n */\nvar isBuffer = nativeIsBuffer || stubFalse;\n\n/**\n * Performs a deep comparison between two values to determine if they are\n * equivalent.\n *\n * **Note:** This method supports comparing arrays, array buffers, booleans,\n * date objects, error objects, maps, numbers, `Object` objects, regexes,\n * sets, strings, symbols, and typed arrays. `Object` objects are compared\n * by their own, not inherited, enumerable properties. Functions and DOM\n * nodes are compared by strict equality, i.e. `===`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.isEqual(object, other);\n * // => true\n *\n * object === other;\n * // => false\n */\nfunction isEqual(value, other) {\n return baseIsEqual(value, other);\n}\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n if (!isObject(value)) {\n return false;\n }\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in Safari 9 which returns 'object' for typed arrays and other constructors.\n var tag = baseGetTag(value);\n return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\n}\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This method is loosely based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\nfunction isLength(value) {\n return typeof value == 'number' &&\n value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\n/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return value != null && (type == 'object' || type == 'function');\n}\n\n/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return value != null && typeof value == 'object';\n}\n\n/**\n * Checks if `value` is classified as a typed array.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n * @example\n *\n * _.isTypedArray(new Uint8Array);\n * // => true\n *\n * _.isTypedArray([]);\n * // => false\n */\nvar isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;\n\n/**\n * Creates an array of the own enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects. See the\n * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * for more details.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keys(new Foo);\n * // => ['a', 'b'] (iteration order is not guaranteed)\n *\n * _.keys('hi');\n * // => ['0', '1']\n */\nfunction keys(object) {\n return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);\n}\n\n/**\n * This method returns a new empty array.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {Array} Returns the new empty array.\n * @example\n *\n * var arrays = _.times(2, _.stubArray);\n *\n * console.log(arrays);\n * // => [[], []]\n *\n * console.log(arrays[0] === arrays[1]);\n * // => false\n */\nfunction stubArray() {\n return [];\n}\n\n/**\n * This method returns `false`.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {boolean} Returns `false`.\n * @example\n *\n * _.times(2, _.stubFalse);\n * // => [false, false]\n */\nfunction stubFalse() {\n return false;\n}\n\nmodule.exports = isEqual;\n","import cloneDeep = require('lodash.clonedeep');\nimport isEqual = require('lodash.isequal');\n\ninterface AttributeMap {\n [key: string]: unknown;\n}\n\nnamespace AttributeMap {\n export function compose(\n a: AttributeMap = {},\n b: AttributeMap = {},\n keepNull = false,\n ): AttributeMap | undefined {\n if (typeof a !== 'object') {\n a = {};\n }\n if (typeof b !== 'object') {\n b = {};\n }\n let attributes = cloneDeep(b);\n if (!keepNull) {\n attributes = Object.keys(attributes).reduce((copy, key) => {\n if (attributes[key] != null) {\n copy[key] = attributes[key];\n }\n return copy;\n }, {});\n }\n for (const key in a) {\n if (a[key] !== undefined && b[key] === undefined) {\n attributes[key] = a[key];\n }\n }\n return Object.keys(attributes).length > 0 ? attributes : undefined;\n }\n\n export function diff(\n a: AttributeMap = {},\n b: AttributeMap = {},\n ): AttributeMap | undefined {\n if (typeof a !== 'object') {\n a = {};\n }\n if (typeof b !== 'object') {\n b = {};\n }\n const attributes = Object.keys(a)\n .concat(Object.keys(b))\n .reduce((attrs, key) => {\n if (!isEqual(a[key], b[key])) {\n attrs[key] = b[key] === undefined ? null : b[key];\n }\n return attrs;\n }, {});\n return Object.keys(attributes).length > 0 ? attributes : undefined;\n }\n\n export function invert(\n attr: AttributeMap = {},\n base: AttributeMap = {},\n ): AttributeMap {\n attr = attr || {};\n const baseInverted = Object.keys(base).reduce((memo, key) => {\n if (base[key] !== attr[key] && attr[key] !== undefined) {\n memo[key] = base[key];\n }\n return memo;\n }, {});\n return Object.keys(attr).reduce((memo, key) => {\n if (attr[key] !== base[key] && base[key] === undefined) {\n memo[key] = null;\n }\n return memo;\n }, baseInverted);\n }\n\n export function transform(\n a: AttributeMap | undefined,\n b: AttributeMap | undefined,\n priority = false,\n ): AttributeMap | undefined {\n if (typeof a !== 'object') {\n return b;\n }\n if (typeof b !== 'object') {\n return undefined;\n }\n if (!priority) {\n return b; // b simply overwrites us without priority\n }\n const attributes = Object.keys(b).reduce((attrs, key) => {\n if (a[key] === undefined) {\n attrs[key] = b[key]; // null is a valid value\n }\n return attrs;\n }, {});\n return Object.keys(attributes).length > 0 ? attributes : undefined;\n }\n}\n\nexport default AttributeMap;\n","import * as diff from 'fast-diff';\nimport cloneDeep = require('lodash.clonedeep');\nimport isEqual = require('lodash.isequal');\nimport AttributeMap from './AttributeMap';\nimport Op from './Op';\nimport OpIterator from './OpIterator';\n\nconst NULL_CHARACTER = String.fromCharCode(0); // Placeholder char for embed in diff()\n\ninterface EmbedHandler {\n compose(a: T, b: T, keepNull: boolean): T;\n invert(a: T, b: T): T;\n transform(a: T, b: T, priority: boolean): T;\n}\n\nconst getEmbedTypeAndData = (\n a: Op['insert'] | Op['retain'],\n b: Op['insert'],\n): [string, unknown, unknown] => {\n if (typeof a !== 'object' || a === null) {\n throw new Error(`cannot retain a ${typeof a}`);\n }\n if (typeof b !== 'object' || b === null) {\n throw new Error(`cannot retain a ${typeof b}`);\n }\n const embedType = Object.keys(a)[0];\n if (!embedType || embedType !== Object.keys(b)[0]) {\n throw new Error(\n `embed types not matched: ${embedType} != ${Object.keys(b)[0]}`,\n );\n }\n return [embedType, a[embedType], b[embedType]];\n};\n\nclass Delta {\n static Op = Op;\n static OpIterator = OpIterator;\n static AttributeMap = AttributeMap;\n private static handlers: { [embedType: string]: EmbedHandler } = {};\n\n static registerEmbed(embedType: string, handler: EmbedHandler): void {\n this.handlers[embedType] = handler;\n }\n\n static unregisterEmbed(embedType: string): void {\n delete this.handlers[embedType];\n }\n\n private static getHandler(embedType: string): EmbedHandler {\n const handler = this.handlers[embedType];\n if (!handler) {\n throw new Error(`no handlers for embed type \"${embedType}\"`);\n }\n return handler;\n }\n\n ops: Op[];\n constructor(ops?: Op[] | { ops: Op[] }) {\n // Assume we are given a well formed ops\n if (Array.isArray(ops)) {\n this.ops = ops;\n } else if (ops != null && Array.isArray(ops.ops)) {\n this.ops = ops.ops;\n } else {\n this.ops = [];\n }\n }\n\n insert(\n arg: string | Record,\n attributes?: AttributeMap | null,\n ): this {\n const newOp: Op = {};\n if (typeof arg === 'string' && arg.length === 0) {\n return this;\n }\n newOp.insert = arg;\n if (\n attributes != null &&\n typeof attributes === 'object' &&\n Object.keys(attributes).length > 0\n ) {\n newOp.attributes = attributes;\n }\n return this.push(newOp);\n }\n\n delete(length: number): this {\n if (length <= 0) {\n return this;\n }\n return this.push({ delete: length });\n }\n\n retain(\n length: number | Record,\n attributes?: AttributeMap | null,\n ): this {\n if (typeof length === 'number' && length <= 0) {\n return this;\n }\n const newOp: Op = { retain: length };\n if (\n attributes != null &&\n typeof attributes === 'object' &&\n Object.keys(attributes).length > 0\n ) {\n newOp.attributes = attributes;\n }\n return this.push(newOp);\n }\n\n push(newOp: Op): this {\n let index = this.ops.length;\n let lastOp = this.ops[index - 1];\n newOp = cloneDeep(newOp);\n if (typeof lastOp === 'object') {\n if (\n typeof newOp.delete === 'number' &&\n typeof lastOp.delete === 'number'\n ) {\n this.ops[index - 1] = { delete: lastOp.delete + newOp.delete };\n return this;\n }\n // Since it does not matter if we insert before or after deleting at the same index,\n // always prefer to insert first\n if (typeof lastOp.delete === 'number' && newOp.insert != null) {\n index -= 1;\n lastOp = this.ops[index - 1];\n if (typeof lastOp !== 'object') {\n this.ops.unshift(newOp);\n return this;\n }\n }\n if (isEqual(newOp.attributes, lastOp.attributes)) {\n if (\n typeof newOp.insert === 'string' &&\n typeof lastOp.insert === 'string'\n ) {\n this.ops[index - 1] = { insert: lastOp.insert + newOp.insert };\n if (typeof newOp.attributes === 'object') {\n this.ops[index - 1].attributes = newOp.attributes;\n }\n return this;\n } else if (\n typeof newOp.retain === 'number' &&\n typeof lastOp.retain === 'number'\n ) {\n this.ops[index - 1] = { retain: lastOp.retain + newOp.retain };\n if (typeof newOp.attributes === 'object') {\n this.ops[index - 1].attributes = newOp.attributes;\n }\n return this;\n }\n }\n }\n if (index === this.ops.length) {\n this.ops.push(newOp);\n } else {\n this.ops.splice(index, 0, newOp);\n }\n return this;\n }\n\n chop(): this {\n const lastOp = this.ops[this.ops.length - 1];\n if (lastOp && typeof lastOp.retain === 'number' && !lastOp.attributes) {\n this.ops.pop();\n }\n return this;\n }\n\n filter(predicate: (op: Op, index: number) => boolean): Op[] {\n return this.ops.filter(predicate);\n }\n\n forEach(predicate: (op: Op, index: number) => void): void {\n this.ops.forEach(predicate);\n }\n\n map(predicate: (op: Op, index: number) => T): T[] {\n return this.ops.map(predicate);\n }\n\n partition(predicate: (op: Op) => boolean): [Op[], Op[]] {\n const passed: Op[] = [];\n const failed: Op[] = [];\n this.forEach((op) => {\n const target = predicate(op) ? passed : failed;\n target.push(op);\n });\n return [passed, failed];\n }\n\n reduce(\n predicate: (accum: T, curr: Op, index: number) => T,\n initialValue: T,\n ): T {\n return this.ops.reduce(predicate, initialValue);\n }\n\n changeLength(): number {\n return this.reduce((length, elem) => {\n if (elem.insert) {\n return length + Op.length(elem);\n } else if (elem.delete) {\n return length - elem.delete;\n }\n return length;\n }, 0);\n }\n\n length(): number {\n return this.reduce((length, elem) => {\n return length + Op.length(elem);\n }, 0);\n }\n\n slice(start = 0, end = Infinity): Delta {\n const ops = [];\n const iter = new OpIterator(this.ops);\n let index = 0;\n while (index < end && iter.hasNext()) {\n let nextOp;\n if (index < start) {\n nextOp = iter.next(start - index);\n } else {\n nextOp = iter.next(end - index);\n ops.push(nextOp);\n }\n index += Op.length(nextOp);\n }\n return new Delta(ops);\n }\n\n compose(other: Delta): Delta {\n const thisIter = new OpIterator(this.ops);\n const otherIter = new OpIterator(other.ops);\n const ops = [];\n const firstOther = otherIter.peek();\n if (\n firstOther != null &&\n typeof firstOther.retain === 'number' &&\n firstOther.attributes == null\n ) {\n let firstLeft = firstOther.retain;\n while (\n thisIter.peekType() === 'insert' &&\n thisIter.peekLength() <= firstLeft\n ) {\n firstLeft -= thisIter.peekLength();\n ops.push(thisIter.next());\n }\n if (firstOther.retain - firstLeft > 0) {\n otherIter.next(firstOther.retain - firstLeft);\n }\n }\n const delta = new Delta(ops);\n while (thisIter.hasNext() || otherIter.hasNext()) {\n if (otherIter.peekType() === 'insert') {\n delta.push(otherIter.next());\n } else if (thisIter.peekType() === 'delete') {\n delta.push(thisIter.next());\n } else {\n const length = Math.min(thisIter.peekLength(), otherIter.peekLength());\n const thisOp = thisIter.next(length);\n const otherOp = otherIter.next(length);\n if (otherOp.retain) {\n const newOp: Op = {};\n if (typeof thisOp.retain === 'number') {\n newOp.retain =\n typeof otherOp.retain === 'number' ? length : otherOp.retain;\n } else {\n if (typeof otherOp.retain === 'number') {\n if (thisOp.retain == null) {\n newOp.insert = thisOp.insert;\n } else {\n newOp.retain = thisOp.retain;\n }\n } else {\n const action = thisOp.retain == null ? 'insert' : 'retain';\n const [embedType, thisData, otherData] = getEmbedTypeAndData(\n thisOp[action],\n otherOp.retain,\n );\n const handler = Delta.getHandler(embedType);\n newOp[action] = {\n [embedType]: handler.compose(\n thisData,\n otherData,\n action === 'retain',\n ),\n };\n }\n }\n // Preserve null when composing with a retain, otherwise remove it for inserts\n const attributes = AttributeMap.compose(\n thisOp.attributes,\n otherOp.attributes,\n typeof thisOp.retain === 'number',\n );\n if (attributes) {\n newOp.attributes = attributes;\n }\n delta.push(newOp);\n\n // Optimization if rest of other is just retain\n if (\n !otherIter.hasNext() &&\n isEqual(delta.ops[delta.ops.length - 1], newOp)\n ) {\n const rest = new Delta(thisIter.rest());\n return delta.concat(rest).chop();\n }\n\n // Other op should be delete, we could be an insert or retain\n // Insert + delete cancels out\n } else if (\n typeof otherOp.delete === 'number' &&\n (typeof thisOp.retain === 'number' ||\n (typeof thisOp.retain === 'object' && thisOp.retain !== null))\n ) {\n delta.push(otherOp);\n }\n }\n }\n return delta.chop();\n }\n\n concat(other: Delta): Delta {\n const delta = new Delta(this.ops.slice());\n if (other.ops.length > 0) {\n delta.push(other.ops[0]);\n delta.ops = delta.ops.concat(other.ops.slice(1));\n }\n return delta;\n }\n\n diff(other: Delta, cursor?: number | diff.CursorInfo): Delta {\n if (this.ops === other.ops) {\n return new Delta();\n }\n const strings = [this, other].map((delta) => {\n return delta\n .map((op) => {\n if (op.insert != null) {\n return typeof op.insert === 'string' ? op.insert : NULL_CHARACTER;\n }\n const prep = delta === other ? 'on' : 'with';\n throw new Error('diff() called ' + prep + ' non-document');\n })\n .join('');\n });\n const retDelta = new Delta();\n const diffResult = diff(strings[0], strings[1], cursor, true);\n const thisIter = new OpIterator(this.ops);\n const otherIter = new OpIterator(other.ops);\n diffResult.forEach((component: diff.Diff) => {\n let length = component[1].length;\n while (length > 0) {\n let opLength = 0;\n switch (component[0]) {\n case diff.INSERT:\n opLength = Math.min(otherIter.peekLength(), length);\n retDelta.push(otherIter.next(opLength));\n break;\n case diff.DELETE:\n opLength = Math.min(length, thisIter.peekLength());\n thisIter.next(opLength);\n retDelta.delete(opLength);\n break;\n case diff.EQUAL:\n opLength = Math.min(\n thisIter.peekLength(),\n otherIter.peekLength(),\n length,\n );\n const thisOp = thisIter.next(opLength);\n const otherOp = otherIter.next(opLength);\n if (isEqual(thisOp.insert, otherOp.insert)) {\n retDelta.retain(\n opLength,\n AttributeMap.diff(thisOp.attributes, otherOp.attributes),\n );\n } else {\n retDelta.push(otherOp).delete(opLength);\n }\n break;\n }\n length -= opLength;\n }\n });\n return retDelta.chop();\n }\n\n eachLine(\n predicate: (\n line: Delta,\n attributes: AttributeMap,\n index: number,\n ) => boolean | void,\n newline = '\\n',\n ): void {\n const iter = new OpIterator(this.ops);\n let line = new Delta();\n let i = 0;\n while (iter.hasNext()) {\n if (iter.peekType() !== 'insert') {\n return;\n }\n const thisOp = iter.peek();\n const start = Op.length(thisOp) - iter.peekLength();\n const index =\n typeof thisOp.insert === 'string'\n ? thisOp.insert.indexOf(newline, start) - start\n : -1;\n if (index < 0) {\n line.push(iter.next());\n } else if (index > 0) {\n line.push(iter.next(index));\n } else {\n if (predicate(line, iter.next(1).attributes || {}, i) === false) {\n return;\n }\n i += 1;\n line = new Delta();\n }\n }\n if (line.length() > 0) {\n predicate(line, {}, i);\n }\n }\n\n invert(base: Delta): Delta {\n const inverted = new Delta();\n this.reduce((baseIndex, op) => {\n if (op.insert) {\n inverted.delete(Op.length(op));\n } else if (typeof op.retain === 'number' && op.attributes == null) {\n inverted.retain(op.retain);\n return baseIndex + op.retain;\n } else if (op.delete || typeof op.retain === 'number') {\n const length = (op.delete || op.retain) as number;\n const slice = base.slice(baseIndex, baseIndex + length);\n slice.forEach((baseOp) => {\n if (op.delete) {\n inverted.push(baseOp);\n } else if (op.retain && op.attributes) {\n inverted.retain(\n Op.length(baseOp),\n AttributeMap.invert(op.attributes, baseOp.attributes),\n );\n }\n });\n return baseIndex + length;\n } else if (typeof op.retain === 'object' && op.retain !== null) {\n const slice = base.slice(baseIndex, baseIndex + 1);\n const baseOp = new OpIterator(slice.ops).next();\n const [embedType, opData, baseOpData] = getEmbedTypeAndData(\n op.retain,\n baseOp.insert,\n );\n const handler = Delta.getHandler(embedType);\n inverted.retain(\n { [embedType]: handler.invert(opData, baseOpData) },\n AttributeMap.invert(op.attributes, baseOp.attributes),\n );\n return baseIndex + 1;\n }\n return baseIndex;\n }, 0);\n return inverted.chop();\n }\n\n transform(index: number, priority?: boolean): number;\n transform(other: Delta, priority?: boolean): Delta;\n transform(arg: number | Delta, priority = false): typeof arg {\n priority = !!priority;\n if (typeof arg === 'number') {\n return this.transformPosition(arg, priority);\n }\n const other: Delta = arg;\n const thisIter = new OpIterator(this.ops);\n const otherIter = new OpIterator(other.ops);\n const delta = new Delta();\n while (thisIter.hasNext() || otherIter.hasNext()) {\n if (\n thisIter.peekType() === 'insert' &&\n (priority || otherIter.peekType() !== 'insert')\n ) {\n delta.retain(Op.length(thisIter.next()));\n } else if (otherIter.peekType() === 'insert') {\n delta.push(otherIter.next());\n } else {\n const length = Math.min(thisIter.peekLength(), otherIter.peekLength());\n const thisOp = thisIter.next(length);\n const otherOp = otherIter.next(length);\n if (thisOp.delete) {\n // Our delete either makes their delete redundant or removes their retain\n continue;\n } else if (otherOp.delete) {\n delta.push(otherOp);\n } else {\n const thisData = thisOp.retain;\n const otherData = otherOp.retain;\n let transformedData: Op['retain'] =\n typeof otherData === 'object' && otherData !== null\n ? otherData\n : length;\n if (\n typeof thisData === 'object' &&\n thisData !== null &&\n typeof otherData === 'object' &&\n otherData !== null\n ) {\n const embedType = Object.keys(thisData)[0];\n if (embedType === Object.keys(otherData)[0]) {\n const handler = Delta.getHandler(embedType);\n if (handler) {\n transformedData = {\n [embedType]: handler.transform(\n thisData[embedType],\n otherData[embedType],\n priority,\n ),\n };\n }\n }\n }\n\n // We retain either their retain or insert\n delta.retain(\n transformedData,\n AttributeMap.transform(\n thisOp.attributes,\n otherOp.attributes,\n priority,\n ),\n );\n }\n }\n }\n return delta.chop();\n }\n\n transformPosition(index: number, priority = false): number {\n priority = !!priority;\n const thisIter = new OpIterator(this.ops);\n let offset = 0;\n while (thisIter.hasNext() && offset <= index) {\n const length = thisIter.peekLength();\n const nextType = thisIter.peekType();\n thisIter.next();\n if (nextType === 'delete') {\n index -= Math.min(length, index - offset);\n continue;\n } else if (nextType === 'insert' && (offset < index || !priority)) {\n index += length;\n }\n offset += length;\n }\n return index;\n }\n}\n\nexport default Delta;\n\nexport { Op, OpIterator, AttributeMap };\n\nif (typeof module === 'object') {\n module.exports = Delta;\n module.exports.default = Delta;\n}\n","import AttributeMap from './AttributeMap';\n\ninterface Op {\n // only one property out of {insert, delete, retain} will be present\n insert?: string | Record;\n delete?: number;\n retain?: number | Record;\n\n attributes?: AttributeMap;\n}\n\nnamespace Op {\n export function length(op: Op): number {\n if (typeof op.delete === 'number') {\n return op.delete;\n } else if (typeof op.retain === 'number') {\n return op.retain;\n } else if (typeof op.retain === 'object' && op.retain !== null) {\n return 1;\n } else {\n return typeof op.insert === 'string' ? op.insert.length : 1;\n }\n }\n}\n\nexport default Op;\n","import Op from './Op';\n\nexport default class Iterator {\n ops: Op[];\n index: number;\n offset: number;\n\n constructor(ops: Op[]) {\n this.ops = ops;\n this.index = 0;\n this.offset = 0;\n }\n\n hasNext(): boolean {\n return this.peekLength() < Infinity;\n }\n\n next(length?: number): Op {\n if (!length) {\n length = Infinity;\n }\n const nextOp = this.ops[this.index];\n if (nextOp) {\n const offset = this.offset;\n const opLength = Op.length(nextOp);\n if (length >= opLength - offset) {\n length = opLength - offset;\n this.index += 1;\n this.offset = 0;\n } else {\n this.offset += length;\n }\n if (typeof nextOp.delete === 'number') {\n return { delete: length };\n } else {\n const retOp: Op = {};\n if (nextOp.attributes) {\n retOp.attributes = nextOp.attributes;\n }\n if (typeof nextOp.retain === 'number') {\n retOp.retain = length;\n } else if (\n typeof nextOp.retain === 'object' &&\n nextOp.retain !== null\n ) {\n // offset should === 0, length should === 1\n retOp.retain = nextOp.retain;\n } else if (typeof nextOp.insert === 'string') {\n retOp.insert = nextOp.insert.substr(offset, length);\n } else {\n // offset should === 0, length should === 1\n retOp.insert = nextOp.insert;\n }\n return retOp;\n }\n } else {\n return { retain: Infinity };\n }\n }\n\n peek(): Op {\n return this.ops[this.index];\n }\n\n peekLength(): number {\n if (this.ops[this.index]) {\n // Should never return 0 if our index is being managed correctly\n return Op.length(this.ops[this.index]) - this.offset;\n } else {\n return Infinity;\n }\n }\n\n peekType(): string {\n const op = this.ops[this.index];\n if (op) {\n if (typeof op.delete === 'number') {\n return 'delete';\n } else if (\n typeof op.retain === 'number' ||\n (typeof op.retain === 'object' && op.retain !== null)\n ) {\n return 'retain';\n } else {\n return 'insert';\n }\n }\n return 'retain';\n }\n\n rest(): Op[] {\n if (!this.hasNext()) {\n return [];\n } else if (this.offset === 0) {\n return this.ops.slice(this.index);\n } else {\n const offset = this.offset;\n const index = this.index;\n const next = this.next();\n const rest = this.ops.slice(this.index);\n this.offset = offset;\n this.index = index;\n return [next].concat(rest);\n }\n }\n}\n","/**\n * Removes all key-value entries from the list cache.\n *\n * @private\n * @name clear\n * @memberOf ListCache\n */\nfunction listCacheClear() {\n this.__data__ = [];\n this.size = 0;\n}\n\nexport default listCacheClear;\n","import eq from './eq.js';\n\n/**\n * Gets the index at which the `key` is found in `array` of key-value pairs.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} key The key to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction assocIndexOf(array, key) {\n var length = array.length;\n while (length--) {\n if (eq(array[length][0], key)) {\n return length;\n }\n }\n return -1;\n}\n\nexport default assocIndexOf;\n","import assocIndexOf from './_assocIndexOf.js';\n\n/** Used for built-in method references. */\nvar arrayProto = Array.prototype;\n\n/** Built-in value references. */\nvar splice = arrayProto.splice;\n\n/**\n * Removes `key` and its value from the list cache.\n *\n * @private\n * @name delete\n * @memberOf ListCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction listCacheDelete(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n return false;\n }\n var lastIndex = data.length - 1;\n if (index == lastIndex) {\n data.pop();\n } else {\n splice.call(data, index, 1);\n }\n --this.size;\n return true;\n}\n\nexport default listCacheDelete;\n","import listCacheClear from './_listCacheClear.js';\nimport listCacheDelete from './_listCacheDelete.js';\nimport listCacheGet from './_listCacheGet.js';\nimport listCacheHas from './_listCacheHas.js';\nimport listCacheSet from './_listCacheSet.js';\n\n/**\n * Creates an list cache object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction ListCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `ListCache`.\nListCache.prototype.clear = listCacheClear;\nListCache.prototype['delete'] = listCacheDelete;\nListCache.prototype.get = listCacheGet;\nListCache.prototype.has = listCacheHas;\nListCache.prototype.set = listCacheSet;\n\nexport default ListCache;\n","import assocIndexOf from './_assocIndexOf.js';\n\n/**\n * Gets the list cache value for `key`.\n *\n * @private\n * @name get\n * @memberOf ListCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction listCacheGet(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n return index < 0 ? undefined : data[index][1];\n}\n\nexport default listCacheGet;\n","import assocIndexOf from './_assocIndexOf.js';\n\n/**\n * Checks if a list cache value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf ListCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction listCacheHas(key) {\n return assocIndexOf(this.__data__, key) > -1;\n}\n\nexport default listCacheHas;\n","import assocIndexOf from './_assocIndexOf.js';\n\n/**\n * Sets the list cache `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf ListCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the list cache instance.\n */\nfunction listCacheSet(key, value) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n ++this.size;\n data.push([key, value]);\n } else {\n data[index][1] = value;\n }\n return this;\n}\n\nexport default listCacheSet;\n","import getNative from './_getNative.js';\nimport root from './_root.js';\n\n/* Built-in method references that are verified to be native. */\nvar Map = getNative(root, 'Map');\n\nexport default Map;\n","import getNative from './_getNative.js';\n\n/* Built-in method references that are verified to be native. */\nvar nativeCreate = getNative(Object, 'create');\n\nexport default nativeCreate;\n","import nativeCreate from './_nativeCreate.js';\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Gets the hash value for `key`.\n *\n * @private\n * @name get\n * @memberOf Hash\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction hashGet(key) {\n var data = this.__data__;\n if (nativeCreate) {\n var result = data[key];\n return result === HASH_UNDEFINED ? undefined : result;\n }\n return hasOwnProperty.call(data, key) ? data[key] : undefined;\n}\n\nexport default hashGet;\n","import nativeCreate from './_nativeCreate.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Checks if a hash value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Hash\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction hashHas(key) {\n var data = this.__data__;\n return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);\n}\n\nexport default hashHas;\n","import hashClear from './_hashClear.js';\nimport hashDelete from './_hashDelete.js';\nimport hashGet from './_hashGet.js';\nimport hashHas from './_hashHas.js';\nimport hashSet from './_hashSet.js';\n\n/**\n * Creates a hash object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Hash(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `Hash`.\nHash.prototype.clear = hashClear;\nHash.prototype['delete'] = hashDelete;\nHash.prototype.get = hashGet;\nHash.prototype.has = hashHas;\nHash.prototype.set = hashSet;\n\nexport default Hash;\n","import nativeCreate from './_nativeCreate.js';\n\n/**\n * Removes all key-value entries from the hash.\n *\n * @private\n * @name clear\n * @memberOf Hash\n */\nfunction hashClear() {\n this.__data__ = nativeCreate ? nativeCreate(null) : {};\n this.size = 0;\n}\n\nexport default hashClear;\n","/**\n * Removes `key` and its value from the hash.\n *\n * @private\n * @name delete\n * @memberOf Hash\n * @param {Object} hash The hash to modify.\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction hashDelete(key) {\n var result = this.has(key) && delete this.__data__[key];\n this.size -= result ? 1 : 0;\n return result;\n}\n\nexport default hashDelete;\n","import nativeCreate from './_nativeCreate.js';\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/**\n * Sets the hash `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Hash\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the hash instance.\n */\nfunction hashSet(key, value) {\n var data = this.__data__;\n this.size += this.has(key) ? 0 : 1;\n data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n return this;\n}\n\nexport default hashSet;\n","import isKeyable from './_isKeyable.js';\n\n/**\n * Gets the data for `map`.\n *\n * @private\n * @param {Object} map The map to query.\n * @param {string} key The reference key.\n * @returns {*} Returns the map data.\n */\nfunction getMapData(map, key) {\n var data = map.__data__;\n return isKeyable(key)\n ? data[typeof key == 'string' ? 'string' : 'hash']\n : data.map;\n}\n\nexport default getMapData;\n","/**\n * Checks if `value` is suitable for use as unique object key.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n */\nfunction isKeyable(value) {\n var type = typeof value;\n return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n ? (value !== '__proto__')\n : (value === null);\n}\n\nexport default isKeyable;\n","import mapCacheClear from './_mapCacheClear.js';\nimport mapCacheDelete from './_mapCacheDelete.js';\nimport mapCacheGet from './_mapCacheGet.js';\nimport mapCacheHas from './_mapCacheHas.js';\nimport mapCacheSet from './_mapCacheSet.js';\n\n/**\n * Creates a map cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction MapCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `MapCache`.\nMapCache.prototype.clear = mapCacheClear;\nMapCache.prototype['delete'] = mapCacheDelete;\nMapCache.prototype.get = mapCacheGet;\nMapCache.prototype.has = mapCacheHas;\nMapCache.prototype.set = mapCacheSet;\n\nexport default MapCache;\n","import Hash from './_Hash.js';\nimport ListCache from './_ListCache.js';\nimport Map from './_Map.js';\n\n/**\n * Removes all key-value entries from the map.\n *\n * @private\n * @name clear\n * @memberOf MapCache\n */\nfunction mapCacheClear() {\n this.size = 0;\n this.__data__ = {\n 'hash': new Hash,\n 'map': new (Map || ListCache),\n 'string': new Hash\n };\n}\n\nexport default mapCacheClear;\n","import getMapData from './_getMapData.js';\n\n/**\n * Removes `key` and its value from the map.\n *\n * @private\n * @name delete\n * @memberOf MapCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction mapCacheDelete(key) {\n var result = getMapData(this, key)['delete'](key);\n this.size -= result ? 1 : 0;\n return result;\n}\n\nexport default mapCacheDelete;\n","import getMapData from './_getMapData.js';\n\n/**\n * Gets the map value for `key`.\n *\n * @private\n * @name get\n * @memberOf MapCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction mapCacheGet(key) {\n return getMapData(this, key).get(key);\n}\n\nexport default mapCacheGet;\n","import getMapData from './_getMapData.js';\n\n/**\n * Checks if a map value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf MapCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction mapCacheHas(key) {\n return getMapData(this, key).has(key);\n}\n\nexport default mapCacheHas;\n","import getMapData from './_getMapData.js';\n\n/**\n * Sets the map `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf MapCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the map cache instance.\n */\nfunction mapCacheSet(key, value) {\n var data = getMapData(this, key),\n size = data.size;\n\n data.set(key, value);\n this.size += data.size == size ? 0 : 1;\n return this;\n}\n\nexport default mapCacheSet;\n","import ListCache from './_ListCache.js';\nimport stackClear from './_stackClear.js';\nimport stackDelete from './_stackDelete.js';\nimport stackGet from './_stackGet.js';\nimport stackHas from './_stackHas.js';\nimport stackSet from './_stackSet.js';\n\n/**\n * Creates a stack cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Stack(entries) {\n var data = this.__data__ = new ListCache(entries);\n this.size = data.size;\n}\n\n// Add methods to `Stack`.\nStack.prototype.clear = stackClear;\nStack.prototype['delete'] = stackDelete;\nStack.prototype.get = stackGet;\nStack.prototype.has = stackHas;\nStack.prototype.set = stackSet;\n\nexport default Stack;\n","import ListCache from './_ListCache.js';\n\n/**\n * Removes all key-value entries from the stack.\n *\n * @private\n * @name clear\n * @memberOf Stack\n */\nfunction stackClear() {\n this.__data__ = new ListCache;\n this.size = 0;\n}\n\nexport default stackClear;\n","/**\n * Removes `key` and its value from the stack.\n *\n * @private\n * @name delete\n * @memberOf Stack\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction stackDelete(key) {\n var data = this.__data__,\n result = data['delete'](key);\n\n this.size = data.size;\n return result;\n}\n\nexport default stackDelete;\n","/**\n * Gets the stack value for `key`.\n *\n * @private\n * @name get\n * @memberOf Stack\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction stackGet(key) {\n return this.__data__.get(key);\n}\n\nexport default stackGet;\n","/**\n * Checks if a stack value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Stack\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction stackHas(key) {\n return this.__data__.has(key);\n}\n\nexport default stackHas;\n","import ListCache from './_ListCache.js';\nimport Map from './_Map.js';\nimport MapCache from './_MapCache.js';\n\n/** Used as the size to enable large array optimizations. */\nvar LARGE_ARRAY_SIZE = 200;\n\n/**\n * Sets the stack `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Stack\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the stack cache instance.\n */\nfunction stackSet(key, value) {\n var data = this.__data__;\n if (data instanceof ListCache) {\n var pairs = data.__data__;\n if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {\n pairs.push([key, value]);\n this.size = ++data.size;\n return this;\n }\n data = this.__data__ = new MapCache(pairs);\n }\n data.set(key, value);\n this.size = data.size;\n return this;\n}\n\nexport default stackSet;\n","import root from './_root.js';\n\n/** Built-in value references. */\nvar Symbol = root.Symbol;\n\nexport default Symbol;\n","import root from './_root.js';\n\n/** Built-in value references. */\nvar Uint8Array = root.Uint8Array;\n\nexport default Uint8Array;\n","/**\n * The base implementation of `_.times` without support for iteratee shorthands\n * or max array length checks.\n *\n * @private\n * @param {number} n The number of times to invoke `iteratee`.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the array of results.\n */\nfunction baseTimes(n, iteratee) {\n var index = -1,\n result = Array(n);\n\n while (++index < n) {\n result[index] = iteratee(index);\n }\n return result;\n}\n\nexport default baseTimes;\n","import baseTimes from './_baseTimes.js';\nimport isArguments from './isArguments.js';\nimport isArray from './isArray.js';\nimport isBuffer from './isBuffer.js';\nimport isIndex from './_isIndex.js';\nimport isTypedArray from './isTypedArray.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Creates an array of the enumerable property names of the array-like `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @param {boolean} inherited Specify returning inherited property names.\n * @returns {Array} Returns the array of property names.\n */\nfunction arrayLikeKeys(value, inherited) {\n var isArr = isArray(value),\n isArg = !isArr && isArguments(value),\n isBuff = !isArr && !isArg && isBuffer(value),\n isType = !isArr && !isArg && !isBuff && isTypedArray(value),\n skipIndexes = isArr || isArg || isBuff || isType,\n result = skipIndexes ? baseTimes(value.length, String) : [],\n length = result.length;\n\n for (var key in value) {\n if ((inherited || hasOwnProperty.call(value, key)) &&\n !(skipIndexes && (\n // Safari 9 has enumerable `arguments.length` in strict mode.\n key == 'length' ||\n // Node.js 0.10 has enumerable non-index properties on buffers.\n (isBuff && (key == 'offset' || key == 'parent')) ||\n // PhantomJS 2 has enumerable non-index properties on typed arrays.\n (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||\n // Skip index properties.\n isIndex(key, length)\n ))) {\n result.push(key);\n }\n }\n return result;\n}\n\nexport default arrayLikeKeys;\n","/**\n * Appends the elements of `values` to `array`.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {Array} values The values to append.\n * @returns {Array} Returns `array`.\n */\nfunction arrayPush(array, values) {\n var index = -1,\n length = values.length,\n offset = array.length;\n\n while (++index < length) {\n array[offset + index] = values[index];\n }\n return array;\n}\n\nexport default arrayPush;\n","import baseAssignValue from './_baseAssignValue.js';\nimport eq from './eq.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Assigns `value` to `key` of `object` if the existing value is not equivalent\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction assignValue(object, key, value) {\n var objValue = object[key];\n if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||\n (value === undefined && !(key in object))) {\n baseAssignValue(object, key, value);\n }\n}\n\nexport default assignValue;\n","import defineProperty from './_defineProperty.js';\n\n/**\n * The base implementation of `assignValue` and `assignMergeValue` without\n * value checks.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction baseAssignValue(object, key, value) {\n if (key == '__proto__' && defineProperty) {\n defineProperty(object, key, {\n 'configurable': true,\n 'enumerable': true,\n 'value': value,\n 'writable': true\n });\n } else {\n object[key] = value;\n }\n}\n\nexport default baseAssignValue;\n","import arrayPush from './_arrayPush.js';\nimport isArray from './isArray.js';\n\n/**\n * The base implementation of `getAllKeys` and `getAllKeysIn` which uses\n * `keysFunc` and `symbolsFunc` to get the enumerable property names and\n * symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @param {Function} symbolsFunc The function to get the symbols of `object`.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction baseGetAllKeys(object, keysFunc, symbolsFunc) {\n var result = keysFunc(object);\n return isArray(object) ? result : arrayPush(result, symbolsFunc(object));\n}\n\nexport default baseGetAllKeys;\n","import Symbol from './_Symbol.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\nfunction getRawTag(value) {\n var isOwn = hasOwnProperty.call(value, symToStringTag),\n tag = value[symToStringTag];\n\n try {\n value[symToStringTag] = undefined;\n var unmasked = true;\n } catch (e) {}\n\n var result = nativeObjectToString.call(value);\n if (unmasked) {\n if (isOwn) {\n value[symToStringTag] = tag;\n } else {\n delete value[symToStringTag];\n }\n }\n return result;\n}\n\nexport default getRawTag;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\nfunction objectToString(value) {\n return nativeObjectToString.call(value);\n}\n\nexport default objectToString;\n","import Symbol from './_Symbol.js';\nimport getRawTag from './_getRawTag.js';\nimport objectToString from './_objectToString.js';\n\n/** `Object#toString` result references. */\nvar nullTag = '[object Null]',\n undefinedTag = '[object Undefined]';\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n if (value == null) {\n return value === undefined ? undefinedTag : nullTag;\n }\n return (symToStringTag && symToStringTag in Object(value))\n ? getRawTag(value)\n : objectToString(value);\n}\n\nexport default baseGetTag;\n","/**\n * The base implementation of `_.unary` without support for storing metadata.\n *\n * @private\n * @param {Function} func The function to cap arguments for.\n * @returns {Function} Returns the new capped function.\n */\nfunction baseUnary(func) {\n return function(value) {\n return func(value);\n };\n}\n\nexport default baseUnary;\n","import Uint8Array from './_Uint8Array.js';\n\n/**\n * Creates a clone of `arrayBuffer`.\n *\n * @private\n * @param {ArrayBuffer} arrayBuffer The array buffer to clone.\n * @returns {ArrayBuffer} Returns the cloned array buffer.\n */\nfunction cloneArrayBuffer(arrayBuffer) {\n var result = new arrayBuffer.constructor(arrayBuffer.byteLength);\n new Uint8Array(result).set(new Uint8Array(arrayBuffer));\n return result;\n}\n\nexport default cloneArrayBuffer;\n","import root from './_root.js';\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Built-in value references. */\nvar Buffer = moduleExports ? root.Buffer : undefined,\n allocUnsafe = Buffer ? Buffer.allocUnsafe : undefined;\n\n/**\n * Creates a clone of `buffer`.\n *\n * @private\n * @param {Buffer} buffer The buffer to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Buffer} Returns the cloned buffer.\n */\nfunction cloneBuffer(buffer, isDeep) {\n if (isDeep) {\n return buffer.slice();\n }\n var length = buffer.length,\n result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length);\n\n buffer.copy(result);\n return result;\n}\n\nexport default cloneBuffer;\n","import cloneArrayBuffer from './_cloneArrayBuffer.js';\n\n/**\n * Creates a clone of `typedArray`.\n *\n * @private\n * @param {Object} typedArray The typed array to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the cloned typed array.\n */\nfunction cloneTypedArray(typedArray, isDeep) {\n var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;\n return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);\n}\n\nexport default cloneTypedArray;\n","/**\n * Copies the values of `source` to `array`.\n *\n * @private\n * @param {Array} source The array to copy values from.\n * @param {Array} [array=[]] The array to copy values to.\n * @returns {Array} Returns `array`.\n */\nfunction copyArray(source, array) {\n var index = -1,\n length = source.length;\n\n array || (array = Array(length));\n while (++index < length) {\n array[index] = source[index];\n }\n return array;\n}\n\nexport default copyArray;\n","import assignValue from './_assignValue.js';\nimport baseAssignValue from './_baseAssignValue.js';\n\n/**\n * Copies properties of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy properties from.\n * @param {Array} props The property identifiers to copy.\n * @param {Object} [object={}] The object to copy properties to.\n * @param {Function} [customizer] The function to customize copied values.\n * @returns {Object} Returns `object`.\n */\nfunction copyObject(source, props, object, customizer) {\n var isNew = !object;\n object || (object = {});\n\n var index = -1,\n length = props.length;\n\n while (++index < length) {\n var key = props[index];\n\n var newValue = customizer\n ? customizer(object[key], source[key], key, object, source)\n : undefined;\n\n if (newValue === undefined) {\n newValue = source[key];\n }\n if (isNew) {\n baseAssignValue(object, key, newValue);\n } else {\n assignValue(object, key, newValue);\n }\n }\n return object;\n}\n\nexport default copyObject;\n","import getNative from './_getNative.js';\n\nvar defineProperty = (function() {\n try {\n var func = getNative(Object, 'defineProperty');\n func({}, '', {});\n return func;\n } catch (e) {}\n}());\n\nexport default defineProperty;\n","/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\nexport default freeGlobal;\n","import baseGetAllKeys from './_baseGetAllKeys.js';\nimport getSymbols from './_getSymbols.js';\nimport keys from './keys.js';\n\n/**\n * Creates an array of own enumerable property names and symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction getAllKeys(object) {\n return baseGetAllKeys(object, keys, getSymbols);\n}\n\nexport default getAllKeys;\n","import coreJsData from './_coreJsData.js';\n\n/** Used to detect methods masquerading as native. */\nvar maskSrcKey = (function() {\n var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n return uid ? ('Symbol(src)_1.' + uid) : '';\n}());\n\n/**\n * Checks if `func` has its source masked.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n */\nfunction isMasked(func) {\n return !!maskSrcKey && (maskSrcKey in func);\n}\n\nexport default isMasked;\n","import root from './_root.js';\n\n/** Used to detect overreaching core-js shims. */\nvar coreJsData = root['__core-js_shared__'];\n\nexport default coreJsData;\n","import isFunction from './isFunction.js';\nimport isMasked from './_isMasked.js';\nimport isObject from './isObject.js';\nimport toSource from './_toSource.js';\n\n/**\n * Used to match `RegExp`\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n */\nvar reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g;\n\n/** Used to detect host constructors (Safari). */\nvar reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n/** Used for built-in method references. */\nvar funcProto = Function.prototype,\n objectProto = Object.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Used to detect if a method is native. */\nvar reIsNative = RegExp('^' +\n funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n);\n\n/**\n * The base implementation of `_.isNative` without bad shim checks.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function,\n * else `false`.\n */\nfunction baseIsNative(value) {\n if (!isObject(value) || isMasked(value)) {\n return false;\n }\n var pattern = isFunction(value) ? reIsNative : reIsHostCtor;\n return pattern.test(toSource(value));\n}\n\nexport default baseIsNative;\n","import baseIsNative from './_baseIsNative.js';\nimport getValue from './_getValue.js';\n\n/**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */\nfunction getNative(object, key) {\n var value = getValue(object, key);\n return baseIsNative(value) ? value : undefined;\n}\n\nexport default getNative;\n","/**\n * Gets the value at `key` of `object`.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\nfunction getValue(object, key) {\n return object == null ? undefined : object[key];\n}\n\nexport default getValue;\n","import overArg from './_overArg.js';\n\n/** Built-in value references. */\nvar getPrototype = overArg(Object.getPrototypeOf, Object);\n\nexport default getPrototype;\n","/**\n * A specialized version of `_.filter` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n */\nfunction arrayFilter(array, predicate) {\n var index = -1,\n length = array == null ? 0 : array.length,\n resIndex = 0,\n result = [];\n\n while (++index < length) {\n var value = array[index];\n if (predicate(value, index, array)) {\n result[resIndex++] = value;\n }\n }\n return result;\n}\n\nexport default arrayFilter;\n","import arrayFilter from './_arrayFilter.js';\nimport stubArray from './stubArray.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Built-in value references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeGetSymbols = Object.getOwnPropertySymbols;\n\n/**\n * Creates an array of the own enumerable symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of symbols.\n */\nvar getSymbols = !nativeGetSymbols ? stubArray : function(object) {\n if (object == null) {\n return [];\n }\n object = Object(object);\n return arrayFilter(nativeGetSymbols(object), function(symbol) {\n return propertyIsEnumerable.call(object, symbol);\n });\n};\n\nexport default getSymbols;\n","import getNative from './_getNative.js';\nimport root from './_root.js';\n\n/* Built-in method references that are verified to be native. */\nvar DataView = getNative(root, 'DataView');\n\nexport default DataView;\n","import getNative from './_getNative.js';\nimport root from './_root.js';\n\n/* Built-in method references that are verified to be native. */\nvar Promise = getNative(root, 'Promise');\n\nexport default Promise;\n","import getNative from './_getNative.js';\nimport root from './_root.js';\n\n/* Built-in method references that are verified to be native. */\nvar Set = getNative(root, 'Set');\n\nexport default Set;\n","import getNative from './_getNative.js';\nimport root from './_root.js';\n\n/* Built-in method references that are verified to be native. */\nvar WeakMap = getNative(root, 'WeakMap');\n\nexport default WeakMap;\n","import DataView from './_DataView.js';\nimport Map from './_Map.js';\nimport Promise from './_Promise.js';\nimport Set from './_Set.js';\nimport WeakMap from './_WeakMap.js';\nimport baseGetTag from './_baseGetTag.js';\nimport toSource from './_toSource.js';\n\n/** `Object#toString` result references. */\nvar mapTag = '[object Map]',\n objectTag = '[object Object]',\n promiseTag = '[object Promise]',\n setTag = '[object Set]',\n weakMapTag = '[object WeakMap]';\n\nvar dataViewTag = '[object DataView]';\n\n/** Used to detect maps, sets, and weakmaps. */\nvar dataViewCtorString = toSource(DataView),\n mapCtorString = toSource(Map),\n promiseCtorString = toSource(Promise),\n setCtorString = toSource(Set),\n weakMapCtorString = toSource(WeakMap);\n\n/**\n * Gets the `toStringTag` of `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nvar getTag = baseGetTag;\n\n// Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.\nif ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||\n (Map && getTag(new Map) != mapTag) ||\n (Promise && getTag(Promise.resolve()) != promiseTag) ||\n (Set && getTag(new Set) != setTag) ||\n (WeakMap && getTag(new WeakMap) != weakMapTag)) {\n getTag = function(value) {\n var result = baseGetTag(value),\n Ctor = result == objectTag ? value.constructor : undefined,\n ctorString = Ctor ? toSource(Ctor) : '';\n\n if (ctorString) {\n switch (ctorString) {\n case dataViewCtorString: return dataViewTag;\n case mapCtorString: return mapTag;\n case promiseCtorString: return promiseTag;\n case setCtorString: return setTag;\n case weakMapCtorString: return weakMapTag;\n }\n }\n return result;\n };\n}\n\nexport default getTag;\n","import isObject from './isObject.js';\n\n/** Built-in value references. */\nvar objectCreate = Object.create;\n\n/**\n * The base implementation of `_.create` without support for assigning\n * properties to the created object.\n *\n * @private\n * @param {Object} proto The object to inherit from.\n * @returns {Object} Returns the new object.\n */\nvar baseCreate = (function() {\n function object() {}\n return function(proto) {\n if (!isObject(proto)) {\n return {};\n }\n if (objectCreate) {\n return objectCreate(proto);\n }\n object.prototype = proto;\n var result = new object;\n object.prototype = undefined;\n return result;\n };\n}());\n\nexport default baseCreate;\n","import baseCreate from './_baseCreate.js';\nimport getPrototype from './_getPrototype.js';\nimport isPrototype from './_isPrototype.js';\n\n/**\n * Initializes an object clone.\n *\n * @private\n * @param {Object} object The object to clone.\n * @returns {Object} Returns the initialized clone.\n */\nfunction initCloneObject(object) {\n return (typeof object.constructor == 'function' && !isPrototype(object))\n ? baseCreate(getPrototype(object))\n : {};\n}\n\nexport default initCloneObject;\n","/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/** Used to detect unsigned integer values. */\nvar reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n/**\n * Checks if `value` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n */\nfunction isIndex(value, length) {\n var type = typeof value;\n length = length == null ? MAX_SAFE_INTEGER : length;\n\n return !!length &&\n (type == 'number' ||\n (type != 'symbol' && reIsUint.test(value))) &&\n (value > -1 && value % 1 == 0 && value < length);\n}\n\nexport default isIndex;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Checks if `value` is likely a prototype object.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n */\nfunction isPrototype(value) {\n var Ctor = value && value.constructor,\n proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\n return value === proto;\n}\n\nexport default isPrototype;\n","import freeGlobal from './_freeGlobal.js';\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Detect free variable `process` from Node.js. */\nvar freeProcess = moduleExports && freeGlobal.process;\n\n/** Used to access faster Node.js helpers. */\nvar nodeUtil = (function() {\n try {\n // Use `util.types` for Node.js 10+.\n var types = freeModule && freeModule.require && freeModule.require('util').types;\n\n if (types) {\n return types;\n }\n\n // Legacy `process.binding('util')` for Node.js < 10.\n return freeProcess && freeProcess.binding && freeProcess.binding('util');\n } catch (e) {}\n}());\n\nexport default nodeUtil;\n","/**\n * Creates a unary function that invokes `func` with its argument transformed.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {Function} transform The argument transform.\n * @returns {Function} Returns the new function.\n */\nfunction overArg(func, transform) {\n return function(arg) {\n return func(transform(arg));\n };\n}\n\nexport default overArg;\n","import freeGlobal from './_freeGlobal.js';\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\nexport default root;\n","/** Used for built-in method references. */\nvar funcProto = Function.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/**\n * Converts `func` to its source code.\n *\n * @private\n * @param {Function} func The function to convert.\n * @returns {string} Returns the source code.\n */\nfunction toSource(func) {\n if (func != null) {\n try {\n return funcToString.call(func);\n } catch (e) {}\n try {\n return (func + '');\n } catch (e) {}\n }\n return '';\n}\n\nexport default toSource;\n","import arrayPush from './_arrayPush.js';\nimport getPrototype from './_getPrototype.js';\nimport getSymbols from './_getSymbols.js';\nimport stubArray from './stubArray.js';\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeGetSymbols = Object.getOwnPropertySymbols;\n\n/**\n * Creates an array of the own and inherited enumerable symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of symbols.\n */\nvar getSymbolsIn = !nativeGetSymbols ? stubArray : function(object) {\n var result = [];\n while (object) {\n arrayPush(result, getSymbols(object));\n object = getPrototype(object);\n }\n return result;\n};\n\nexport default getSymbolsIn;\n","import baseGetAllKeys from './_baseGetAllKeys.js';\nimport getSymbolsIn from './_getSymbolsIn.js';\nimport keysIn from './keysIn.js';\n\n/**\n * Creates an array of own and inherited enumerable property names and\n * symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction getAllKeysIn(object) {\n return baseGetAllKeys(object, keysIn, getSymbolsIn);\n}\n\nexport default getAllKeysIn;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Initializes an array clone.\n *\n * @private\n * @param {Array} array The array to clone.\n * @returns {Array} Returns the initialized clone.\n */\nfunction initCloneArray(array) {\n var length = array.length,\n result = new array.constructor(length);\n\n // Add properties assigned by `RegExp#exec`.\n if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) {\n result.index = array.index;\n result.input = array.input;\n }\n return result;\n}\n\nexport default initCloneArray;\n","/** Used to match `RegExp` flags from their coerced string values. */\nvar reFlags = /\\w*$/;\n\n/**\n * Creates a clone of `regexp`.\n *\n * @private\n * @param {Object} regexp The regexp to clone.\n * @returns {Object} Returns the cloned regexp.\n */\nfunction cloneRegExp(regexp) {\n var result = new regexp.constructor(regexp.source, reFlags.exec(regexp));\n result.lastIndex = regexp.lastIndex;\n return result;\n}\n\nexport default cloneRegExp;\n","import Symbol from './_Symbol.js';\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;\n\n/**\n * Creates a clone of the `symbol` object.\n *\n * @private\n * @param {Object} symbol The symbol object to clone.\n * @returns {Object} Returns the cloned symbol object.\n */\nfunction cloneSymbol(symbol) {\n return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {};\n}\n\nexport default cloneSymbol;\n","import cloneArrayBuffer from './_cloneArrayBuffer.js';\nimport cloneDataView from './_cloneDataView.js';\nimport cloneRegExp from './_cloneRegExp.js';\nimport cloneSymbol from './_cloneSymbol.js';\nimport cloneTypedArray from './_cloneTypedArray.js';\n\n/** `Object#toString` result references. */\nvar boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n symbolTag = '[object Symbol]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]',\n float32Tag = '[object Float32Array]',\n float64Tag = '[object Float64Array]',\n int8Tag = '[object Int8Array]',\n int16Tag = '[object Int16Array]',\n int32Tag = '[object Int32Array]',\n uint8Tag = '[object Uint8Array]',\n uint8ClampedTag = '[object Uint8ClampedArray]',\n uint16Tag = '[object Uint16Array]',\n uint32Tag = '[object Uint32Array]';\n\n/**\n * Initializes an object clone based on its `toStringTag`.\n *\n * **Note:** This function only supports cloning values with tags of\n * `Boolean`, `Date`, `Error`, `Map`, `Number`, `RegExp`, `Set`, or `String`.\n *\n * @private\n * @param {Object} object The object to clone.\n * @param {string} tag The `toStringTag` of the object to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the initialized clone.\n */\nfunction initCloneByTag(object, tag, isDeep) {\n var Ctor = object.constructor;\n switch (tag) {\n case arrayBufferTag:\n return cloneArrayBuffer(object);\n\n case boolTag:\n case dateTag:\n return new Ctor(+object);\n\n case dataViewTag:\n return cloneDataView(object, isDeep);\n\n case float32Tag: case float64Tag:\n case int8Tag: case int16Tag: case int32Tag:\n case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag:\n return cloneTypedArray(object, isDeep);\n\n case mapTag:\n return new Ctor;\n\n case numberTag:\n case stringTag:\n return new Ctor(object);\n\n case regexpTag:\n return cloneRegExp(object);\n\n case setTag:\n return new Ctor;\n\n case symbolTag:\n return cloneSymbol(object);\n }\n}\n\nexport default initCloneByTag;\n","import cloneArrayBuffer from './_cloneArrayBuffer.js';\n\n/**\n * Creates a clone of `dataView`.\n *\n * @private\n * @param {Object} dataView The data view to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the cloned data view.\n */\nfunction cloneDataView(dataView, isDeep) {\n var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer;\n return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength);\n}\n\nexport default cloneDataView;\n","import baseIsMap from './_baseIsMap.js';\nimport baseUnary from './_baseUnary.js';\nimport nodeUtil from './_nodeUtil.js';\n\n/* Node.js helper references. */\nvar nodeIsMap = nodeUtil && nodeUtil.isMap;\n\n/**\n * Checks if `value` is classified as a `Map` object.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a map, else `false`.\n * @example\n *\n * _.isMap(new Map);\n * // => true\n *\n * _.isMap(new WeakMap);\n * // => false\n */\nvar isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap;\n\nexport default isMap;\n","import getTag from './_getTag.js';\nimport isObjectLike from './isObjectLike.js';\n\n/** `Object#toString` result references. */\nvar mapTag = '[object Map]';\n\n/**\n * The base implementation of `_.isMap` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a map, else `false`.\n */\nfunction baseIsMap(value) {\n return isObjectLike(value) && getTag(value) == mapTag;\n}\n\nexport default baseIsMap;\n","import baseIsSet from './_baseIsSet.js';\nimport baseUnary from './_baseUnary.js';\nimport nodeUtil from './_nodeUtil.js';\n\n/* Node.js helper references. */\nvar nodeIsSet = nodeUtil && nodeUtil.isSet;\n\n/**\n * Checks if `value` is classified as a `Set` object.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a set, else `false`.\n * @example\n *\n * _.isSet(new Set);\n * // => true\n *\n * _.isSet(new WeakSet);\n * // => false\n */\nvar isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet;\n\nexport default isSet;\n","import getTag from './_getTag.js';\nimport isObjectLike from './isObjectLike.js';\n\n/** `Object#toString` result references. */\nvar setTag = '[object Set]';\n\n/**\n * The base implementation of `_.isSet` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a set, else `false`.\n */\nfunction baseIsSet(value) {\n return isObjectLike(value) && getTag(value) == setTag;\n}\n\nexport default baseIsSet;\n","import Stack from './_Stack.js';\nimport arrayEach from './_arrayEach.js';\nimport assignValue from './_assignValue.js';\nimport baseAssign from './_baseAssign.js';\nimport baseAssignIn from './_baseAssignIn.js';\nimport cloneBuffer from './_cloneBuffer.js';\nimport copyArray from './_copyArray.js';\nimport copySymbols from './_copySymbols.js';\nimport copySymbolsIn from './_copySymbolsIn.js';\nimport getAllKeys from './_getAllKeys.js';\nimport getAllKeysIn from './_getAllKeysIn.js';\nimport getTag from './_getTag.js';\nimport initCloneArray from './_initCloneArray.js';\nimport initCloneByTag from './_initCloneByTag.js';\nimport initCloneObject from './_initCloneObject.js';\nimport isArray from './isArray.js';\nimport isBuffer from './isBuffer.js';\nimport isMap from './isMap.js';\nimport isObject from './isObject.js';\nimport isSet from './isSet.js';\nimport keys from './keys.js';\nimport keysIn from './keysIn.js';\n\n/** Used to compose bitmasks for cloning. */\nvar CLONE_DEEP_FLAG = 1,\n CLONE_FLAT_FLAG = 2,\n CLONE_SYMBOLS_FLAG = 4;\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n errorTag = '[object Error]',\n funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n objectTag = '[object Object]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n symbolTag = '[object Symbol]',\n weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]',\n float32Tag = '[object Float32Array]',\n float64Tag = '[object Float64Array]',\n int8Tag = '[object Int8Array]',\n int16Tag = '[object Int16Array]',\n int32Tag = '[object Int32Array]',\n uint8Tag = '[object Uint8Array]',\n uint8ClampedTag = '[object Uint8ClampedArray]',\n uint16Tag = '[object Uint16Array]',\n uint32Tag = '[object Uint32Array]';\n\n/** Used to identify `toStringTag` values supported by `_.clone`. */\nvar cloneableTags = {};\ncloneableTags[argsTag] = cloneableTags[arrayTag] =\ncloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] =\ncloneableTags[boolTag] = cloneableTags[dateTag] =\ncloneableTags[float32Tag] = cloneableTags[float64Tag] =\ncloneableTags[int8Tag] = cloneableTags[int16Tag] =\ncloneableTags[int32Tag] = cloneableTags[mapTag] =\ncloneableTags[numberTag] = cloneableTags[objectTag] =\ncloneableTags[regexpTag] = cloneableTags[setTag] =\ncloneableTags[stringTag] = cloneableTags[symbolTag] =\ncloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] =\ncloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true;\ncloneableTags[errorTag] = cloneableTags[funcTag] =\ncloneableTags[weakMapTag] = false;\n\n/**\n * The base implementation of `_.clone` and `_.cloneDeep` which tracks\n * traversed objects.\n *\n * @private\n * @param {*} value The value to clone.\n * @param {boolean} bitmask The bitmask flags.\n * 1 - Deep clone\n * 2 - Flatten inherited properties\n * 4 - Clone symbols\n * @param {Function} [customizer] The function to customize cloning.\n * @param {string} [key] The key of `value`.\n * @param {Object} [object] The parent object of `value`.\n * @param {Object} [stack] Tracks traversed objects and their clone counterparts.\n * @returns {*} Returns the cloned value.\n */\nfunction baseClone(value, bitmask, customizer, key, object, stack) {\n var result,\n isDeep = bitmask & CLONE_DEEP_FLAG,\n isFlat = bitmask & CLONE_FLAT_FLAG,\n isFull = bitmask & CLONE_SYMBOLS_FLAG;\n\n if (customizer) {\n result = object ? customizer(value, key, object, stack) : customizer(value);\n }\n if (result !== undefined) {\n return result;\n }\n if (!isObject(value)) {\n return value;\n }\n var isArr = isArray(value);\n if (isArr) {\n result = initCloneArray(value);\n if (!isDeep) {\n return copyArray(value, result);\n }\n } else {\n var tag = getTag(value),\n isFunc = tag == funcTag || tag == genTag;\n\n if (isBuffer(value)) {\n return cloneBuffer(value, isDeep);\n }\n if (tag == objectTag || tag == argsTag || (isFunc && !object)) {\n result = (isFlat || isFunc) ? {} : initCloneObject(value);\n if (!isDeep) {\n return isFlat\n ? copySymbolsIn(value, baseAssignIn(result, value))\n : copySymbols(value, baseAssign(result, value));\n }\n } else {\n if (!cloneableTags[tag]) {\n return object ? value : {};\n }\n result = initCloneByTag(value, tag, isDeep);\n }\n }\n // Check for circular references and return its corresponding clone.\n stack || (stack = new Stack);\n var stacked = stack.get(value);\n if (stacked) {\n return stacked;\n }\n stack.set(value, result);\n\n if (isSet(value)) {\n value.forEach(function(subValue) {\n result.add(baseClone(subValue, bitmask, customizer, subValue, value, stack));\n });\n } else if (isMap(value)) {\n value.forEach(function(subValue, key) {\n result.set(key, baseClone(subValue, bitmask, customizer, key, value, stack));\n });\n }\n\n var keysFunc = isFull\n ? (isFlat ? getAllKeysIn : getAllKeys)\n : (isFlat ? keysIn : keys);\n\n var props = isArr ? undefined : keysFunc(value);\n arrayEach(props || value, function(subValue, key) {\n if (props) {\n key = subValue;\n subValue = value[key];\n }\n // Recursively populate clone (susceptible to call stack limits).\n assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack));\n });\n return result;\n}\n\nexport default baseClone;\n","import copyObject from './_copyObject.js';\nimport getSymbolsIn from './_getSymbolsIn.js';\n\n/**\n * Copies own and inherited symbols of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy symbols from.\n * @param {Object} [object={}] The object to copy symbols to.\n * @returns {Object} Returns `object`.\n */\nfunction copySymbolsIn(source, object) {\n return copyObject(source, getSymbolsIn(source), object);\n}\n\nexport default copySymbolsIn;\n","import copyObject from './_copyObject.js';\nimport keysIn from './keysIn.js';\n\n/**\n * The base implementation of `_.assignIn` without support for multiple sources\n * or `customizer` functions.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @returns {Object} Returns `object`.\n */\nfunction baseAssignIn(object, source) {\n return object && copyObject(source, keysIn(source), object);\n}\n\nexport default baseAssignIn;\n","import copyObject from './_copyObject.js';\nimport getSymbols from './_getSymbols.js';\n\n/**\n * Copies own symbols of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy symbols from.\n * @param {Object} [object={}] The object to copy symbols to.\n * @returns {Object} Returns `object`.\n */\nfunction copySymbols(source, object) {\n return copyObject(source, getSymbols(source), object);\n}\n\nexport default copySymbols;\n","import copyObject from './_copyObject.js';\nimport keys from './keys.js';\n\n/**\n * The base implementation of `_.assign` without support for multiple sources\n * or `customizer` functions.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @returns {Object} Returns `object`.\n */\nfunction baseAssign(object, source) {\n return object && copyObject(source, keys(source), object);\n}\n\nexport default baseAssign;\n","/**\n * A specialized version of `_.forEach` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns `array`.\n */\nfunction arrayEach(array, iteratee) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n if (iteratee(array[index], index, array) === false) {\n break;\n }\n }\n return array;\n}\n\nexport default arrayEach;\n","import baseClone from './_baseClone.js';\n\n/** Used to compose bitmasks for cloning. */\nvar CLONE_DEEP_FLAG = 1,\n CLONE_SYMBOLS_FLAG = 4;\n\n/**\n * This method is like `_.clone` except that it recursively clones `value`.\n *\n * @static\n * @memberOf _\n * @since 1.0.0\n * @category Lang\n * @param {*} value The value to recursively clone.\n * @returns {*} Returns the deep cloned value.\n * @see _.clone\n * @example\n *\n * var objects = [{ 'a': 1 }, { 'b': 2 }];\n *\n * var deep = _.cloneDeep(objects);\n * console.log(deep[0] === objects[0]);\n * // => false\n */\nfunction cloneDeep(value) {\n return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG);\n}\n\nexport default cloneDeep;\n","/**\n * Performs a\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\nfunction eq(value, other) {\n return value === other || (value !== value && other !== other);\n}\n\nexport default eq;\n","import baseGetTag from './_baseGetTag.js';\nimport isObjectLike from './isObjectLike.js';\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]';\n\n/**\n * The base implementation of `_.isArguments`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n */\nfunction baseIsArguments(value) {\n return isObjectLike(value) && baseGetTag(value) == argsTag;\n}\n\nexport default baseIsArguments;\n","import baseIsArguments from './_baseIsArguments.js';\nimport isObjectLike from './isObjectLike.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Built-in value references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/**\n * Checks if `value` is likely an `arguments` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n * else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\nvar isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {\n return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&\n !propertyIsEnumerable.call(value, 'callee');\n};\n\nexport default isArguments;\n","/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\nexport default isArray;\n","import isFunction from './isFunction.js';\nimport isLength from './isLength.js';\n\n/**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\nfunction isArrayLike(value) {\n return value != null && isLength(value.length) && !isFunction(value);\n}\n\nexport default isArrayLike;\n","import root from './_root.js';\nimport stubFalse from './stubFalse.js';\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Built-in value references. */\nvar Buffer = moduleExports ? root.Buffer : undefined;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined;\n\n/**\n * Checks if `value` is a buffer.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.\n * @example\n *\n * _.isBuffer(new Buffer(2));\n * // => true\n *\n * _.isBuffer(new Uint8Array(2));\n * // => false\n */\nvar isBuffer = nativeIsBuffer || stubFalse;\n\nexport default isBuffer;\n","/**\n * This method returns `false`.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {boolean} Returns `false`.\n * @example\n *\n * _.times(2, _.stubFalse);\n * // => [false, false]\n */\nfunction stubFalse() {\n return false;\n}\n\nexport default stubFalse;\n","import MapCache from './_MapCache.js';\nimport setCacheAdd from './_setCacheAdd.js';\nimport setCacheHas from './_setCacheHas.js';\n\n/**\n *\n * Creates an array cache object to store unique values.\n *\n * @private\n * @constructor\n * @param {Array} [values] The values to cache.\n */\nfunction SetCache(values) {\n var index = -1,\n length = values == null ? 0 : values.length;\n\n this.__data__ = new MapCache;\n while (++index < length) {\n this.add(values[index]);\n }\n}\n\n// Add methods to `SetCache`.\nSetCache.prototype.add = SetCache.prototype.push = setCacheAdd;\nSetCache.prototype.has = setCacheHas;\n\nexport default SetCache;\n","/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/**\n * Adds `value` to the array cache.\n *\n * @private\n * @name add\n * @memberOf SetCache\n * @alias push\n * @param {*} value The value to cache.\n * @returns {Object} Returns the cache instance.\n */\nfunction setCacheAdd(value) {\n this.__data__.set(value, HASH_UNDEFINED);\n return this;\n}\n\nexport default setCacheAdd;\n","/**\n * Checks if `value` is in the array cache.\n *\n * @private\n * @name has\n * @memberOf SetCache\n * @param {*} value The value to search for.\n * @returns {number} Returns `true` if `value` is found, else `false`.\n */\nfunction setCacheHas(value) {\n return this.__data__.has(value);\n}\n\nexport default setCacheHas;\n","/**\n * A specialized version of `_.some` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns `true` if any element passes the predicate check,\n * else `false`.\n */\nfunction arraySome(array, predicate) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n if (predicate(array[index], index, array)) {\n return true;\n }\n }\n return false;\n}\n\nexport default arraySome;\n","import SetCache from './_SetCache.js';\nimport arraySome from './_arraySome.js';\nimport cacheHas from './_cacheHas.js';\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n COMPARE_UNORDERED_FLAG = 2;\n\n/**\n * A specialized version of `baseIsEqualDeep` for arrays with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Array} array The array to compare.\n * @param {Array} other The other array to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `array` and `other` objects.\n * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.\n */\nfunction equalArrays(array, other, bitmask, customizer, equalFunc, stack) {\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n arrLength = array.length,\n othLength = other.length;\n\n if (arrLength != othLength && !(isPartial && othLength > arrLength)) {\n return false;\n }\n // Check that cyclic values are equal.\n var arrStacked = stack.get(array);\n var othStacked = stack.get(other);\n if (arrStacked && othStacked) {\n return arrStacked == other && othStacked == array;\n }\n var index = -1,\n result = true,\n seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined;\n\n stack.set(array, other);\n stack.set(other, array);\n\n // Ignore non-index properties.\n while (++index < arrLength) {\n var arrValue = array[index],\n othValue = other[index];\n\n if (customizer) {\n var compared = isPartial\n ? customizer(othValue, arrValue, index, other, array, stack)\n : customizer(arrValue, othValue, index, array, other, stack);\n }\n if (compared !== undefined) {\n if (compared) {\n continue;\n }\n result = false;\n break;\n }\n // Recursively compare arrays (susceptible to call stack limits).\n if (seen) {\n if (!arraySome(other, function(othValue, othIndex) {\n if (!cacheHas(seen, othIndex) &&\n (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {\n return seen.push(othIndex);\n }\n })) {\n result = false;\n break;\n }\n } else if (!(\n arrValue === othValue ||\n equalFunc(arrValue, othValue, bitmask, customizer, stack)\n )) {\n result = false;\n break;\n }\n }\n stack['delete'](array);\n stack['delete'](other);\n return result;\n}\n\nexport default equalArrays;\n","/**\n * Checks if a `cache` value for `key` exists.\n *\n * @private\n * @param {Object} cache The cache to query.\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction cacheHas(cache, key) {\n return cache.has(key);\n}\n\nexport default cacheHas;\n","/**\n * Converts `map` to its key-value pairs.\n *\n * @private\n * @param {Object} map The map to convert.\n * @returns {Array} Returns the key-value pairs.\n */\nfunction mapToArray(map) {\n var index = -1,\n result = Array(map.size);\n\n map.forEach(function(value, key) {\n result[++index] = [key, value];\n });\n return result;\n}\n\nexport default mapToArray;\n","/**\n * Converts `set` to an array of its values.\n *\n * @private\n * @param {Object} set The set to convert.\n * @returns {Array} Returns the values.\n */\nfunction setToArray(set) {\n var index = -1,\n result = Array(set.size);\n\n set.forEach(function(value) {\n result[++index] = value;\n });\n return result;\n}\n\nexport default setToArray;\n","import Symbol from './_Symbol.js';\nimport Uint8Array from './_Uint8Array.js';\nimport eq from './eq.js';\nimport equalArrays from './_equalArrays.js';\nimport mapToArray from './_mapToArray.js';\nimport setToArray from './_setToArray.js';\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n COMPARE_UNORDERED_FLAG = 2;\n\n/** `Object#toString` result references. */\nvar boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n errorTag = '[object Error]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n symbolTag = '[object Symbol]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]';\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;\n\n/**\n * A specialized version of `baseIsEqualDeep` for comparing objects of\n * the same `toStringTag`.\n *\n * **Note:** This function only supports comparing values with tags of\n * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {string} tag The `toStringTag` of the objects to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {\n switch (tag) {\n case dataViewTag:\n if ((object.byteLength != other.byteLength) ||\n (object.byteOffset != other.byteOffset)) {\n return false;\n }\n object = object.buffer;\n other = other.buffer;\n\n case arrayBufferTag:\n if ((object.byteLength != other.byteLength) ||\n !equalFunc(new Uint8Array(object), new Uint8Array(other))) {\n return false;\n }\n return true;\n\n case boolTag:\n case dateTag:\n case numberTag:\n // Coerce booleans to `1` or `0` and dates to milliseconds.\n // Invalid dates are coerced to `NaN`.\n return eq(+object, +other);\n\n case errorTag:\n return object.name == other.name && object.message == other.message;\n\n case regexpTag:\n case stringTag:\n // Coerce regexes to strings and treat strings, primitives and objects,\n // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring\n // for more details.\n return object == (other + '');\n\n case mapTag:\n var convert = mapToArray;\n\n case setTag:\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG;\n convert || (convert = setToArray);\n\n if (object.size != other.size && !isPartial) {\n return false;\n }\n // Assume cyclic values are equal.\n var stacked = stack.get(object);\n if (stacked) {\n return stacked == other;\n }\n bitmask |= COMPARE_UNORDERED_FLAG;\n\n // Recursively compare objects (susceptible to call stack limits).\n stack.set(object, other);\n var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);\n stack['delete'](object);\n return result;\n\n case symbolTag:\n if (symbolValueOf) {\n return symbolValueOf.call(object) == symbolValueOf.call(other);\n }\n }\n return false;\n}\n\nexport default equalByTag;\n","import getAllKeys from './_getAllKeys.js';\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1;\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * A specialized version of `baseIsEqualDeep` for objects with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction equalObjects(object, other, bitmask, customizer, equalFunc, stack) {\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n objProps = getAllKeys(object),\n objLength = objProps.length,\n othProps = getAllKeys(other),\n othLength = othProps.length;\n\n if (objLength != othLength && !isPartial) {\n return false;\n }\n var index = objLength;\n while (index--) {\n var key = objProps[index];\n if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {\n return false;\n }\n }\n // Check that cyclic values are equal.\n var objStacked = stack.get(object);\n var othStacked = stack.get(other);\n if (objStacked && othStacked) {\n return objStacked == other && othStacked == object;\n }\n var result = true;\n stack.set(object, other);\n stack.set(other, object);\n\n var skipCtor = isPartial;\n while (++index < objLength) {\n key = objProps[index];\n var objValue = object[key],\n othValue = other[key];\n\n if (customizer) {\n var compared = isPartial\n ? customizer(othValue, objValue, key, other, object, stack)\n : customizer(objValue, othValue, key, object, other, stack);\n }\n // Recursively compare objects (susceptible to call stack limits).\n if (!(compared === undefined\n ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack))\n : compared\n )) {\n result = false;\n break;\n }\n skipCtor || (skipCtor = key == 'constructor');\n }\n if (result && !skipCtor) {\n var objCtor = object.constructor,\n othCtor = other.constructor;\n\n // Non `Object` object instances with different constructors are not equal.\n if (objCtor != othCtor &&\n ('constructor' in object && 'constructor' in other) &&\n !(typeof objCtor == 'function' && objCtor instanceof objCtor &&\n typeof othCtor == 'function' && othCtor instanceof othCtor)) {\n result = false;\n }\n }\n stack['delete'](object);\n stack['delete'](other);\n return result;\n}\n\nexport default equalObjects;\n","import Stack from './_Stack.js';\nimport equalArrays from './_equalArrays.js';\nimport equalByTag from './_equalByTag.js';\nimport equalObjects from './_equalObjects.js';\nimport getTag from './_getTag.js';\nimport isArray from './isArray.js';\nimport isBuffer from './isBuffer.js';\nimport isTypedArray from './isTypedArray.js';\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1;\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n objectTag = '[object Object]';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * A specialized version of `baseIsEqual` for arrays and objects which performs\n * deep comparisons and tracks traversed objects enabling objects with circular\n * references to be compared.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} [stack] Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {\n var objIsArr = isArray(object),\n othIsArr = isArray(other),\n objTag = objIsArr ? arrayTag : getTag(object),\n othTag = othIsArr ? arrayTag : getTag(other);\n\n objTag = objTag == argsTag ? objectTag : objTag;\n othTag = othTag == argsTag ? objectTag : othTag;\n\n var objIsObj = objTag == objectTag,\n othIsObj = othTag == objectTag,\n isSameTag = objTag == othTag;\n\n if (isSameTag && isBuffer(object)) {\n if (!isBuffer(other)) {\n return false;\n }\n objIsArr = true;\n objIsObj = false;\n }\n if (isSameTag && !objIsObj) {\n stack || (stack = new Stack);\n return (objIsArr || isTypedArray(object))\n ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)\n : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);\n }\n if (!(bitmask & COMPARE_PARTIAL_FLAG)) {\n var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),\n othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');\n\n if (objIsWrapped || othIsWrapped) {\n var objUnwrapped = objIsWrapped ? object.value() : object,\n othUnwrapped = othIsWrapped ? other.value() : other;\n\n stack || (stack = new Stack);\n return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);\n }\n }\n if (!isSameTag) {\n return false;\n }\n stack || (stack = new Stack);\n return equalObjects(object, other, bitmask, customizer, equalFunc, stack);\n}\n\nexport default baseIsEqualDeep;\n","import baseIsEqualDeep from './_baseIsEqualDeep.js';\nimport isObjectLike from './isObjectLike.js';\n\n/**\n * The base implementation of `_.isEqual` which supports partial comparisons\n * and tracks traversed objects.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @param {boolean} bitmask The bitmask flags.\n * 1 - Unordered comparison\n * 2 - Partial comparison\n * @param {Function} [customizer] The function to customize comparisons.\n * @param {Object} [stack] Tracks traversed `value` and `other` objects.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n */\nfunction baseIsEqual(value, other, bitmask, customizer, stack) {\n if (value === other) {\n return true;\n }\n if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {\n return value !== value && other !== other;\n }\n return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);\n}\n\nexport default baseIsEqual;\n","import baseIsEqual from './_baseIsEqual.js';\n\n/**\n * Performs a deep comparison between two values to determine if they are\n * equivalent.\n *\n * **Note:** This method supports comparing arrays, array buffers, booleans,\n * date objects, error objects, maps, numbers, `Object` objects, regexes,\n * sets, strings, symbols, and typed arrays. `Object` objects are compared\n * by their own, not inherited, enumerable properties. Functions and DOM\n * nodes are compared by strict equality, i.e. `===`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.isEqual(object, other);\n * // => true\n *\n * object === other;\n * // => false\n */\nfunction isEqual(value, other) {\n return baseIsEqual(value, other);\n}\n\nexport default isEqual;\n","import baseGetTag from './_baseGetTag.js';\nimport isObject from './isObject.js';\n\n/** `Object#toString` result references. */\nvar asyncTag = '[object AsyncFunction]',\n funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]',\n proxyTag = '[object Proxy]';\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n if (!isObject(value)) {\n return false;\n }\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in Safari 9 which returns 'object' for typed arrays and other constructors.\n var tag = baseGetTag(value);\n return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\n}\n\nexport default isFunction;\n","/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This method is loosely based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\nfunction isLength(value) {\n return typeof value == 'number' &&\n value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\nexport default isLength;\n","/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return value != null && (type == 'object' || type == 'function');\n}\n\nexport default isObject;\n","/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return value != null && typeof value == 'object';\n}\n\nexport default isObjectLike;\n","import baseGetTag from './_baseGetTag.js';\nimport isLength from './isLength.js';\nimport isObjectLike from './isObjectLike.js';\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n errorTag = '[object Error]',\n funcTag = '[object Function]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n objectTag = '[object Object]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]',\n float32Tag = '[object Float32Array]',\n float64Tag = '[object Float64Array]',\n int8Tag = '[object Int8Array]',\n int16Tag = '[object Int16Array]',\n int32Tag = '[object Int32Array]',\n uint8Tag = '[object Uint8Array]',\n uint8ClampedTag = '[object Uint8ClampedArray]',\n uint16Tag = '[object Uint16Array]',\n uint32Tag = '[object Uint32Array]';\n\n/** Used to identify `toStringTag` values of typed arrays. */\nvar typedArrayTags = {};\ntypedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\ntypedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\ntypedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\ntypedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\ntypedArrayTags[uint32Tag] = true;\ntypedArrayTags[argsTag] = typedArrayTags[arrayTag] =\ntypedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\ntypedArrayTags[dataViewTag] = typedArrayTags[dateTag] =\ntypedArrayTags[errorTag] = typedArrayTags[funcTag] =\ntypedArrayTags[mapTag] = typedArrayTags[numberTag] =\ntypedArrayTags[objectTag] = typedArrayTags[regexpTag] =\ntypedArrayTags[setTag] = typedArrayTags[stringTag] =\ntypedArrayTags[weakMapTag] = false;\n\n/**\n * The base implementation of `_.isTypedArray` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n */\nfunction baseIsTypedArray(value) {\n return isObjectLike(value) &&\n isLength(value.length) && !!typedArrayTags[baseGetTag(value)];\n}\n\nexport default baseIsTypedArray;\n","import baseIsTypedArray from './_baseIsTypedArray.js';\nimport baseUnary from './_baseUnary.js';\nimport nodeUtil from './_nodeUtil.js';\n\n/* Node.js helper references. */\nvar nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;\n\n/**\n * Checks if `value` is classified as a typed array.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n * @example\n *\n * _.isTypedArray(new Uint8Array);\n * // => true\n *\n * _.isTypedArray([]);\n * // => false\n */\nvar isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;\n\nexport default isTypedArray;\n","import overArg from './_overArg.js';\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeKeys = overArg(Object.keys, Object);\n\nexport default nativeKeys;\n","import isPrototype from './_isPrototype.js';\nimport nativeKeys from './_nativeKeys.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeys(object) {\n if (!isPrototype(object)) {\n return nativeKeys(object);\n }\n var result = [];\n for (var key in Object(object)) {\n if (hasOwnProperty.call(object, key) && key != 'constructor') {\n result.push(key);\n }\n }\n return result;\n}\n\nexport default baseKeys;\n","import arrayLikeKeys from './_arrayLikeKeys.js';\nimport baseKeys from './_baseKeys.js';\nimport isArrayLike from './isArrayLike.js';\n\n/**\n * Creates an array of the own enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects. See the\n * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * for more details.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keys(new Foo);\n * // => ['a', 'b'] (iteration order is not guaranteed)\n *\n * _.keys('hi');\n * // => ['0', '1']\n */\nfunction keys(object) {\n return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);\n}\n\nexport default keys;\n","import isObject from './isObject.js';\nimport isPrototype from './_isPrototype.js';\nimport nativeKeysIn from './_nativeKeysIn.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeysIn(object) {\n if (!isObject(object)) {\n return nativeKeysIn(object);\n }\n var isProto = isPrototype(object),\n result = [];\n\n for (var key in object) {\n if (!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {\n result.push(key);\n }\n }\n return result;\n}\n\nexport default baseKeysIn;\n","/**\n * This function is like\n * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * except that it includes inherited enumerable properties.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction nativeKeysIn(object) {\n var result = [];\n if (object != null) {\n for (var key in Object(object)) {\n result.push(key);\n }\n }\n return result;\n}\n\nexport default nativeKeysIn;\n","import arrayLikeKeys from './_arrayLikeKeys.js';\nimport baseKeysIn from './_baseKeysIn.js';\nimport isArrayLike from './isArrayLike.js';\n\n/**\n * Creates an array of the own and inherited enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keysIn(new Foo);\n * // => ['a', 'b', 'c'] (iteration order is not guaranteed)\n */\nfunction keysIn(object) {\n return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);\n}\n\nexport default keysIn;\n","/** Used to detect hot functions by number of calls within a span of milliseconds. */\nvar HOT_COUNT = 800,\n HOT_SPAN = 16;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeNow = Date.now;\n\n/**\n * Creates a function that'll short out and invoke `identity` instead\n * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`\n * milliseconds.\n *\n * @private\n * @param {Function} func The function to restrict.\n * @returns {Function} Returns the new shortable function.\n */\nfunction shortOut(func) {\n var count = 0,\n lastCalled = 0;\n\n return function() {\n var stamp = nativeNow(),\n remaining = HOT_SPAN - (stamp - lastCalled);\n\n lastCalled = stamp;\n if (remaining > 0) {\n if (++count >= HOT_COUNT) {\n return arguments[0];\n }\n } else {\n count = 0;\n }\n return func.apply(undefined, arguments);\n };\n}\n\nexport default shortOut;\n","import baseRest from './_baseRest.js';\nimport isIterateeCall from './_isIterateeCall.js';\n\n/**\n * Creates a function like `_.assign`.\n *\n * @private\n * @param {Function} assigner The function to assign values.\n * @returns {Function} Returns the new assigner function.\n */\nfunction createAssigner(assigner) {\n return baseRest(function(object, sources) {\n var index = -1,\n length = sources.length,\n customizer = length > 1 ? sources[length - 1] : undefined,\n guard = length > 2 ? sources[2] : undefined;\n\n customizer = (assigner.length > 3 && typeof customizer == 'function')\n ? (length--, customizer)\n : undefined;\n\n if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n customizer = length < 3 ? undefined : customizer;\n length = 1;\n }\n object = Object(object);\n while (++index < length) {\n var source = sources[index];\n if (source) {\n assigner(object, source, index, customizer);\n }\n }\n return object;\n });\n}\n\nexport default createAssigner;\n","import baseAssignValue from './_baseAssignValue.js';\nimport eq from './eq.js';\n\n/**\n * This function is like `assignValue` except that it doesn't assign\n * `undefined` values.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction assignMergeValue(object, key, value) {\n if ((value !== undefined && !eq(object[key], value)) ||\n (value === undefined && !(key in object))) {\n baseAssignValue(object, key, value);\n }\n}\n\nexport default assignMergeValue;\n","import createBaseFor from './_createBaseFor.js';\n\n/**\n * The base implementation of `baseForOwn` which iterates over `object`\n * properties returned by `keysFunc` and invokes `iteratee` for each property.\n * Iteratee functions may exit iteration early by explicitly returning `false`.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @returns {Object} Returns `object`.\n */\nvar baseFor = createBaseFor();\n\nexport default baseFor;\n","/**\n * Creates a base function for methods like `_.forIn` and `_.forOwn`.\n *\n * @private\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new base function.\n */\nfunction createBaseFor(fromRight) {\n return function(object, iteratee, keysFunc) {\n var index = -1,\n iterable = Object(object),\n props = keysFunc(object),\n length = props.length;\n\n while (length--) {\n var key = props[fromRight ? length : ++index];\n if (iteratee(iterable[key], key, iterable) === false) {\n break;\n }\n }\n return object;\n };\n}\n\nexport default createBaseFor;\n","import baseGetTag from './_baseGetTag.js';\nimport getPrototype from './_getPrototype.js';\nimport isObjectLike from './isObjectLike.js';\n\n/** `Object#toString` result references. */\nvar objectTag = '[object Object]';\n\n/** Used for built-in method references. */\nvar funcProto = Function.prototype,\n objectProto = Object.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Used to infer the `Object` constructor. */\nvar objectCtorString = funcToString.call(Object);\n\n/**\n * Checks if `value` is a plain object, that is, an object created by the\n * `Object` constructor or one with a `[[Prototype]]` of `null`.\n *\n * @static\n * @memberOf _\n * @since 0.8.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * }\n *\n * _.isPlainObject(new Foo);\n * // => false\n *\n * _.isPlainObject([1, 2, 3]);\n * // => false\n *\n * _.isPlainObject({ 'x': 0, 'y': 0 });\n * // => true\n *\n * _.isPlainObject(Object.create(null));\n * // => true\n */\nfunction isPlainObject(value) {\n if (!isObjectLike(value) || baseGetTag(value) != objectTag) {\n return false;\n }\n var proto = getPrototype(value);\n if (proto === null) {\n return true;\n }\n var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor;\n return typeof Ctor == 'function' && Ctor instanceof Ctor &&\n funcToString.call(Ctor) == objectCtorString;\n}\n\nexport default isPlainObject;\n","/**\n * Gets the value at `key`, unless `key` is \"__proto__\" or \"constructor\".\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\nfunction safeGet(object, key) {\n if (key === 'constructor' && typeof object[key] === 'function') {\n return;\n }\n\n if (key == '__proto__') {\n return;\n }\n\n return object[key];\n}\n\nexport default safeGet;\n","import assignMergeValue from './_assignMergeValue.js';\nimport cloneBuffer from './_cloneBuffer.js';\nimport cloneTypedArray from './_cloneTypedArray.js';\nimport copyArray from './_copyArray.js';\nimport initCloneObject from './_initCloneObject.js';\nimport isArguments from './isArguments.js';\nimport isArray from './isArray.js';\nimport isArrayLikeObject from './isArrayLikeObject.js';\nimport isBuffer from './isBuffer.js';\nimport isFunction from './isFunction.js';\nimport isObject from './isObject.js';\nimport isPlainObject from './isPlainObject.js';\nimport isTypedArray from './isTypedArray.js';\nimport safeGet from './_safeGet.js';\nimport toPlainObject from './toPlainObject.js';\n\n/**\n * A specialized version of `baseMerge` for arrays and objects which performs\n * deep merges and tracks traversed objects enabling objects with circular\n * references to be merged.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @param {string} key The key of the value to merge.\n * @param {number} srcIndex The index of `source`.\n * @param {Function} mergeFunc The function to merge values.\n * @param {Function} [customizer] The function to customize assigned values.\n * @param {Object} [stack] Tracks traversed source values and their merged\n * counterparts.\n */\nfunction baseMergeDeep(object, source, key, srcIndex, mergeFunc, customizer, stack) {\n var objValue = safeGet(object, key),\n srcValue = safeGet(source, key),\n stacked = stack.get(srcValue);\n\n if (stacked) {\n assignMergeValue(object, key, stacked);\n return;\n }\n var newValue = customizer\n ? customizer(objValue, srcValue, (key + ''), object, source, stack)\n : undefined;\n\n var isCommon = newValue === undefined;\n\n if (isCommon) {\n var isArr = isArray(srcValue),\n isBuff = !isArr && isBuffer(srcValue),\n isTyped = !isArr && !isBuff && isTypedArray(srcValue);\n\n newValue = srcValue;\n if (isArr || isBuff || isTyped) {\n if (isArray(objValue)) {\n newValue = objValue;\n }\n else if (isArrayLikeObject(objValue)) {\n newValue = copyArray(objValue);\n }\n else if (isBuff) {\n isCommon = false;\n newValue = cloneBuffer(srcValue, true);\n }\n else if (isTyped) {\n isCommon = false;\n newValue = cloneTypedArray(srcValue, true);\n }\n else {\n newValue = [];\n }\n }\n else if (isPlainObject(srcValue) || isArguments(srcValue)) {\n newValue = objValue;\n if (isArguments(objValue)) {\n newValue = toPlainObject(objValue);\n }\n else if (!isObject(objValue) || isFunction(objValue)) {\n newValue = initCloneObject(srcValue);\n }\n }\n else {\n isCommon = false;\n }\n }\n if (isCommon) {\n // Recursively merge objects and arrays (susceptible to call stack limits).\n stack.set(srcValue, newValue);\n mergeFunc(newValue, srcValue, srcIndex, customizer, stack);\n stack['delete'](srcValue);\n }\n assignMergeValue(object, key, newValue);\n}\n\nexport default baseMergeDeep;\n","import isArrayLike from './isArrayLike.js';\nimport isObjectLike from './isObjectLike.js';\n\n/**\n * This method is like `_.isArrayLike` except that it also checks if `value`\n * is an object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array-like object,\n * else `false`.\n * @example\n *\n * _.isArrayLikeObject([1, 2, 3]);\n * // => true\n *\n * _.isArrayLikeObject(document.body.children);\n * // => true\n *\n * _.isArrayLikeObject('abc');\n * // => false\n *\n * _.isArrayLikeObject(_.noop);\n * // => false\n */\nfunction isArrayLikeObject(value) {\n return isObjectLike(value) && isArrayLike(value);\n}\n\nexport default isArrayLikeObject;\n","import copyObject from './_copyObject.js';\nimport keysIn from './keysIn.js';\n\n/**\n * Converts `value` to a plain object flattening inherited enumerable string\n * keyed properties of `value` to own properties of the plain object.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {Object} Returns the converted plain object.\n * @example\n *\n * function Foo() {\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.assign({ 'a': 1 }, new Foo);\n * // => { 'a': 1, 'b': 2 }\n *\n * _.assign({ 'a': 1 }, _.toPlainObject(new Foo));\n * // => { 'a': 1, 'b': 2, 'c': 3 }\n */\nfunction toPlainObject(value) {\n return copyObject(value, keysIn(value));\n}\n\nexport default toPlainObject;\n","import Stack from './_Stack.js';\nimport assignMergeValue from './_assignMergeValue.js';\nimport baseFor from './_baseFor.js';\nimport baseMergeDeep from './_baseMergeDeep.js';\nimport isObject from './isObject.js';\nimport keysIn from './keysIn.js';\nimport safeGet from './_safeGet.js';\n\n/**\n * The base implementation of `_.merge` without support for multiple sources.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @param {number} srcIndex The index of `source`.\n * @param {Function} [customizer] The function to customize merged values.\n * @param {Object} [stack] Tracks traversed source values and their merged\n * counterparts.\n */\nfunction baseMerge(object, source, srcIndex, customizer, stack) {\n if (object === source) {\n return;\n }\n baseFor(source, function(srcValue, key) {\n stack || (stack = new Stack);\n if (isObject(srcValue)) {\n baseMergeDeep(object, source, key, srcIndex, baseMerge, customizer, stack);\n }\n else {\n var newValue = customizer\n ? customizer(safeGet(object, key), srcValue, (key + ''), object, source, stack)\n : undefined;\n\n if (newValue === undefined) {\n newValue = srcValue;\n }\n assignMergeValue(object, key, newValue);\n }\n }, keysIn);\n}\n\nexport default baseMerge;\n","/**\n * This method returns the first argument it receives.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @param {*} value Any value.\n * @returns {*} Returns `value`.\n * @example\n *\n * var object = { 'a': 1 };\n *\n * console.log(_.identity(object) === object);\n * // => true\n */\nfunction identity(value) {\n return value;\n}\n\nexport default identity;\n","import apply from './_apply.js';\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max;\n\n/**\n * A specialized version of `baseRest` which transforms the rest array.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @param {Function} transform The rest array transform.\n * @returns {Function} Returns the new function.\n */\nfunction overRest(func, start, transform) {\n start = nativeMax(start === undefined ? (func.length - 1) : start, 0);\n return function() {\n var args = arguments,\n index = -1,\n length = nativeMax(args.length - start, 0),\n array = Array(length);\n\n while (++index < length) {\n array[index] = args[start + index];\n }\n index = -1;\n var otherArgs = Array(start + 1);\n while (++index < start) {\n otherArgs[index] = args[index];\n }\n otherArgs[start] = transform(array);\n return apply(func, this, otherArgs);\n };\n}\n\nexport default overRest;\n","import constant from './constant.js';\nimport defineProperty from './_defineProperty.js';\nimport identity from './identity.js';\n\n/**\n * The base implementation of `setToString` without support for hot loop shorting.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The `toString` result.\n * @returns {Function} Returns `func`.\n */\nvar baseSetToString = !defineProperty ? identity : function(func, string) {\n return defineProperty(func, 'toString', {\n 'configurable': true,\n 'enumerable': false,\n 'value': constant(string),\n 'writable': true\n });\n};\n\nexport default baseSetToString;\n","/**\n * Creates a function that returns `value`.\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Util\n * @param {*} value The value to return from the new function.\n * @returns {Function} Returns the new constant function.\n * @example\n *\n * var objects = _.times(2, _.constant({ 'a': 1 }));\n *\n * console.log(objects);\n * // => [{ 'a': 1 }, { 'a': 1 }]\n *\n * console.log(objects[0] === objects[1]);\n * // => true\n */\nfunction constant(value) {\n return function() {\n return value;\n };\n}\n\nexport default constant;\n","import baseSetToString from './_baseSetToString.js';\nimport shortOut from './_shortOut.js';\n\n/**\n * Sets the `toString` method of `func` to return `string`.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The `toString` result.\n * @returns {Function} Returns `func`.\n */\nvar setToString = shortOut(baseSetToString);\n\nexport default setToString;\n","import identity from './identity.js';\nimport overRest from './_overRest.js';\nimport setToString from './_setToString.js';\n\n/**\n * The base implementation of `_.rest` which doesn't validate or coerce arguments.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @returns {Function} Returns the new function.\n */\nfunction baseRest(func, start) {\n return setToString(overRest(func, start, identity), func + '');\n}\n\nexport default baseRest;\n","/**\n * A faster alternative to `Function#apply`, this function invokes `func`\n * with the `this` binding of `thisArg` and the arguments of `args`.\n *\n * @private\n * @param {Function} func The function to invoke.\n * @param {*} thisArg The `this` binding of `func`.\n * @param {Array} args The arguments to invoke `func` with.\n * @returns {*} Returns the result of `func`.\n */\nfunction apply(func, thisArg, args) {\n switch (args.length) {\n case 0: return func.call(thisArg);\n case 1: return func.call(thisArg, args[0]);\n case 2: return func.call(thisArg, args[0], args[1]);\n case 3: return func.call(thisArg, args[0], args[1], args[2]);\n }\n return func.apply(thisArg, args);\n}\n\nexport default apply;\n","import baseMerge from './_baseMerge.js';\nimport createAssigner from './_createAssigner.js';\n\n/**\n * This method is like `_.assign` except that it recursively merges own and\n * inherited enumerable string keyed properties of source objects into the\n * destination object. Source properties that resolve to `undefined` are\n * skipped if a destination value exists. Array and plain object properties\n * are merged recursively. Other objects and value types are overridden by\n * assignment. Source objects are applied from left to right. Subsequent\n * sources overwrite property assignments of previous sources.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 0.5.0\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @example\n *\n * var object = {\n * 'a': [{ 'b': 2 }, { 'd': 4 }]\n * };\n *\n * var other = {\n * 'a': [{ 'c': 3 }, { 'e': 5 }]\n * };\n *\n * _.merge(object, other);\n * // => { 'a': [{ 'b': 2, 'c': 3 }, { 'd': 4, 'e': 5 }] }\n */\nvar merge = createAssigner(function(object, source, srcIndex) {\n baseMerge(object, source, srcIndex);\n});\n\nexport default merge;\n","import eq from './eq.js';\nimport isArrayLike from './isArrayLike.js';\nimport isIndex from './_isIndex.js';\nimport isObject from './isObject.js';\n\n/**\n * Checks if the given arguments are from an iteratee call.\n *\n * @private\n * @param {*} value The potential iteratee value argument.\n * @param {*} index The potential iteratee index or key argument.\n * @param {*} object The potential iteratee object argument.\n * @returns {boolean} Returns `true` if the arguments are from an iteratee call,\n * else `false`.\n */\nfunction isIterateeCall(value, index, object) {\n if (!isObject(object)) {\n return false;\n }\n var type = typeof index;\n if (type == 'number'\n ? (isArrayLike(object) && isIndex(index, object.length))\n : (type == 'string' && index in object)\n ) {\n return eq(object[index], value);\n }\n return false;\n}\n\nexport default isIterateeCall;\n","/**\n * This method returns a new empty array.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {Array} Returns the new empty array.\n * @example\n *\n * var arrays = _.times(2, _.stubArray);\n *\n * console.log(arrays);\n * // => [[], []]\n *\n * console.log(arrays[0] === arrays[1]);\n * // => false\n */\nfunction stubArray() {\n return [];\n}\n\nexport default stubArray;\n","enum Scope {\n TYPE = (1 << 2) - 1, // 0011 Lower two bits\n LEVEL = ((1 << 2) - 1) << 2, // 1100 Higher two bits\n\n ATTRIBUTE = (1 << 0) | LEVEL, // 1101\n BLOT = (1 << 1) | LEVEL, // 1110\n INLINE = (1 << 2) | TYPE, // 0111\n BLOCK = (1 << 3) | TYPE, // 1011\n\n BLOCK_BLOT = BLOCK & BLOT, // 1010\n INLINE_BLOT = INLINE & BLOT, // 0110\n BLOCK_ATTRIBUTE = BLOCK & ATTRIBUTE, // 1001\n INLINE_ATTRIBUTE = INLINE & ATTRIBUTE, // 0101\n\n ANY = TYPE | LEVEL,\n}\n\nexport default Scope;\n","import Scope from '../scope.js';\n\nexport interface AttributorOptions {\n scope?: Scope;\n whitelist?: string[];\n}\n\nexport default class Attributor {\n public static keys(node: HTMLElement): string[] {\n return Array.from(node.attributes).map((item: Attr) => item.name);\n }\n\n public scope: Scope;\n public whitelist: string[] | undefined;\n\n constructor(\n public readonly attrName: string,\n public readonly keyName: string,\n options: AttributorOptions = {},\n ) {\n const attributeBit = Scope.TYPE & Scope.ATTRIBUTE;\n this.scope =\n options.scope != null\n ? // Ignore type bits, force attribute bit\n (options.scope & Scope.LEVEL) | attributeBit\n : Scope.ATTRIBUTE;\n if (options.whitelist != null) {\n this.whitelist = options.whitelist;\n }\n }\n\n public add(node: HTMLElement, value: any): boolean {\n if (!this.canAdd(node, value)) {\n return false;\n }\n node.setAttribute(this.keyName, value);\n return true;\n }\n\n public canAdd(_node: HTMLElement, value: any): boolean {\n if (this.whitelist == null) {\n return true;\n }\n if (typeof value === 'string') {\n return this.whitelist.indexOf(value.replace(/[\"']/g, '')) > -1;\n } else {\n return this.whitelist.indexOf(value) > -1;\n }\n }\n\n public remove(node: HTMLElement): void {\n node.removeAttribute(this.keyName);\n }\n\n public value(node: HTMLElement): any {\n const value = node.getAttribute(this.keyName);\n if (this.canAdd(node, value) && value) {\n return value;\n }\n return '';\n }\n}\n","export default class ParchmentError extends Error {\n public message: string;\n public name: string;\n public stack!: string;\n\n constructor(message: string) {\n message = '[Parchment] ' + message;\n super(message);\n this.message = message;\n this.name = this.constructor.name;\n }\n}\n","import Attributor from './attributor/attributor.js';\nimport {\n type Blot,\n type BlotConstructor,\n type Root,\n} from './blot/abstract/blot.js';\nimport ParchmentError from './error.js';\nimport Scope from './scope.js';\n\nexport type RegistryDefinition = Attributor | BlotConstructor;\n\nexport interface RegistryInterface {\n create(scroll: Root, input: Node | string | Scope, value?: any): Blot;\n query(query: string | Node | Scope, scope: Scope): RegistryDefinition | null;\n register(...definitions: any[]): any;\n}\n\nexport default class Registry implements RegistryInterface {\n public static blots = new WeakMap();\n\n public static find(node?: Node | null, bubble = false): Blot | null {\n if (node == null) {\n return null;\n }\n if (this.blots.has(node)) {\n return this.blots.get(node) || null;\n }\n if (bubble) {\n let parentNode: Node | null = null;\n try {\n parentNode = node.parentNode;\n } catch (err) {\n // Probably hit a permission denied error.\n // A known case is in Firefox, event targets can be anonymous DIVs\n // inside an input element.\n // https://bugzilla.mozilla.org/show_bug.cgi?id=208427\n return null;\n }\n return this.find(parentNode, bubble);\n }\n return null;\n }\n\n private attributes: { [key: string]: Attributor } = {};\n private classes: { [key: string]: BlotConstructor } = {};\n private tags: { [key: string]: BlotConstructor } = {};\n private types: { [key: string]: RegistryDefinition } = {};\n\n public create(scroll: Root, input: Node | string | Scope, value?: any): Blot {\n const match = this.query(input);\n if (match == null) {\n throw new ParchmentError(`Unable to create ${input} blot`);\n }\n const blotClass = match as BlotConstructor;\n const node =\n // @ts-expect-error Fix me later\n input instanceof Node || input.nodeType === Node.TEXT_NODE\n ? input\n : blotClass.create(value);\n\n const blot = new blotClass(scroll, node as Node, value);\n Registry.blots.set(blot.domNode, blot);\n return blot;\n }\n\n public find(node: Node | null, bubble = false): Blot | null {\n return Registry.find(node, bubble);\n }\n\n public query(\n query: string | Node | Scope,\n scope: Scope = Scope.ANY,\n ): RegistryDefinition | null {\n let match;\n if (typeof query === 'string') {\n match = this.types[query] || this.attributes[query];\n // @ts-expect-error Fix me later\n } else if (query instanceof Text || query.nodeType === Node.TEXT_NODE) {\n match = this.types.text;\n } else if (typeof query === 'number') {\n if (query & Scope.LEVEL & Scope.BLOCK) {\n match = this.types.block;\n } else if (query & Scope.LEVEL & Scope.INLINE) {\n match = this.types.inline;\n }\n } else if (query instanceof Element) {\n const names = (query.getAttribute('class') || '').split(/\\s+/);\n names.some((name) => {\n match = this.classes[name];\n if (match) {\n return true;\n }\n return false;\n });\n match = match || this.tags[query.tagName];\n }\n if (match == null) {\n return null;\n }\n if (\n 'scope' in match &&\n scope & Scope.LEVEL & match.scope &&\n scope & Scope.TYPE & match.scope\n ) {\n return match;\n }\n return null;\n }\n\n public register(...definitions: RegistryDefinition[]): RegistryDefinition[] {\n return definitions.map((definition) => {\n const isBlot = 'blotName' in definition;\n const isAttr = 'attrName' in definition;\n if (!isBlot && !isAttr) {\n throw new ParchmentError('Invalid definition');\n } else if (isBlot && definition.blotName === 'abstract') {\n throw new ParchmentError('Cannot register abstract class');\n }\n const key = isBlot\n ? definition.blotName\n : isAttr\n ? definition.attrName\n : (undefined as never); // already handled by above checks\n this.types[key] = definition;\n\n if (isAttr) {\n if (typeof definition.keyName === 'string') {\n this.attributes[definition.keyName] = definition;\n }\n } else if (isBlot) {\n if (definition.className) {\n this.classes[definition.className] = definition;\n }\n if (definition.tagName) {\n if (Array.isArray(definition.tagName)) {\n definition.tagName = definition.tagName.map((tagName: string) => {\n return tagName.toUpperCase();\n });\n } else {\n definition.tagName = definition.tagName.toUpperCase();\n }\n const tagNames = Array.isArray(definition.tagName)\n ? definition.tagName\n : [definition.tagName];\n tagNames.forEach((tag: string) => {\n if (this.tags[tag] == null || definition.className == null) {\n this.tags[tag] = definition;\n }\n });\n }\n }\n return definition;\n });\n }\n}\n","import Attributor from './attributor.js';\n\nfunction match(node: HTMLElement, prefix: string): string[] {\n const className = node.getAttribute('class') || '';\n return className\n .split(/\\s+/)\n .filter((name) => name.indexOf(`${prefix}-`) === 0);\n}\n\nclass ClassAttributor extends Attributor {\n public static keys(node: HTMLElement): string[] {\n return (node.getAttribute('class') || '')\n .split(/\\s+/)\n .map((name) => name.split('-').slice(0, -1).join('-'));\n }\n\n public add(node: HTMLElement, value: any): boolean {\n if (!this.canAdd(node, value)) {\n return false;\n }\n this.remove(node);\n node.classList.add(`${this.keyName}-${value}`);\n return true;\n }\n\n public remove(node: HTMLElement): void {\n const matches = match(node, this.keyName);\n matches.forEach((name) => {\n node.classList.remove(name);\n });\n if (node.classList.length === 0) {\n node.removeAttribute('class');\n }\n }\n\n public value(node: HTMLElement): any {\n const result = match(node, this.keyName)[0] || '';\n const value = result.slice(this.keyName.length + 1); // +1 for hyphen\n return this.canAdd(node, value) ? value : '';\n }\n}\n\nexport default ClassAttributor;\n","import Attributor from './attributor.js';\n\nfunction camelize(name: string): string {\n const parts = name.split('-');\n const rest = parts\n .slice(1)\n .map((part: string) => part[0].toUpperCase() + part.slice(1))\n .join('');\n return parts[0] + rest;\n}\n\nclass StyleAttributor extends Attributor {\n public static keys(node: HTMLElement): string[] {\n return (node.getAttribute('style') || '').split(';').map((value) => {\n const arr = value.split(':');\n return arr[0].trim();\n });\n }\n\n public add(node: HTMLElement, value: any): boolean {\n if (!this.canAdd(node, value)) {\n return false;\n }\n // @ts-expect-error Fix me later\n node.style[camelize(this.keyName)] = value;\n return true;\n }\n\n public remove(node: HTMLElement): void {\n // @ts-expect-error Fix me later\n node.style[camelize(this.keyName)] = '';\n if (!node.getAttribute('style')) {\n node.removeAttribute('style');\n }\n }\n\n public value(node: HTMLElement): any {\n // @ts-expect-error Fix me later\n const value = node.style[camelize(this.keyName)];\n return this.canAdd(node, value) ? value : '';\n }\n}\n\nexport default StyleAttributor;\n","import type { Formattable } from '../blot/abstract/blot.js';\nimport Registry from '../registry.js';\nimport Scope from '../scope.js';\nimport Attributor from './attributor.js';\nimport ClassAttributor from './class.js';\nimport StyleAttributor from './style.js';\n\nclass AttributorStore {\n private attributes: { [key: string]: Attributor } = {};\n private domNode: HTMLElement;\n\n constructor(domNode: HTMLElement) {\n this.domNode = domNode;\n this.build();\n }\n\n public attribute(attribute: Attributor, value: any): void {\n // verb\n if (value) {\n if (attribute.add(this.domNode, value)) {\n if (attribute.value(this.domNode) != null) {\n this.attributes[attribute.attrName] = attribute;\n } else {\n delete this.attributes[attribute.attrName];\n }\n }\n } else {\n attribute.remove(this.domNode);\n delete this.attributes[attribute.attrName];\n }\n }\n\n public build(): void {\n this.attributes = {};\n const blot = Registry.find(this.domNode);\n if (blot == null) {\n return;\n }\n const attributes = Attributor.keys(this.domNode);\n const classes = ClassAttributor.keys(this.domNode);\n const styles = StyleAttributor.keys(this.domNode);\n attributes\n .concat(classes)\n .concat(styles)\n .forEach((name) => {\n const attr = blot.scroll.query(name, Scope.ATTRIBUTE);\n if (attr instanceof Attributor) {\n this.attributes[attr.attrName] = attr;\n }\n });\n }\n\n public copy(target: Formattable): void {\n Object.keys(this.attributes).forEach((key) => {\n const value = this.attributes[key].value(this.domNode);\n target.format(key, value);\n });\n }\n\n public move(target: Formattable): void {\n this.copy(target);\n Object.keys(this.attributes).forEach((key) => {\n this.attributes[key].remove(this.domNode);\n });\n this.attributes = {};\n }\n\n public values(): { [key: string]: any } {\n return Object.keys(this.attributes).reduce(\n (attributes: { [key: string]: any }, name: string) => {\n attributes[name] = this.attributes[name].value(this.domNode);\n return attributes;\n },\n {},\n );\n }\n}\n\nexport default AttributorStore;\n","import ParchmentError from '../../error.js';\nimport Registry from '../../registry.js';\nimport Scope from '../../scope.js';\nimport type {\n Blot,\n BlotConstructor,\n Formattable,\n Parent,\n Root,\n} from './blot.js';\n\nclass ShadowBlot implements Blot {\n public static blotName = 'abstract';\n public static className: string;\n public static requiredContainer: BlotConstructor;\n public static scope: Scope;\n public static tagName: string | string[];\n\n public static create(rawValue?: unknown): Node {\n if (this.tagName == null) {\n throw new ParchmentError('Blot definition missing tagName');\n }\n let node: HTMLElement;\n let value: string | number | undefined;\n if (Array.isArray(this.tagName)) {\n if (typeof rawValue === 'string') {\n value = rawValue.toUpperCase();\n if (parseInt(value, 10).toString() === value) {\n value = parseInt(value, 10);\n }\n } else if (typeof rawValue === 'number') {\n value = rawValue;\n }\n if (typeof value === 'number') {\n node = document.createElement(this.tagName[value - 1]);\n } else if (value && this.tagName.indexOf(value) > -1) {\n node = document.createElement(value);\n } else {\n node = document.createElement(this.tagName[0]);\n }\n } else {\n node = document.createElement(this.tagName);\n }\n if (this.className) {\n node.classList.add(this.className);\n }\n return node;\n }\n\n public prev: Blot | null;\n public next: Blot | null;\n // @ts-expect-error Fix me later\n public parent: Parent;\n\n // Hack for accessing inherited static methods\n get statics(): any {\n return this.constructor;\n }\n constructor(\n public scroll: Root,\n public domNode: Node,\n ) {\n Registry.blots.set(domNode, this);\n this.prev = null;\n this.next = null;\n }\n\n public attach(): void {\n // Nothing to do\n }\n\n public clone(): Blot {\n const domNode = this.domNode.cloneNode(false);\n return this.scroll.create(domNode);\n }\n\n public detach(): void {\n if (this.parent != null) {\n this.parent.removeChild(this);\n }\n Registry.blots.delete(this.domNode);\n }\n\n public deleteAt(index: number, length: number): void {\n const blot = this.isolate(index, length);\n blot.remove();\n }\n\n public formatAt(\n index: number,\n length: number,\n name: string,\n value: any,\n ): void {\n const blot = this.isolate(index, length);\n if (this.scroll.query(name, Scope.BLOT) != null && value) {\n blot.wrap(name, value);\n } else if (this.scroll.query(name, Scope.ATTRIBUTE) != null) {\n const parent = this.scroll.create(this.statics.scope) as Parent &\n Formattable;\n blot.wrap(parent);\n parent.format(name, value);\n }\n }\n\n public insertAt(index: number, value: string, def?: any): void {\n const blot =\n def == null\n ? this.scroll.create('text', value)\n : this.scroll.create(value, def);\n const ref = this.split(index);\n this.parent.insertBefore(blot, ref || undefined);\n }\n\n public isolate(index: number, length: number): Blot {\n const target = this.split(index);\n if (target == null) {\n throw new Error('Attempt to isolate at end');\n }\n target.split(length);\n return target;\n }\n\n public length(): number {\n return 1;\n }\n\n public offset(root: Blot = this.parent): number {\n if (this.parent == null || this === root) {\n return 0;\n }\n return this.parent.children.offset(this) + this.parent.offset(root);\n }\n\n public optimize(_context?: { [key: string]: any }): void {\n if (\n this.statics.requiredContainer &&\n !(this.parent instanceof this.statics.requiredContainer)\n ) {\n this.wrap(this.statics.requiredContainer.blotName);\n }\n }\n\n public remove(): void {\n if (this.domNode.parentNode != null) {\n this.domNode.parentNode.removeChild(this.domNode);\n }\n this.detach();\n }\n\n public replaceWith(name: string | Blot, value?: any): Blot {\n const replacement =\n typeof name === 'string' ? this.scroll.create(name, value) : name;\n if (this.parent != null) {\n this.parent.insertBefore(replacement, this.next || undefined);\n this.remove();\n }\n return replacement;\n }\n\n public split(index: number, _force?: boolean): Blot | null {\n return index === 0 ? this : this.next;\n }\n\n public update(\n _mutations: MutationRecord[],\n _context: { [key: string]: any },\n ): void {\n // Nothing to do by default\n }\n\n public wrap(name: string | Parent, value?: any): Parent {\n const wrapper =\n typeof name === 'string'\n ? (this.scroll.create(name, value) as Parent)\n : name;\n if (this.parent != null) {\n this.parent.insertBefore(wrapper, this.next || undefined);\n }\n if (typeof wrapper.appendChild !== 'function') {\n throw new ParchmentError(`Cannot wrap ${name}`);\n }\n wrapper.appendChild(this);\n return wrapper;\n }\n}\n\nexport default ShadowBlot;\n","import Scope from '../../scope.js';\nimport type { Leaf } from './blot.js';\nimport ShadowBlot from './shadow.js';\n\nclass LeafBlot extends ShadowBlot implements Leaf {\n public static scope = Scope.INLINE_BLOT;\n\n /**\n * Returns the value represented by domNode if it is this Blot's type\n * No checking that domNode can represent this Blot type is required so\n * applications needing it should check externally before calling.\n */\n public static value(_domNode: Node): any {\n return true;\n }\n\n /**\n * Given location represented by node and offset from DOM Selection Range,\n * return index to that location.\n */\n public index(node: Node, offset: number): number {\n if (\n this.domNode === node ||\n this.domNode.compareDocumentPosition(node) &\n Node.DOCUMENT_POSITION_CONTAINED_BY\n ) {\n return Math.min(offset, 1);\n }\n return -1;\n }\n\n /**\n * Given index to location within blot, return node and offset representing\n * that location, consumable by DOM Selection Range\n */\n public position(index: number, _inclusive?: boolean): [Node, number] {\n const childNodes: Node[] = Array.from(this.parent.domNode.childNodes);\n let offset = childNodes.indexOf(this.domNode);\n if (index > 0) {\n offset += 1;\n }\n return [this.parent.domNode, offset];\n }\n\n /**\n * Return value represented by this blot\n * Should not change without interaction from API or\n * user change detectable by update()\n */\n public value(): any {\n return {\n [this.statics.blotName]: this.statics.value(this.domNode) || true,\n };\n }\n}\n\nexport default LeafBlot;\n","import type LinkedNode from './linked-node.js';\n\nclass LinkedList {\n public head: T | null;\n public tail: T | null;\n public length: number;\n\n constructor() {\n this.head = null;\n this.tail = null;\n this.length = 0;\n }\n\n public append(...nodes: T[]): void {\n this.insertBefore(nodes[0], null);\n if (nodes.length > 1) {\n const rest = nodes.slice(1);\n this.append(...rest);\n }\n }\n\n public at(index: number): T | null {\n const next = this.iterator();\n let cur = next();\n while (cur && index > 0) {\n index -= 1;\n cur = next();\n }\n return cur;\n }\n\n public contains(node: T): boolean {\n const next = this.iterator();\n let cur = next();\n while (cur) {\n if (cur === node) {\n return true;\n }\n cur = next();\n }\n return false;\n }\n\n public indexOf(node: T): number {\n const next = this.iterator();\n let cur = next();\n let index = 0;\n while (cur) {\n if (cur === node) {\n return index;\n }\n index += 1;\n cur = next();\n }\n return -1;\n }\n\n public insertBefore(node: T | null, refNode: T | null): void {\n if (node == null) {\n return;\n }\n this.remove(node);\n node.next = refNode;\n if (refNode != null) {\n node.prev = refNode.prev;\n if (refNode.prev != null) {\n refNode.prev.next = node;\n }\n refNode.prev = node;\n if (refNode === this.head) {\n this.head = node;\n }\n } else if (this.tail != null) {\n this.tail.next = node;\n node.prev = this.tail;\n this.tail = node;\n } else {\n node.prev = null;\n this.head = this.tail = node;\n }\n this.length += 1;\n }\n\n public offset(target: T): number {\n let index = 0;\n let cur = this.head;\n while (cur != null) {\n if (cur === target) {\n return index;\n }\n index += cur.length();\n cur = cur.next as T;\n }\n return -1;\n }\n\n public remove(node: T): void {\n if (!this.contains(node)) {\n return;\n }\n if (node.prev != null) {\n node.prev.next = node.next;\n }\n if (node.next != null) {\n node.next.prev = node.prev;\n }\n if (node === this.head) {\n this.head = node.next as T;\n }\n if (node === this.tail) {\n this.tail = node.prev as T;\n }\n this.length -= 1;\n }\n\n public iterator(curNode: T | null = this.head): () => T | null {\n // TODO use yield when we can\n return (): T | null => {\n const ret = curNode;\n if (curNode != null) {\n curNode = curNode.next as T;\n }\n return ret;\n };\n }\n\n public find(index: number, inclusive = false): [T | null, number] {\n const next = this.iterator();\n let cur = next();\n while (cur) {\n const length = cur.length();\n if (\n index < length ||\n (inclusive &&\n index === length &&\n (cur.next == null || cur.next.length() !== 0))\n ) {\n return [cur, index];\n }\n index -= length;\n cur = next();\n }\n return [null, 0];\n }\n\n public forEach(callback: (cur: T) => void): void {\n const next = this.iterator();\n let cur = next();\n while (cur) {\n callback(cur);\n cur = next();\n }\n }\n\n public forEachAt(\n index: number,\n length: number,\n callback: (cur: T, offset: number, length: number) => void,\n ): void {\n if (length <= 0) {\n return;\n }\n const [startNode, offset] = this.find(index);\n let curIndex = index - offset;\n const next = this.iterator(startNode);\n let cur = next();\n while (cur && curIndex < index + length) {\n const curLength = cur.length();\n if (index > curIndex) {\n callback(\n cur,\n index - curIndex,\n Math.min(length, curIndex + curLength - index),\n );\n } else {\n callback(cur, 0, Math.min(curLength, index + length - curIndex));\n }\n curIndex += curLength;\n cur = next();\n }\n }\n\n public map(callback: (cur: T) => any): any[] {\n return this.reduce((memo: T[], cur: T) => {\n memo.push(callback(cur));\n return memo;\n }, []);\n }\n\n public reduce(callback: (memo: M, cur: T) => M, memo: M): M {\n const next = this.iterator();\n let cur = next();\n while (cur) {\n memo = callback(memo, cur);\n cur = next();\n }\n return memo;\n }\n}\n\nexport default LinkedList;\n","import LinkedList from '../../collection/linked-list.js';\nimport ParchmentError from '../../error.js';\nimport Scope from '../../scope.js';\nimport type { Blot, BlotConstructor, Parent, Root } from './blot.js';\nimport ShadowBlot from './shadow.js';\n\nfunction makeAttachedBlot(node: Node, scroll: Root): Blot {\n const found = scroll.find(node);\n if (found) return found;\n try {\n return scroll.create(node);\n } catch (e) {\n const blot = scroll.create(Scope.INLINE);\n Array.from(node.childNodes).forEach((child: Node) => {\n blot.domNode.appendChild(child);\n });\n if (node.parentNode) {\n node.parentNode.replaceChild(blot.domNode, node);\n }\n blot.attach();\n return blot;\n }\n}\n\nclass ParentBlot extends ShadowBlot implements Parent {\n /**\n * Whitelist array of Blots that can be direct children.\n */\n public static allowedChildren?: BlotConstructor[];\n\n /**\n * Default child blot to be inserted if this blot becomes empty.\n */\n public static defaultChild?: BlotConstructor;\n public static uiClass = '';\n\n public children!: LinkedList;\n public domNode!: HTMLElement;\n public uiNode: HTMLElement | null = null;\n\n constructor(scroll: Root, domNode: Node) {\n super(scroll, domNode);\n this.build();\n }\n\n public appendChild(other: Blot): void {\n this.insertBefore(other);\n }\n\n public attach(): void {\n super.attach();\n this.children.forEach((child) => {\n child.attach();\n });\n }\n\n public attachUI(node: HTMLElement): void {\n if (this.uiNode != null) {\n this.uiNode.remove();\n }\n this.uiNode = node;\n if (ParentBlot.uiClass) {\n this.uiNode.classList.add(ParentBlot.uiClass);\n }\n this.uiNode.setAttribute('contenteditable', 'false');\n this.domNode.insertBefore(this.uiNode, this.domNode.firstChild);\n }\n\n /**\n * Called during construction, should fill its own children LinkedList.\n */\n public build(): void {\n this.children = new LinkedList();\n // Need to be reversed for if DOM nodes already in order\n Array.from(this.domNode.childNodes)\n .filter((node: Node) => node !== this.uiNode)\n .reverse()\n .forEach((node: Node) => {\n try {\n const child = makeAttachedBlot(node, this.scroll);\n this.insertBefore(child, this.children.head || undefined);\n } catch (err) {\n if (err instanceof ParchmentError) {\n return;\n } else {\n throw err;\n }\n }\n });\n }\n\n public deleteAt(index: number, length: number): void {\n if (index === 0 && length === this.length()) {\n return this.remove();\n }\n this.children.forEachAt(index, length, (child, offset, childLength) => {\n child.deleteAt(offset, childLength);\n });\n }\n\n public descendant(\n criteria: new (...args: any[]) => T,\n index: number,\n ): [T | null, number];\n public descendant(\n criteria: (blot: Blot) => boolean,\n index: number,\n ): [Blot | null, number];\n public descendant(criteria: any, index = 0): [Blot | null, number] {\n const [child, offset] = this.children.find(index);\n if (\n (criteria.blotName == null && criteria(child)) ||\n (criteria.blotName != null && child instanceof criteria)\n ) {\n return [child as any, offset];\n } else if (child instanceof ParentBlot) {\n return child.descendant(criteria, offset);\n } else {\n return [null, -1];\n }\n }\n\n public descendants(\n criteria: new (...args: any[]) => T,\n index?: number,\n length?: number,\n ): T[];\n public descendants(\n criteria: (blot: Blot) => boolean,\n index?: number,\n length?: number,\n ): Blot[];\n public descendants(\n criteria: any,\n index = 0,\n length: number = Number.MAX_VALUE,\n ): Blot[] {\n let descendants: Blot[] = [];\n let lengthLeft = length;\n this.children.forEachAt(\n index,\n length,\n (child: Blot, childIndex: number, childLength: number) => {\n if (\n (criteria.blotName == null && criteria(child)) ||\n (criteria.blotName != null && child instanceof criteria)\n ) {\n descendants.push(child);\n }\n if (child instanceof ParentBlot) {\n descendants = descendants.concat(\n child.descendants(criteria, childIndex, lengthLeft),\n );\n }\n lengthLeft -= childLength;\n },\n );\n return descendants;\n }\n\n public detach(): void {\n this.children.forEach((child) => {\n child.detach();\n });\n super.detach();\n }\n\n public enforceAllowedChildren(): void {\n let done = false;\n this.children.forEach((child: Blot) => {\n if (done) {\n return;\n }\n const allowed = this.statics.allowedChildren.some(\n (def: BlotConstructor) => child instanceof def,\n );\n if (allowed) {\n return;\n }\n if (child.statics.scope === Scope.BLOCK_BLOT) {\n if (child.next != null) {\n this.splitAfter(child);\n }\n if (child.prev != null) {\n this.splitAfter(child.prev);\n }\n child.parent.unwrap();\n done = true;\n } else if (child instanceof ParentBlot) {\n child.unwrap();\n } else {\n child.remove();\n }\n });\n }\n\n public formatAt(\n index: number,\n length: number,\n name: string,\n value: any,\n ): void {\n this.children.forEachAt(index, length, (child, offset, childLength) => {\n child.formatAt(offset, childLength, name, value);\n });\n }\n\n public insertAt(index: number, value: string, def?: any): void {\n const [child, offset] = this.children.find(index);\n if (child) {\n child.insertAt(offset, value, def);\n } else {\n const blot =\n def == null\n ? this.scroll.create('text', value)\n : this.scroll.create(value, def);\n this.appendChild(blot);\n }\n }\n\n public insertBefore(childBlot: Blot, refBlot?: Blot | null): void {\n if (childBlot.parent != null) {\n childBlot.parent.children.remove(childBlot);\n }\n let refDomNode: Node | null = null;\n this.children.insertBefore(childBlot, refBlot || null);\n childBlot.parent = this;\n if (refBlot != null) {\n refDomNode = refBlot.domNode;\n }\n if (\n this.domNode.parentNode !== childBlot.domNode ||\n this.domNode.nextSibling !== refDomNode\n ) {\n this.domNode.insertBefore(childBlot.domNode, refDomNode);\n }\n childBlot.attach();\n }\n\n public length(): number {\n return this.children.reduce((memo, child) => {\n return memo + child.length();\n }, 0);\n }\n\n public moveChildren(targetParent: Parent, refNode?: Blot | null): void {\n this.children.forEach((child) => {\n targetParent.insertBefore(child, refNode);\n });\n }\n\n public optimize(context?: { [key: string]: any }): void {\n super.optimize(context);\n this.enforceAllowedChildren();\n if (this.uiNode != null && this.uiNode !== this.domNode.firstChild) {\n this.domNode.insertBefore(this.uiNode, this.domNode.firstChild);\n }\n if (this.children.length === 0) {\n if (this.statics.defaultChild != null) {\n const child = this.scroll.create(this.statics.defaultChild.blotName);\n this.appendChild(child);\n // TODO double check if necessary\n // child.optimize(context);\n } else {\n this.remove();\n }\n }\n }\n\n public path(index: number, inclusive = false): [Blot, number][] {\n const [child, offset] = this.children.find(index, inclusive);\n const position: [Blot, number][] = [[this, index]];\n if (child instanceof ParentBlot) {\n return position.concat(child.path(offset, inclusive));\n } else if (child != null) {\n position.push([child, offset]);\n }\n return position;\n }\n\n public removeChild(child: Blot): void {\n this.children.remove(child);\n }\n\n public replaceWith(name: string | Blot, value?: any): Blot {\n const replacement =\n typeof name === 'string' ? this.scroll.create(name, value) : name;\n if (replacement instanceof ParentBlot) {\n this.moveChildren(replacement);\n }\n return super.replaceWith(replacement);\n }\n\n public split(index: number, force = false): Blot | null {\n if (!force) {\n if (index === 0) {\n return this;\n }\n if (index === this.length()) {\n return this.next;\n }\n }\n const after = this.clone() as ParentBlot;\n if (this.parent) {\n this.parent.insertBefore(after, this.next || undefined);\n }\n this.children.forEachAt(index, this.length(), (child, offset, _length) => {\n const split = child.split(offset, force);\n if (split != null) {\n after.appendChild(split);\n }\n });\n return after;\n }\n\n public splitAfter(child: Blot): Parent {\n const after = this.clone() as ParentBlot;\n while (child.next != null) {\n after.appendChild(child.next);\n }\n if (this.parent) {\n this.parent.insertBefore(after, this.next || undefined);\n }\n return after;\n }\n\n public unwrap(): void {\n if (this.parent) {\n this.moveChildren(this.parent, this.next || undefined);\n }\n this.remove();\n }\n\n public update(\n mutations: MutationRecord[],\n _context: { [key: string]: any },\n ): void {\n const addedNodes: Node[] = [];\n const removedNodes: Node[] = [];\n mutations.forEach((mutation) => {\n if (mutation.target === this.domNode && mutation.type === 'childList') {\n addedNodes.push(...mutation.addedNodes);\n removedNodes.push(...mutation.removedNodes);\n }\n });\n removedNodes.forEach((node: Node) => {\n // Check node has actually been removed\n // One exception is Chrome does not immediately remove IFRAMEs\n // from DOM but MutationRecord is correct in its reported removal\n if (\n node.parentNode != null &&\n // @ts-expect-error Fix me later\n node.tagName !== 'IFRAME' &&\n document.body.compareDocumentPosition(node) &\n Node.DOCUMENT_POSITION_CONTAINED_BY\n ) {\n return;\n }\n const blot = this.scroll.find(node);\n if (blot == null) {\n return;\n }\n if (\n blot.domNode.parentNode == null ||\n blot.domNode.parentNode === this.domNode\n ) {\n blot.detach();\n }\n });\n addedNodes\n .filter((node) => {\n return node.parentNode === this.domNode && node !== this.uiNode;\n })\n .sort((a, b) => {\n if (a === b) {\n return 0;\n }\n if (a.compareDocumentPosition(b) & Node.DOCUMENT_POSITION_FOLLOWING) {\n return 1;\n }\n return -1;\n })\n .forEach((node) => {\n let refBlot: Blot | null = null;\n if (node.nextSibling != null) {\n refBlot = this.scroll.find(node.nextSibling);\n }\n const blot = makeAttachedBlot(node, this.scroll);\n if (blot.next !== refBlot || blot.next == null) {\n if (blot.parent != null) {\n blot.parent.removeChild(this);\n }\n this.insertBefore(blot, refBlot || undefined);\n }\n });\n this.enforceAllowedChildren();\n }\n}\n\nexport default ParentBlot;\n","import Attributor from '../attributor/attributor.js';\nimport AttributorStore from '../attributor/store.js';\nimport Scope from '../scope.js';\nimport type {\n Blot,\n BlotConstructor,\n Formattable,\n Parent,\n Root,\n} from './abstract/blot.js';\nimport LeafBlot from './abstract/leaf.js';\nimport ParentBlot from './abstract/parent.js';\n\n// Shallow object comparison\nfunction isEqual(\n obj1: Record,\n obj2: Record,\n): boolean {\n if (Object.keys(obj1).length !== Object.keys(obj2).length) {\n return false;\n }\n for (const prop in obj1) {\n if (obj1[prop] !== obj2[prop]) {\n return false;\n }\n }\n return true;\n}\n\nclass InlineBlot extends ParentBlot implements Formattable {\n public static allowedChildren: BlotConstructor[] = [InlineBlot, LeafBlot];\n public static blotName = 'inline';\n public static scope = Scope.INLINE_BLOT;\n public static tagName: string | string[] = 'SPAN';\n\n static create(value?: unknown) {\n return super.create(value) as HTMLElement;\n }\n\n public static formats(domNode: HTMLElement, scroll: Root): any {\n const match = scroll.query(InlineBlot.blotName);\n if (\n match != null &&\n domNode.tagName === (match as BlotConstructor).tagName\n ) {\n return undefined;\n } else if (typeof this.tagName === 'string') {\n return true;\n } else if (Array.isArray(this.tagName)) {\n return domNode.tagName.toLowerCase();\n }\n return undefined;\n }\n\n protected attributes: AttributorStore;\n\n constructor(scroll: Root, domNode: Node) {\n super(scroll, domNode);\n this.attributes = new AttributorStore(this.domNode);\n }\n\n public format(name: string, value: any): void {\n if (name === this.statics.blotName && !value) {\n this.children.forEach((child) => {\n if (!(child instanceof InlineBlot)) {\n child = child.wrap(InlineBlot.blotName, true);\n }\n this.attributes.copy(child as InlineBlot);\n });\n this.unwrap();\n } else {\n const format = this.scroll.query(name, Scope.INLINE);\n if (format == null) {\n return;\n }\n if (format instanceof Attributor) {\n this.attributes.attribute(format, value);\n } else if (\n value &&\n (name !== this.statics.blotName || this.formats()[name] !== value)\n ) {\n this.replaceWith(name, value);\n }\n }\n }\n\n public formats(): { [index: string]: any } {\n const formats = this.attributes.values();\n const format = this.statics.formats(this.domNode, this.scroll);\n if (format != null) {\n formats[this.statics.blotName] = format;\n }\n return formats;\n }\n\n public formatAt(\n index: number,\n length: number,\n name: string,\n value: any,\n ): void {\n if (\n this.formats()[name] != null ||\n this.scroll.query(name, Scope.ATTRIBUTE)\n ) {\n const blot = this.isolate(index, length) as InlineBlot;\n blot.format(name, value);\n } else {\n super.formatAt(index, length, name, value);\n }\n }\n\n public optimize(context: { [key: string]: any }): void {\n super.optimize(context);\n const formats = this.formats();\n if (Object.keys(formats).length === 0) {\n return this.unwrap(); // unformatted span\n }\n const next = this.next;\n if (\n next instanceof InlineBlot &&\n next.prev === this &&\n isEqual(formats, next.formats())\n ) {\n next.moveChildren(this);\n next.remove();\n }\n }\n\n public replaceWith(name: string | Blot, value?: any): Blot {\n const replacement = super.replaceWith(name, value) as InlineBlot;\n this.attributes.copy(replacement);\n return replacement;\n }\n\n public update(\n mutations: MutationRecord[],\n context: { [key: string]: any },\n ): void {\n super.update(mutations, context);\n const attributeChanged = mutations.some(\n (mutation) =>\n mutation.target === this.domNode && mutation.type === 'attributes',\n );\n if (attributeChanged) {\n this.attributes.build();\n }\n }\n\n public wrap(name: string | Parent, value?: any): Parent {\n const wrapper = super.wrap(name, value);\n if (wrapper instanceof InlineBlot) {\n this.attributes.move(wrapper);\n }\n return wrapper;\n }\n}\n\nexport default InlineBlot;\n","import Attributor from '../attributor/attributor.js';\nimport AttributorStore from '../attributor/store.js';\nimport Scope from '../scope.js';\nimport type {\n Blot,\n BlotConstructor,\n Formattable,\n Root,\n} from './abstract/blot.js';\nimport LeafBlot from './abstract/leaf.js';\nimport ParentBlot from './abstract/parent.js';\nimport InlineBlot from './inline.js';\n\nclass BlockBlot extends ParentBlot implements Formattable {\n public static blotName = 'block';\n public static scope = Scope.BLOCK_BLOT;\n public static tagName: string | string[] = 'P';\n public static allowedChildren: BlotConstructor[] = [\n InlineBlot,\n BlockBlot,\n LeafBlot,\n ];\n\n static create(value?: unknown) {\n return super.create(value) as HTMLElement;\n }\n\n public static formats(domNode: HTMLElement, scroll: Root): any {\n const match = scroll.query(BlockBlot.blotName);\n if (\n match != null &&\n domNode.tagName === (match as BlotConstructor).tagName\n ) {\n return undefined;\n } else if (typeof this.tagName === 'string') {\n return true;\n } else if (Array.isArray(this.tagName)) {\n return domNode.tagName.toLowerCase();\n }\n }\n\n protected attributes: AttributorStore;\n\n constructor(scroll: Root, domNode: Node) {\n super(scroll, domNode);\n this.attributes = new AttributorStore(this.domNode);\n }\n\n public format(name: string, value: any): void {\n const format = this.scroll.query(name, Scope.BLOCK);\n if (format == null) {\n return;\n } else if (format instanceof Attributor) {\n this.attributes.attribute(format, value);\n } else if (name === this.statics.blotName && !value) {\n this.replaceWith(BlockBlot.blotName);\n } else if (\n value &&\n (name !== this.statics.blotName || this.formats()[name] !== value)\n ) {\n this.replaceWith(name, value);\n }\n }\n\n public formats(): { [index: string]: any } {\n const formats = this.attributes.values();\n const format = this.statics.formats(this.domNode, this.scroll);\n if (format != null) {\n formats[this.statics.blotName] = format;\n }\n return formats;\n }\n\n public formatAt(\n index: number,\n length: number,\n name: string,\n value: any,\n ): void {\n if (this.scroll.query(name, Scope.BLOCK) != null) {\n this.format(name, value);\n } else {\n super.formatAt(index, length, name, value);\n }\n }\n\n public insertAt(index: number, value: string, def?: any): void {\n if (def == null || this.scroll.query(value, Scope.INLINE) != null) {\n // Insert text or inline\n super.insertAt(index, value, def);\n } else {\n const after = this.split(index);\n if (after != null) {\n const blot = this.scroll.create(value, def);\n after.parent.insertBefore(blot, after);\n } else {\n throw new Error('Attempt to insertAt after block boundaries');\n }\n }\n }\n\n public replaceWith(name: string | Blot, value?: any): Blot {\n const replacement = super.replaceWith(name, value) as BlockBlot;\n this.attributes.copy(replacement);\n return replacement;\n }\n\n public update(\n mutations: MutationRecord[],\n context: { [key: string]: any },\n ): void {\n super.update(mutations, context);\n const attributeChanged = mutations.some(\n (mutation) =>\n mutation.target === this.domNode && mutation.type === 'attributes',\n );\n if (attributeChanged) {\n this.attributes.build();\n }\n }\n}\n\nexport default BlockBlot;\n","import Scope from '../../scope.js';\nimport BlockBlot from '../block.js';\nimport ParentBlot from './parent.js';\n\nclass ContainerBlot extends ParentBlot {\n public static blotName = 'container';\n public static scope = Scope.BLOCK_BLOT;\n public static tagName: string | string[];\n\n public prev!: BlockBlot | ContainerBlot | null;\n public next!: BlockBlot | ContainerBlot | null;\n\n public checkMerge(): boolean {\n return (\n this.next !== null && this.next.statics.blotName === this.statics.blotName\n );\n }\n\n public deleteAt(index: number, length: number): void {\n super.deleteAt(index, length);\n this.enforceAllowedChildren();\n }\n\n public formatAt(\n index: number,\n length: number,\n name: string,\n value: any,\n ): void {\n super.formatAt(index, length, name, value);\n this.enforceAllowedChildren();\n }\n\n public insertAt(index: number, value: string, def?: any): void {\n super.insertAt(index, value, def);\n this.enforceAllowedChildren();\n }\n\n public optimize(context: { [key: string]: any }): void {\n super.optimize(context);\n if (this.children.length > 0 && this.next != null && this.checkMerge()) {\n this.next.moveChildren(this);\n this.next.remove();\n }\n }\n}\n\nexport default ContainerBlot;\n","import type { Formattable, Root } from './abstract/blot.js';\nimport LeafBlot from './abstract/leaf.js';\n\nclass EmbedBlot extends LeafBlot implements Formattable {\n public static formats(_domNode: HTMLElement, _scroll: Root): any {\n return undefined;\n }\n\n public format(name: string, value: any): void {\n // super.formatAt wraps, which is what we want in general,\n // but this allows subclasses to overwrite for formats\n // that just apply to particular embeds\n super.formatAt(0, this.length(), name, value);\n }\n\n public formatAt(\n index: number,\n length: number,\n name: string,\n value: any,\n ): void {\n if (index === 0 && length === this.length()) {\n this.format(name, value);\n } else {\n super.formatAt(index, length, name, value);\n }\n }\n\n public formats(): { [index: string]: any } {\n return this.statics.formats(this.domNode, this.scroll);\n }\n}\n\nexport default EmbedBlot;\n","import Registry, { type RegistryDefinition } from '../registry.js';\nimport Scope from '../scope.js';\nimport type { Blot, BlotConstructor, Root } from './abstract/blot.js';\nimport ContainerBlot from './abstract/container.js';\nimport ParentBlot from './abstract/parent.js';\nimport BlockBlot from './block.js';\n\nconst OBSERVER_CONFIG = {\n attributes: true,\n characterData: true,\n characterDataOldValue: true,\n childList: true,\n subtree: true,\n};\n\nconst MAX_OPTIMIZE_ITERATIONS = 100;\n\nclass ScrollBlot extends ParentBlot implements Root {\n public static blotName = 'scroll';\n public static defaultChild = BlockBlot;\n public static allowedChildren: BlotConstructor[] = [BlockBlot, ContainerBlot];\n public static scope = Scope.BLOCK_BLOT;\n public static tagName = 'DIV';\n\n public observer: MutationObserver;\n\n constructor(\n public registry: Registry,\n node: HTMLDivElement,\n ) {\n // @ts-expect-error scroll is the root with no parent\n super(null, node);\n this.scroll = this;\n this.build();\n this.observer = new MutationObserver((mutations: MutationRecord[]) => {\n this.update(mutations);\n });\n this.observer.observe(this.domNode, OBSERVER_CONFIG);\n this.attach();\n }\n\n public create(input: Node | string | Scope, value?: any): Blot {\n return this.registry.create(this, input, value);\n }\n\n public find(node: Node | null, bubble = false): Blot | null {\n const blot = this.registry.find(node, bubble);\n if (!blot) {\n return null;\n }\n if (blot.scroll === this) {\n return blot;\n }\n return bubble ? this.find(blot.scroll.domNode.parentNode, true) : null;\n }\n\n public query(\n query: string | Node | Scope,\n scope: Scope = Scope.ANY,\n ): RegistryDefinition | null {\n return this.registry.query(query, scope);\n }\n\n public register(...definitions: RegistryDefinition[]) {\n return this.registry.register(...definitions);\n }\n\n public build(): void {\n if (this.scroll == null) {\n return;\n }\n super.build();\n }\n\n public detach(): void {\n super.detach();\n this.observer.disconnect();\n }\n\n public deleteAt(index: number, length: number): void {\n this.update();\n if (index === 0 && length === this.length()) {\n this.children.forEach((child) => {\n child.remove();\n });\n } else {\n super.deleteAt(index, length);\n }\n }\n\n public formatAt(\n index: number,\n length: number,\n name: string,\n value: any,\n ): void {\n this.update();\n super.formatAt(index, length, name, value);\n }\n\n public insertAt(index: number, value: string, def?: any): void {\n this.update();\n super.insertAt(index, value, def);\n }\n\n public optimize(context?: { [key: string]: any }): void;\n public optimize(\n mutations: MutationRecord[],\n context: { [key: string]: any },\n ): void;\n public optimize(mutations: any = [], context: any = {}): void {\n super.optimize(context);\n const mutationsMap = context.mutationsMap || new WeakMap();\n // We must modify mutations directly, cannot make copy and then modify\n let records = Array.from(this.observer.takeRecords());\n // Array.push currently seems to be implemented by a non-tail recursive function\n // so we cannot just mutations.push.apply(mutations, this.observer.takeRecords());\n while (records.length > 0) {\n mutations.push(records.pop());\n }\n const mark = (blot: Blot | null, markParent = true): void => {\n if (blot == null || blot === this) {\n return;\n }\n if (blot.domNode.parentNode == null) {\n return;\n }\n if (!mutationsMap.has(blot.domNode)) {\n mutationsMap.set(blot.domNode, []);\n }\n if (markParent) {\n mark(blot.parent);\n }\n };\n const optimize = (blot: Blot): void => {\n // Post-order traversal\n if (!mutationsMap.has(blot.domNode)) {\n return;\n }\n if (blot instanceof ParentBlot) {\n blot.children.forEach(optimize);\n }\n mutationsMap.delete(blot.domNode);\n blot.optimize(context);\n };\n let remaining = mutations;\n for (let i = 0; remaining.length > 0; i += 1) {\n if (i >= MAX_OPTIMIZE_ITERATIONS) {\n throw new Error('[Parchment] Maximum optimize iterations reached');\n }\n remaining.forEach((mutation: MutationRecord) => {\n const blot = this.find(mutation.target, true);\n if (blot == null) {\n return;\n }\n if (blot.domNode === mutation.target) {\n if (mutation.type === 'childList') {\n mark(this.find(mutation.previousSibling, false));\n Array.from(mutation.addedNodes).forEach((node: Node) => {\n const child = this.find(node, false);\n mark(child, false);\n if (child instanceof ParentBlot) {\n child.children.forEach((grandChild: Blot) => {\n mark(grandChild, false);\n });\n }\n });\n } else if (mutation.type === 'attributes') {\n mark(blot.prev);\n }\n }\n mark(blot);\n });\n this.children.forEach(optimize);\n remaining = Array.from(this.observer.takeRecords());\n records = remaining.slice();\n while (records.length > 0) {\n mutations.push(records.pop());\n }\n }\n }\n\n public update(\n mutations?: MutationRecord[],\n context: { [key: string]: any } = {},\n ): void {\n mutations = mutations || this.observer.takeRecords();\n const mutationsMap = new WeakMap();\n mutations\n .map((mutation: MutationRecord) => {\n const blot = this.find(mutation.target, true);\n if (blot == null) {\n return null;\n }\n if (mutationsMap.has(blot.domNode)) {\n mutationsMap.get(blot.domNode).push(mutation);\n return null;\n } else {\n mutationsMap.set(blot.domNode, [mutation]);\n return blot;\n }\n })\n .forEach((blot: Blot | null) => {\n if (blot != null && blot !== this && mutationsMap.has(blot.domNode)) {\n blot.update(mutationsMap.get(blot.domNode) || [], context);\n }\n });\n context.mutationsMap = mutationsMap;\n if (mutationsMap.has(this.domNode)) {\n super.update(mutationsMap.get(this.domNode), context);\n }\n this.optimize(mutations, context);\n }\n}\n\nexport default ScrollBlot;\n","import Scope from '../scope.js';\nimport type { Blot, Leaf, Root } from './abstract/blot.js';\nimport LeafBlot from './abstract/leaf.js';\n\nclass TextBlot extends LeafBlot implements Leaf {\n public static readonly blotName = 'text';\n public static scope = Scope.INLINE_BLOT;\n\n public static create(value: string): Text {\n return document.createTextNode(value);\n }\n\n public static value(domNode: Text): string {\n return domNode.data;\n }\n\n public domNode!: Text;\n protected text: string;\n\n constructor(scroll: Root, node: Node) {\n super(scroll, node);\n this.text = this.statics.value(this.domNode);\n }\n\n public deleteAt(index: number, length: number): void {\n this.domNode.data = this.text =\n this.text.slice(0, index) + this.text.slice(index + length);\n }\n\n public index(node: Node, offset: number): number {\n if (this.domNode === node) {\n return offset;\n }\n return -1;\n }\n\n public insertAt(index: number, value: string, def?: any): void {\n if (def == null) {\n this.text = this.text.slice(0, index) + value + this.text.slice(index);\n this.domNode.data = this.text;\n } else {\n super.insertAt(index, value, def);\n }\n }\n\n public length(): number {\n return this.text.length;\n }\n\n public optimize(context: { [key: string]: any }): void {\n super.optimize(context);\n this.text = this.statics.value(this.domNode);\n if (this.text.length === 0) {\n this.remove();\n } else if (this.next instanceof TextBlot && this.next.prev === this) {\n this.insertAt(this.length(), (this.next as TextBlot).value());\n this.next.remove();\n }\n }\n\n public position(index: number, _inclusive = false): [Node, number] {\n return [this.domNode, index];\n }\n\n public split(index: number, force = false): Blot | null {\n if (!force) {\n if (index === 0) {\n return this;\n }\n if (index === this.length()) {\n return this.next;\n }\n }\n const after = this.scroll.create(this.domNode.splitText(index));\n this.parent.insertBefore(after, this.next || undefined);\n this.text = this.statics.value(this.domNode);\n return after;\n }\n\n public update(\n mutations: MutationRecord[],\n _context: { [key: string]: any },\n ): void {\n if (\n mutations.some((mutation) => {\n return (\n mutation.type === 'characterData' && mutation.target === this.domNode\n );\n })\n ) {\n this.text = this.statics.value(this.domNode);\n }\n }\n\n public value(): string {\n return this.text;\n }\n}\n\nexport default TextBlot;\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\tloaded: false,\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Flag the module as loaded\n\tmodule.loaded = true;\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = function(module) {\n\tvar getter = module && module.__esModule ?\n\t\tfunction() { return module['default']; } :\n\t\tfunction() { return module; };\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = function(exports, definition) {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }","// define __esModule on exports\n__webpack_require__.r = function(exports) {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.nmd = function(module) {\n\tmodule.paths = [];\n\tif (!module.children) module.children = [];\n\treturn module;\n};","import { ContainerBlot, LeafBlot, Scope, ScrollBlot } from 'parchment';\nimport type { Blot, Parent, EmbedBlot, ParentBlot, Registry } from 'parchment';\nimport Delta, { AttributeMap, Op } from 'quill-delta';\nimport Emitter from '../core/emitter.js';\nimport type { EmitterSource } from '../core/emitter.js';\nimport Block, { BlockEmbed, bubbleFormats } from './block.js';\nimport Break from './break.js';\nimport Container from './container.js';\n\ntype RenderBlock =\n | {\n type: 'blockEmbed';\n attributes: AttributeMap;\n key: string;\n value: unknown;\n }\n | { type: 'block'; attributes: AttributeMap; delta: Delta };\n\nfunction isLine(blot: unknown): blot is Block | BlockEmbed {\n return blot instanceof Block || blot instanceof BlockEmbed;\n}\n\ninterface UpdatableEmbed {\n updateContent(change: unknown): void;\n}\n\nfunction isUpdatable(blot: Blot): blot is Blot & UpdatableEmbed {\n return typeof (blot as unknown as any).updateContent === 'function';\n}\n\nclass Scroll extends ScrollBlot {\n static blotName = 'scroll';\n static className = 'ql-editor';\n static tagName = 'DIV';\n static defaultChild = Block;\n static allowedChildren = [Block, BlockEmbed, Container];\n\n emitter: Emitter;\n batch: false | MutationRecord[];\n\n constructor(\n registry: Registry,\n domNode: HTMLDivElement,\n { emitter }: { emitter: Emitter },\n ) {\n super(registry, domNode);\n this.emitter = emitter;\n this.batch = false;\n this.optimize();\n this.enable();\n this.domNode.addEventListener('dragstart', (e) => this.handleDragStart(e));\n }\n\n batchStart() {\n if (!Array.isArray(this.batch)) {\n this.batch = [];\n }\n }\n\n batchEnd() {\n if (!this.batch) return;\n const mutations = this.batch;\n this.batch = false;\n this.update(mutations);\n }\n\n emitMount(blot: Blot) {\n this.emitter.emit(Emitter.events.SCROLL_BLOT_MOUNT, blot);\n }\n\n emitUnmount(blot: Blot) {\n this.emitter.emit(Emitter.events.SCROLL_BLOT_UNMOUNT, blot);\n }\n\n emitEmbedUpdate(blot: Blot, change: unknown) {\n this.emitter.emit(Emitter.events.SCROLL_EMBED_UPDATE, blot, change);\n }\n\n deleteAt(index: number, length: number) {\n const [first, offset] = this.line(index);\n const [last] = this.line(index + length);\n super.deleteAt(index, length);\n if (last != null && first !== last && offset > 0) {\n if (first instanceof BlockEmbed || last instanceof BlockEmbed) {\n this.optimize();\n return;\n }\n const ref =\n last.children.head instanceof Break ? null : last.children.head;\n // @ts-expect-error\n first.moveChildren(last, ref);\n // @ts-expect-error\n first.remove();\n }\n this.optimize();\n }\n\n enable(enabled = true) {\n this.domNode.setAttribute('contenteditable', enabled ? 'true' : 'false');\n }\n\n formatAt(index: number, length: number, format: string, value: unknown) {\n super.formatAt(index, length, format, value);\n this.optimize();\n }\n\n insertAt(index: number, value: string, def?: unknown) {\n if (index >= this.length()) {\n if (def == null || this.scroll.query(value, Scope.BLOCK) == null) {\n const blot = this.scroll.create(this.statics.defaultChild.blotName);\n this.appendChild(blot);\n if (def == null && value.endsWith('\\n')) {\n blot.insertAt(0, value.slice(0, -1), def);\n } else {\n blot.insertAt(0, value, def);\n }\n } else {\n const embed = this.scroll.create(value, def);\n this.appendChild(embed);\n }\n } else {\n super.insertAt(index, value, def);\n }\n this.optimize();\n }\n\n insertBefore(blot: Blot, ref?: Blot | null) {\n if (blot.statics.scope === Scope.INLINE_BLOT) {\n const wrapper = this.scroll.create(\n this.statics.defaultChild.blotName,\n ) as Parent;\n wrapper.appendChild(blot);\n super.insertBefore(wrapper, ref);\n } else {\n super.insertBefore(blot, ref);\n }\n }\n\n insertContents(index: number, delta: Delta) {\n const renderBlocks = this.deltaToRenderBlocks(\n delta.concat(new Delta().insert('\\n')),\n );\n const last = renderBlocks.pop();\n if (last == null) return;\n\n this.batchStart();\n\n const first = renderBlocks.shift();\n if (first) {\n const shouldInsertNewlineChar =\n first.type === 'block' &&\n (first.delta.length() === 0 ||\n (!this.descendant(BlockEmbed, index)[0] && index < this.length()));\n const delta =\n first.type === 'block'\n ? first.delta\n : new Delta().insert({ [first.key]: first.value });\n insertInlineContents(this, index, delta);\n const newlineCharLength = first.type === 'block' ? 1 : 0;\n const lineEndIndex = index + delta.length() + newlineCharLength;\n if (shouldInsertNewlineChar) {\n this.insertAt(lineEndIndex - 1, '\\n');\n }\n\n const formats = bubbleFormats(this.line(index)[0]);\n const attributes = AttributeMap.diff(formats, first.attributes) || {};\n Object.keys(attributes).forEach((name) => {\n this.formatAt(lineEndIndex - 1, 1, name, attributes[name]);\n });\n\n index = lineEndIndex;\n }\n\n let [refBlot, refBlotOffset] = this.children.find(index);\n if (renderBlocks.length) {\n if (refBlot) {\n refBlot = refBlot.split(refBlotOffset);\n refBlotOffset = 0;\n }\n\n renderBlocks.forEach((renderBlock) => {\n if (renderBlock.type === 'block') {\n const block = this.createBlock(\n renderBlock.attributes,\n refBlot || undefined,\n );\n insertInlineContents(block, 0, renderBlock.delta);\n } else {\n const blockEmbed = this.create(\n renderBlock.key,\n renderBlock.value,\n ) as EmbedBlot;\n this.insertBefore(blockEmbed, refBlot || undefined);\n Object.keys(renderBlock.attributes).forEach((name) => {\n blockEmbed.format(name, renderBlock.attributes[name]);\n });\n }\n });\n }\n\n if (last.type === 'block' && last.delta.length()) {\n const offset = refBlot\n ? refBlot.offset(refBlot.scroll) + refBlotOffset\n : this.length();\n insertInlineContents(this, offset, last.delta);\n }\n\n this.batchEnd();\n this.optimize();\n }\n\n isEnabled() {\n return this.domNode.getAttribute('contenteditable') === 'true';\n }\n\n leaf(index: number): [LeafBlot | null, number] {\n const last = this.path(index).pop();\n if (!last) {\n return [null, -1];\n }\n\n const [blot, offset] = last;\n return blot instanceof LeafBlot ? [blot, offset] : [null, -1];\n }\n\n line(index: number): [Block | BlockEmbed | null, number] {\n if (index === this.length()) {\n return this.line(index - 1);\n }\n // @ts-expect-error TODO: make descendant() generic\n return this.descendant(isLine, index);\n }\n\n lines(index = 0, length = Number.MAX_VALUE): (Block | BlockEmbed)[] {\n const getLines = (\n blot: ParentBlot,\n blotIndex: number,\n blotLength: number,\n ) => {\n let lines: (Block | BlockEmbed)[] = [];\n let lengthLeft = blotLength;\n blot.children.forEachAt(\n blotIndex,\n blotLength,\n (child, childIndex, childLength) => {\n if (isLine(child)) {\n lines.push(child);\n } else if (child instanceof ContainerBlot) {\n lines = lines.concat(getLines(child, childIndex, lengthLeft));\n }\n lengthLeft -= childLength;\n },\n );\n return lines;\n };\n return getLines(this, index, length);\n }\n\n optimize(context?: { [key: string]: any }): void;\n optimize(\n mutations?: MutationRecord[],\n context?: { [key: string]: any },\n ): void;\n optimize(mutations = [], context = {}) {\n if (this.batch) return;\n super.optimize(mutations, context);\n if (mutations.length > 0) {\n this.emitter.emit(Emitter.events.SCROLL_OPTIMIZE, mutations, context);\n }\n }\n\n path(index: number) {\n return super.path(index).slice(1); // Exclude self\n }\n\n remove() {\n // Never remove self\n }\n\n update(source?: EmitterSource): void;\n update(mutations?: MutationRecord[]): void;\n update(mutations?: MutationRecord[] | EmitterSource): void {\n if (this.batch) {\n if (Array.isArray(mutations)) {\n this.batch = this.batch.concat(mutations);\n }\n return;\n }\n let source: EmitterSource = Emitter.sources.USER;\n if (typeof mutations === 'string') {\n source = mutations;\n }\n if (!Array.isArray(mutations)) {\n mutations = this.observer.takeRecords();\n }\n mutations = mutations.filter(({ target }) => {\n const blot = this.find(target, true);\n return blot && !isUpdatable(blot);\n });\n if (mutations.length > 0) {\n this.emitter.emit(Emitter.events.SCROLL_BEFORE_UPDATE, source, mutations);\n }\n super.update(mutations.concat([])); // pass copy\n if (mutations.length > 0) {\n this.emitter.emit(Emitter.events.SCROLL_UPDATE, source, mutations);\n }\n }\n\n updateEmbedAt(index: number, key: string, change: unknown) {\n // Currently it only supports top-level embeds (BlockEmbed).\n // We can update `ParentBlot` in parchment to support inline embeds.\n const [blot] = this.descendant((b: Blot) => b instanceof BlockEmbed, index);\n if (blot && blot.statics.blotName === key && isUpdatable(blot)) {\n blot.updateContent(change);\n }\n }\n\n protected handleDragStart(event: DragEvent) {\n event.preventDefault();\n }\n\n private deltaToRenderBlocks(delta: Delta) {\n const renderBlocks: RenderBlock[] = [];\n\n let currentBlockDelta = new Delta();\n delta.forEach((op) => {\n const insert = op?.insert;\n if (!insert) return;\n if (typeof insert === 'string') {\n const splitted = insert.split('\\n');\n splitted.slice(0, -1).forEach((text) => {\n currentBlockDelta.insert(text, op.attributes);\n renderBlocks.push({\n type: 'block',\n delta: currentBlockDelta,\n attributes: op.attributes ?? {},\n });\n currentBlockDelta = new Delta();\n });\n const last = splitted[splitted.length - 1];\n if (last) {\n currentBlockDelta.insert(last, op.attributes);\n }\n } else {\n const key = Object.keys(insert)[0];\n if (!key) return;\n if (this.query(key, Scope.INLINE)) {\n currentBlockDelta.push(op);\n } else {\n if (currentBlockDelta.length()) {\n renderBlocks.push({\n type: 'block',\n delta: currentBlockDelta,\n attributes: {},\n });\n }\n currentBlockDelta = new Delta();\n renderBlocks.push({\n type: 'blockEmbed',\n key,\n value: insert[key],\n attributes: op.attributes ?? {},\n });\n }\n }\n });\n\n if (currentBlockDelta.length()) {\n renderBlocks.push({\n type: 'block',\n delta: currentBlockDelta,\n attributes: {},\n });\n }\n\n return renderBlocks;\n }\n\n private createBlock(attributes: AttributeMap, refBlot?: Blot) {\n let blotName: string | undefined;\n const formats: AttributeMap = {};\n\n Object.entries(attributes).forEach(([key, value]) => {\n const isBlockBlot = this.query(key, Scope.BLOCK & Scope.BLOT) != null;\n if (isBlockBlot) {\n blotName = key;\n } else {\n formats[key] = value;\n }\n });\n\n const block = this.create(\n blotName || this.statics.defaultChild.blotName,\n blotName ? attributes[blotName] : undefined,\n ) as ParentBlot;\n\n this.insertBefore(block, refBlot || undefined);\n\n const length = block.length();\n Object.entries(formats).forEach(([key, value]) => {\n block.formatAt(0, length, key, value);\n });\n\n return block;\n }\n}\n\nfunction insertInlineContents(\n parent: ParentBlot,\n index: number,\n inlineContents: Delta,\n) {\n inlineContents.reduce((index, op) => {\n const length = Op.length(op);\n let attributes = op.attributes || {};\n if (op.insert != null) {\n if (typeof op.insert === 'string') {\n const text = op.insert;\n parent.insertAt(index, text);\n const [leaf] = parent.descendant(LeafBlot, index);\n const formats = bubbleFormats(leaf);\n attributes = AttributeMap.diff(formats, attributes) || {};\n } else if (typeof op.insert === 'object') {\n const key = Object.keys(op.insert)[0]; // There should only be one key\n if (key == null) return index;\n parent.insertAt(index, key, op.insert[key]);\n const isInlineEmbed = parent.scroll.query(key, Scope.INLINE) != null;\n if (isInlineEmbed) {\n const [leaf] = parent.descendant(LeafBlot, index);\n const formats = bubbleFormats(leaf);\n attributes = AttributeMap.diff(formats, attributes) || {};\n }\n }\n }\n Object.keys(attributes).forEach((key) => {\n parent.formatAt(index, length, key, attributes[key]);\n });\n return index + length;\n }, index);\n}\n\nexport default Scroll;\n","import { Scope } from 'parchment';\nimport type Delta from 'quill-delta';\nimport Module from '../core/module.js';\nimport Quill from '../core/quill.js';\nimport type Scroll from '../blots/scroll.js';\nimport type { Range } from '../core/selection.js';\n\nexport interface HistoryOptions {\n userOnly: boolean;\n delay: number;\n maxStack: number;\n}\n\nexport interface StackItem {\n delta: Delta;\n range: Range | null;\n}\n\ninterface Stack {\n undo: StackItem[];\n redo: StackItem[];\n}\n\nclass History extends Module {\n static DEFAULTS: HistoryOptions = {\n delay: 1000,\n maxStack: 100,\n userOnly: false,\n };\n\n lastRecorded = 0;\n ignoreChange = false;\n stack: Stack = { undo: [], redo: [] };\n currentRange: Range | null = null;\n\n constructor(quill: Quill, options: Partial) {\n super(quill, options);\n this.quill.on(\n Quill.events.EDITOR_CHANGE,\n (eventName, value, oldValue, source) => {\n if (eventName === Quill.events.SELECTION_CHANGE) {\n if (value && source !== Quill.sources.SILENT) {\n this.currentRange = value;\n }\n } else if (eventName === Quill.events.TEXT_CHANGE) {\n if (!this.ignoreChange) {\n if (!this.options.userOnly || source === Quill.sources.USER) {\n this.record(value, oldValue);\n } else {\n this.transform(value);\n }\n }\n\n this.currentRange = transformRange(this.currentRange, value);\n }\n },\n );\n\n this.quill.keyboard.addBinding(\n { key: 'z', shortKey: true },\n this.undo.bind(this),\n );\n this.quill.keyboard.addBinding(\n { key: ['z', 'Z'], shortKey: true, shiftKey: true },\n this.redo.bind(this),\n );\n if (/Win/i.test(navigator.platform)) {\n this.quill.keyboard.addBinding(\n { key: 'y', shortKey: true },\n this.redo.bind(this),\n );\n }\n\n this.quill.root.addEventListener('beforeinput', (event) => {\n if (event.inputType === 'historyUndo') {\n this.undo();\n event.preventDefault();\n } else if (event.inputType === 'historyRedo') {\n this.redo();\n event.preventDefault();\n }\n });\n }\n\n change(source: 'undo' | 'redo', dest: 'redo' | 'undo') {\n if (this.stack[source].length === 0) return;\n const item = this.stack[source].pop();\n if (!item) return;\n const base = this.quill.getContents();\n const inverseDelta = item.delta.invert(base);\n this.stack[dest].push({\n delta: inverseDelta,\n range: transformRange(item.range, inverseDelta),\n });\n this.lastRecorded = 0;\n this.ignoreChange = true;\n this.quill.updateContents(item.delta, Quill.sources.USER);\n this.ignoreChange = false;\n\n this.restoreSelection(item);\n }\n\n clear() {\n this.stack = { undo: [], redo: [] };\n }\n\n cutoff() {\n this.lastRecorded = 0;\n }\n\n record(changeDelta: Delta, oldDelta: Delta) {\n if (changeDelta.ops.length === 0) return;\n this.stack.redo = [];\n let undoDelta = changeDelta.invert(oldDelta);\n let undoRange = this.currentRange;\n const timestamp = Date.now();\n if (\n // @ts-expect-error Fix me later\n this.lastRecorded + this.options.delay > timestamp &&\n this.stack.undo.length > 0\n ) {\n const item = this.stack.undo.pop();\n if (item) {\n undoDelta = undoDelta.compose(item.delta);\n undoRange = item.range;\n }\n } else {\n this.lastRecorded = timestamp;\n }\n if (undoDelta.length() === 0) return;\n this.stack.undo.push({ delta: undoDelta, range: undoRange });\n // @ts-expect-error Fix me later\n if (this.stack.undo.length > this.options.maxStack) {\n this.stack.undo.shift();\n }\n }\n\n redo() {\n this.change('redo', 'undo');\n }\n\n transform(delta: Delta) {\n transformStack(this.stack.undo, delta);\n transformStack(this.stack.redo, delta);\n }\n\n undo() {\n this.change('undo', 'redo');\n }\n\n protected restoreSelection(stackItem: StackItem) {\n if (stackItem.range) {\n this.quill.setSelection(stackItem.range, Quill.sources.USER);\n } else {\n const index = getLastChangeIndex(this.quill.scroll, stackItem.delta);\n this.quill.setSelection(index, Quill.sources.USER);\n }\n }\n}\n\nfunction transformStack(stack: StackItem[], delta: Delta) {\n let remoteDelta = delta;\n for (let i = stack.length - 1; i >= 0; i -= 1) {\n const oldItem = stack[i];\n stack[i] = {\n delta: remoteDelta.transform(oldItem.delta, true),\n range: oldItem.range && transformRange(oldItem.range, remoteDelta),\n };\n remoteDelta = oldItem.delta.transform(remoteDelta);\n if (stack[i].delta.length() === 0) {\n stack.splice(i, 1);\n }\n }\n}\n\nfunction endsWithNewlineChange(scroll: Scroll, delta: Delta) {\n const lastOp = delta.ops[delta.ops.length - 1];\n if (lastOp == null) return false;\n if (lastOp.insert != null) {\n return typeof lastOp.insert === 'string' && lastOp.insert.endsWith('\\n');\n }\n if (lastOp.attributes != null) {\n return Object.keys(lastOp.attributes).some((attr) => {\n return scroll.query(attr, Scope.BLOCK) != null;\n });\n }\n return false;\n}\n\nfunction getLastChangeIndex(scroll: Scroll, delta: Delta) {\n const deleteLength = delta.reduce((length, op) => {\n return length + (op.delete || 0);\n }, 0);\n let changeIndex = delta.length() - deleteLength;\n if (endsWithNewlineChange(scroll, delta)) {\n changeIndex -= 1;\n }\n return changeIndex;\n}\n\nfunction transformRange(range: Range | null, delta: Delta) {\n if (!range) return range;\n const start = delta.transformPosition(range.index);\n const end = delta.transformPosition(range.index + range.length);\n return { index: start, length: end - start };\n}\n\nexport { History as default, getLastChangeIndex };\n","import Delta from 'quill-delta';\nimport type Quill from '../core/quill.js';\nimport Emitter from '../core/emitter.js';\nimport Module from '../core/module.js';\nimport type { Range } from '../core/selection.js';\n\ninterface UploaderOptions {\n mimetypes: string[];\n handler: (this: { quill: Quill }, range: Range, files: File[]) => void;\n}\n\nclass Uploader extends Module {\n static DEFAULTS: UploaderOptions;\n\n constructor(quill: Quill, options: Partial) {\n super(quill, options);\n quill.root.addEventListener('drop', (e) => {\n e.preventDefault();\n let native: ReturnType | null = null;\n if (document.caretRangeFromPoint) {\n native = document.caretRangeFromPoint(e.clientX, e.clientY);\n // @ts-expect-error\n } else if (document.caretPositionFromPoint) {\n // @ts-expect-error\n const position = document.caretPositionFromPoint(e.clientX, e.clientY);\n native = document.createRange();\n native.setStart(position.offsetNode, position.offset);\n native.setEnd(position.offsetNode, position.offset);\n }\n\n const normalized = native && quill.selection.normalizeNative(native);\n if (normalized) {\n const range = quill.selection.normalizedToRange(normalized);\n if (e.dataTransfer?.files) {\n this.upload(range, e.dataTransfer.files);\n }\n }\n });\n }\n\n upload(range: Range, files: FileList | File[]) {\n const uploads: File[] = [];\n Array.from(files).forEach((file) => {\n if (file && this.options.mimetypes?.includes(file.type)) {\n uploads.push(file);\n }\n });\n if (uploads.length > 0) {\n // @ts-expect-error Fix me later\n this.options.handler.call(this, range, uploads);\n }\n }\n}\n\nUploader.DEFAULTS = {\n mimetypes: ['image/png', 'image/jpeg'],\n handler(range: Range, files: File[]) {\n if (!this.quill.scroll.query('image')) {\n return;\n }\n const promises = files.map>((file) => {\n return new Promise((resolve) => {\n const reader = new FileReader();\n reader.onload = () => {\n resolve(reader.result as string);\n };\n reader.readAsDataURL(file);\n });\n });\n Promise.all(promises).then((images) => {\n const update = images.reduce((delta: Delta, image) => {\n return delta.insert({ image });\n }, new Delta().retain(range.index).delete(range.length)) as Delta;\n this.quill.updateContents(update, Emitter.sources.USER);\n this.quill.setSelection(\n range.index + images.length,\n Emitter.sources.SILENT,\n );\n });\n },\n};\n\nexport default Uploader;\n","import Delta from 'quill-delta';\nimport Module from '../core/module.js';\nimport Quill from '../core/quill.js';\nimport type { Range } from '../core/selection.js';\nimport { deleteRange } from './keyboard.js';\n\nconst INSERT_TYPES = ['insertText', 'insertReplacementText'];\n\nclass Input extends Module {\n constructor(quill: Quill, options: Record) {\n super(quill, options);\n\n quill.root.addEventListener('beforeinput', (event) => {\n this.handleBeforeInput(event);\n });\n\n // Gboard with English input on Android triggers `compositionstart` sometimes even\n // users are not going to type anything.\n if (!/Android/i.test(navigator.userAgent)) {\n quill.on(Quill.events.COMPOSITION_BEFORE_START, () => {\n this.handleCompositionStart();\n });\n }\n }\n\n private deleteRange(range: Range) {\n deleteRange({ range, quill: this.quill });\n }\n\n private replaceText(range: Range, text = '') {\n if (range.length === 0) return false;\n\n if (text) {\n // Follow the native behavior that inherits the formats of the first character\n const formats = this.quill.getFormat(range.index, 1);\n this.deleteRange(range);\n this.quill.updateContents(\n new Delta().retain(range.index).insert(text, formats),\n Quill.sources.USER,\n );\n } else {\n this.deleteRange(range);\n }\n\n this.quill.setSelection(range.index + text.length, 0, Quill.sources.SILENT);\n return true;\n }\n\n private handleBeforeInput(event: InputEvent) {\n if (\n this.quill.composition.isComposing ||\n event.defaultPrevented ||\n !INSERT_TYPES.includes(event.inputType)\n ) {\n return;\n }\n\n const staticRange = event.getTargetRanges\n ? event.getTargetRanges()[0]\n : null;\n if (!staticRange || staticRange.collapsed === true) {\n return;\n }\n\n const text = getPlainTextFromInputEvent(event);\n if (text == null) {\n return;\n }\n const normalized = this.quill.selection.normalizeNative(staticRange);\n const range = normalized\n ? this.quill.selection.normalizedToRange(normalized)\n : null;\n if (range && this.replaceText(range, text)) {\n event.preventDefault();\n }\n }\n\n private handleCompositionStart() {\n const range = this.quill.getSelection();\n if (range) {\n this.replaceText(range);\n }\n }\n}\n\nfunction getPlainTextFromInputEvent(event: InputEvent) {\n // When `inputType` is \"insertText\":\n // - `event.data` should be string (Safari uses `event.dataTransfer`).\n // - `event.dataTransfer` should be null.\n // When `inputType` is \"insertReplacementText\":\n // - `event.data` should be null.\n // - `event.dataTransfer` should contain \"text/plain\" data.\n\n if (typeof event.data === 'string') {\n return event.data;\n }\n if (event.dataTransfer?.types.includes('text/plain')) {\n return event.dataTransfer.getData('text/plain');\n }\n return null;\n}\n\nexport default Input;\n","import { ParentBlot } from 'parchment';\nimport Module from '../core/module.js';\nimport Quill from '../core/quill.js';\n\nconst isMac = /Mac/i.test(navigator.platform);\n\n// Export for testing\nexport const TTL_FOR_VALID_SELECTION_CHANGE = 100;\n\n// A loose check to determine if the shortcut can move the caret before a UI node:\n// [CARET]
    [CONTENT]
    \nconst canMoveCaretBeforeUINode = (event: KeyboardEvent) => {\n if (\n event.key === 'ArrowLeft' ||\n event.key === 'ArrowRight' || // RTL scripts or moving from the end of the previous line\n event.key === 'ArrowUp' ||\n event.key === 'ArrowDown' ||\n event.key === 'Home'\n ) {\n return true;\n }\n\n if (isMac && event.key === 'a' && event.ctrlKey === true) {\n return true;\n }\n\n return false;\n};\n\nclass UINode extends Module {\n isListening = false;\n selectionChangeDeadline = 0;\n\n constructor(quill: Quill, options: Record) {\n super(quill, options);\n\n this.handleArrowKeys();\n this.handleNavigationShortcuts();\n }\n\n private handleArrowKeys() {\n this.quill.keyboard.addBinding({\n key: ['ArrowLeft', 'ArrowRight'],\n offset: 0,\n shiftKey: null,\n handler(range, { line, event }) {\n if (!(line instanceof ParentBlot) || !line.uiNode) {\n return true;\n }\n\n const isRTL = getComputedStyle(line.domNode)['direction'] === 'rtl';\n if (\n (isRTL && event.key !== 'ArrowRight') ||\n (!isRTL && event.key !== 'ArrowLeft')\n ) {\n return true;\n }\n\n this.quill.setSelection(\n range.index - 1,\n range.length + (event.shiftKey ? 1 : 0),\n Quill.sources.USER,\n );\n return false;\n },\n });\n }\n\n private handleNavigationShortcuts() {\n this.quill.root.addEventListener('keydown', (event) => {\n if (!event.defaultPrevented && canMoveCaretBeforeUINode(event)) {\n this.ensureListeningToSelectionChange();\n }\n });\n }\n\n /**\n * We only listen to the `selectionchange` event when\n * there is an intention of moving the caret to the beginning using shortcuts.\n * This is primarily implemented to prevent infinite loops, as we are changing\n * the selection within the handler of a `selectionchange` event.\n */\n private ensureListeningToSelectionChange() {\n this.selectionChangeDeadline = Date.now() + TTL_FOR_VALID_SELECTION_CHANGE;\n\n if (this.isListening) return;\n this.isListening = true;\n\n const listener = () => {\n this.isListening = false;\n\n if (Date.now() <= this.selectionChangeDeadline) {\n this.handleSelectionChange();\n }\n };\n\n document.addEventListener('selectionchange', listener, {\n once: true,\n });\n }\n\n private handleSelectionChange() {\n const selection = document.getSelection();\n if (!selection) return;\n const range = selection.getRangeAt(0);\n if (range.collapsed !== true || range.startOffset !== 0) return;\n\n const line = this.quill.scroll.find(range.startContainer);\n if (!(line instanceof ParentBlot) || !line.uiNode) return;\n\n const newRange = document.createRange();\n newRange.setStartAfter(line.uiNode);\n newRange.setEndAfter(line.uiNode);\n selection.removeAllRanges();\n selection.addRange(newRange);\n }\n}\n\nexport default UINode;\n","import Quill, { Parchment, Range } from './core/quill.js';\nimport type {\n Bounds,\n DebugLevel,\n EmitterSource,\n ExpandedQuillOptions,\n QuillOptions,\n} from './core/quill.js';\n\nimport Block, { BlockEmbed } from './blots/block.js';\nimport Break from './blots/break.js';\nimport Container from './blots/container.js';\nimport Cursor from './blots/cursor.js';\nimport Embed from './blots/embed.js';\nimport Inline from './blots/inline.js';\nimport Scroll from './blots/scroll.js';\nimport TextBlot from './blots/text.js';\n\nimport Clipboard from './modules/clipboard.js';\nimport History from './modules/history.js';\nimport Keyboard from './modules/keyboard.js';\nimport Uploader from './modules/uploader.js';\nimport Delta, { Op, OpIterator, AttributeMap } from 'quill-delta';\nimport Input from './modules/input.js';\nimport UINode from './modules/uiNode.js';\n\nexport { default as Module } from './core/module.js';\nexport { Delta, Op, OpIterator, AttributeMap, Parchment, Range };\nexport type {\n Bounds,\n DebugLevel,\n EmitterSource,\n ExpandedQuillOptions,\n QuillOptions,\n};\n\nQuill.register({\n 'blots/block': Block,\n 'blots/block/embed': BlockEmbed,\n 'blots/break': Break,\n 'blots/container': Container,\n 'blots/cursor': Cursor,\n 'blots/embed': Embed,\n 'blots/inline': Inline,\n 'blots/scroll': Scroll,\n 'blots/text': TextBlot,\n\n 'modules/clipboard': Clipboard,\n 'modules/history': History,\n 'modules/keyboard': Keyboard,\n 'modules/uploader': Uploader,\n 'modules/input': Input,\n 'modules/uiNode': UINode,\n});\n\nexport default Quill;\n"],"names":["root","factory","exports","module","define","amd","self","Block","BlockBlot","cache","delta","this","blot","filter","arguments","length","undefined","descendants","LeafBlot","reduce","leaf","insert","value","bubbleFormats","Delta","blockDelta","deleteAt","index","super","formatAt","name","scroll","query","Scope","BLOCK","format","Math","min","insertAt","def","lines","split","text","shift","children","tail","block","lineIndex","line","insertBefore","ref","head","Break","remove","moveChildren","target","optimize","context","path","removeChild","child","force","clone","parent","next","blotName","tagName","defaultChild","allowedChildren","Inline","EmbedBlot","TextBlot","BlockEmbed","attach","attributes","AttributorStore","domNode","formats","values","attribute","BLOCK_ATTRIBUTE","pop","blocks","map","create","forEach","statics","scope","BLOCK_BLOT","prev","Container","ContainerBlot","Cursor","static","constructor","selection","textNode","document","createTextNode","CONTENTS","appendChild","savedLength","detach","offset","node","position","data","restore","composing","range","getNativeRange","lastChild","parentNode","prevTextBlot","prevTextLength","nextTextBlot","nextText","newText","join","mergedTextBlot","newTextNode","remapOffset","start","end","startNode","startOffset","endNode","endOffset","update","mutations","some","mutation","type","isolate","unwrap","GUARD_TEXT","Embed","contentNode","createElement","setAttribute","Array","from","childNodes","childNode","leftGuard","rightGuard","prevLength","InlineBlot","Text","compare","other","selfIndex","order","indexOf","otherIndex","BLOT","wrap","entityMap","escapeText","replace","s","debug","logger","eventName","addEventListener","_len","args","_key","querySelectorAll","quill","instances","get","emitter","handleDOM","EventEmitter","EDITOR_CHANGE","SCROLL_BEFORE_UPDATE","SCROLL_BLOT_MOUNT","SCROLL_BLOT_UNMOUNT","SCROLL_OPTIMIZE","SCROLL_UPDATE","SCROLL_EMBED_UPDATE","SELECTION_CHANGE","TEXT_CHANGE","COMPOSITION_BEFORE_START","COMPOSITION_START","COMPOSITION_BEFORE_END","COMPOSITION_END","API","SILENT","USER","domListeners","on","error","emit","_len2","_key2","log","call","event","_len3","_key3","_ref","handler","contains","listenDOM","push","WeakMap","levels","level","method","console","namespace","ns","bind","newLevel","options","ASCII","convertListHTML","items","lastIndent","types","endTag","getListType","indent","rest","tag","convertHTML","previousType","isRoot","html","slice","replaceAll","ParentBlot","forEachAt","childLength","list","parts","outerHTML","innerHTML","Element","combineFormats","combined","Object","keys","merged","combinedValue","isArray","concat","normalizeDelta","normalizedDelta","op","shiftRange","amount","Range","getDelta","applyDelta","scrollLength","batchStart","deleteDelta","ops","splitOpLines","Op","isImplicitNewlinePrepended","isImplicitNewlineAppended","retain","endsWith","descendant","merge","AttributeMap","diff","key","isInlineEmbed","INLINE","INLINE_BLOT","updateEmbedAt","prependedLength","addedLength","delete","batchEnd","deleteText","formatLine","max","cloneDeep","formatText","getContents","getFormat","leaves","lineFormats","leafFormats","blots","getHTML","lineOffset","lineLength","getText","insertContents","contents","change","insertEmbed","embed","insertText","isBlank","removeFormat","suffixLength","suffix","selectionInfo","oldDelta","match","find","textBlot","oldValue","CursorBlot","oldText","relativeSelectionInfo","oldRange","newRange","compose","isEqual","isComposing","setupListeners","handleCompositionStart","queueMicrotask","handleCompositionEnd","Node","Emitter","events","getElementRect","element","rect","getBoundingClientRect","scaleX","abs","width","offsetWidth","scaleY","height","offsetHeight","top","right","left","clientWidth","bottom","clientHeight","paddingValueToInt","number","parseInt","Number","isNaN","getScrollDistance","targetStart","targetEnd","scrollStart","scrollEnd","scrollPaddingStart","scrollPaddingEnd","CORE_FORMATS","globalRegistry","Parchment","uiClass","Quill","bounds","modules","clipboard","keyboard","history","uploader","placeholder","readOnly","registry","theme","sources","parchment","Module","Theme","limit","bubble","import","imports","register","overwrite","attrName","warn","startsWith","container","containerOrSelector","resolveSelector","Error","DEFAULTS","quillModuleDefaults","quillDefaults","themeModuleDefaults","themeDefaults","userModuleOptions","expandModuleConfig","toolbar","config","omitUndefinedValuesFromOptions","createRegistryWithFormats","sourceRegistry","Registry","coreBlot","iterations","requiredContainer","entries","modulesWithDefaults","_ref2","moduleClass","expandConfig","trim","classList","add","set","addContainer","scrollBlotName","ScrollBlot","editor","Editor","Selection","composition","Composition","addModule","init","toggle","source","lastRange","getRange","modify","convert","setContents","clear","disable","allowReadOnlyEdits","refNode","className","blur","setRange","overload","enable","editReadOnly","modifier","enabled","focus","preventScroll","scrollSelectionIntoView","getSelection","setSelection","getBounds","containerBounds","getLength","getIndex","getLeaf","getLine","getLines","MAX_VALUE","getModule","getSemanticHTML","hasFocus","isEnabled","off","once","scrollRectIntoView","targetRect","ownerDocument","current","isDocumentBody","body","bounding","window","visualViewport","documentElement","style","getComputedStyle","scrollDistanceX","scrollPaddingLeft","scrollPaddingRight","scrollDistanceY","scrollPaddingTop","scrollPaddingBottom","defaultView","scrollBy","scrollLeft","scrollTop","scrolledLeft","scrolledTop","parentElement","getRootNode","host","scrollIntoView","delete1","applied","delete2","setText","updateContents","selector","querySelector","expanded","obj","fromEntries","entry","lengthOrSource","transformPosition","pos","e","mouseDown","cursor","savedRange","lastNative","handleComposition","handleDragging","setTimeout","native","setNativeRange","triggeredByTyping","ignored","nativeRange","collapsed","after","nextLine","createRange","setStart","setEnd","side","rangeCount","getRangeAt","normalizeNative","info","isConnected","normalized","normalizedToRange","activeElement","positions","indexes","startContainer","endContainer","rangeToNative","getPosition","inclusive","leafOffset","removeAllRanges","addRange","default","ModuleClass","whitelist","AlignAttribute","Attributor","AlignStyle","ClassAttributor","StyleAttributor","BackgroundStyle","ColorAttributor","CodeBlockContainer","code","innerText","CodeBlock","Code","component","toString","ColorStyle","DirectionAttribute","DirectionStyle","FontStyleAttributor","FontStyle","SizeStyle","normalWeightRegexp","blockTagNames","isBlockElement","includes","ignoreRegexp","idRegexp","indentRegexp","NORMALIZERS","doc","getAttribute","msoList","others","listItems","parseListItem","idMatch","id","indentMatch","typeRegexp","RegExp","typeMatch","parsed","childListItems","nextElementSibling","ul","listItem","li","replaceChild","normalizeListItem","fragment","createDocumentFragment","append","normalizeFontWeight","br","previousElementSibling","normalizeEmptyLines","CLIPBOARD_CONFIG","TEXT_NODE","isPre","isLine","isBetweenInlineElements","previousSibling","nextSibling","matchNewline","deltaEndsWith","ELEMENT_NODE","prototype","applyFormat","classes","styles","attr","ATTRIBUTE","ATTRIBUTE_ATTRIBUTORS","keyName","STYLE_ATTRIBUTORS","newDelta","_ref4","fontStyle","italic","textDecoration","underline","strike","fontWeight","bold","_ref5","parseFloat","textIndent","composed","checkedAttr","table","createMatchAlias","memo","Clipboard","matchers","onCaptureCopy","onCapturePaste","matcher","addMatcher","normalizeHTML","normalize","normalizeExternalHTML","DOMParser","parseFromString","nodeMatches","elementMatchers","textMatchers","prepareMatching","traverse","dangerouslyPasteHTML","paste","isCut","defaultPrevented","preventDefault","onCopy","clipboardData","setData","deleteRange","normalizeURIList","urlList","url","getData","files","upload","childElementCount","firstElementChild","onPaste","_ref3","pastedDelta","pair","has","matches","endText","i","toLowerCase","preNodes","nodeType","childrenDelta","reducedDelta","_node","HTMLParagraphElement","firstChild","SHORTKEY","test","navigator","platform","Keyboard","evt","binding","which","bindings","addBinding","shiftKey","handleEnter","metaKey","ctrlKey","altKey","userAgent","handleBackspace","handleDelete","prefix","handleDeleteRange","listen","keyBinding","shortKey","singleBinding","keyCode","leafStart","offsetStart","leafEnd","offsetEnd","prefixText","suffixText","curContext","empty","every","curFormats","prevFormats","formatDelta","nextFormats","defaultOptions","makeFormatHandler","outdent","makeCodeBlockHandler","tab","cutoff","header","row","cell","getTable","_table","tableSide","blockquote","numLines","cur","makeEmbedArrowHandler","makeTableArrowHandler","TAB","textContent","up","targetRow","targetCell","targetLine","firstFormats","lastFormats","hasOwnProperty","Events","EE","fn","addListener","TypeError","listener","_events","_eventsCount","clearEvent","__proto__","eventNames","names","getOwnPropertySymbols","listeners","handlers","l","ee","listenerCount","a1","a2","a3","a4","a5","len","removeListener","apply","j","removeAllListeners","prefixed","DIFF_DELETE","DIFF_INSERT","DIFF_EQUAL","diff_main","text1","text2","cursor_pos","cleanup","_fix_unicode","editdiff","oldLength","newLength","oldCursor","oldBefore","oldAfter","maybeNewCursor","newCursor","newBefore","newAfter","prefixLength","oldPrefix","newPrefix","make_edit_splice","oldSuffix","newSuffix","find_cursor_edit_diff","commonlength","diff_commonPrefix","commonprefix","substring","diff_commonSuffix","commonsuffix","diffs","longtext","shorttext","hm","diff_halfMatchI_","best_longtext_a","best_longtext_b","best_shorttext_a","best_shorttext_b","seed","floor","best_common","text1_a","text1_b","text2_a","text2_b","hm1","ceil","hm2","diff_halfMatch_","mid_common","diffs_a","diffs_b","text1_length","text2_length","max_d","v_offset","v_length","v1","v2","x","front","k1start","k1end","k2start","k2end","d","k1","k1_offset","y1","x1","charAt","k2_offset","x2","diff_bisectSplit_","k2","y2","diff_bisect_","diff_compute_","unshift","diff_cleanupMerge","changes","equalities","equalitiesLength","lastequality","pointer","length_insertions1","length_deletions1","length_insertions2","length_deletions2","splice","diff_cleanupSemanticScore_","one","two","char1","char2","nonAlphaNumeric1","nonAlphaNumericRegex_","nonAlphaNumeric2","whitespace1","whitespaceRegex_","whitespace2","lineBreak1","linebreakRegex_","lineBreak2","blankLine1","blanklineEndRegex_","blankLine2","blanklineStartRegex_","equality1","edit","equality2","commonOffset","commonString","bestEquality1","bestEdit","bestEquality2","bestScore","score","diff_cleanupSemanticLossless","deletion","insertion","overlap_length1","diff_commonOverlap_","overlap_length2","diff_cleanupSemantic","y","text1a","text2a","text1b","text2b","diffsb","pointermin","pointermax","pointermid","pointerstart","is_surrogate_pair_start","charCodeAt","text_length","best","pattern","found","pointerend","is_surrogate_pair_end","fix_unicode","count_delete","count_insert","text_delete","text_insert","previous_equality","ends_with_pair_start","stray","k","starts_with_pair_end","n","charCode","str","before","oldMiddle","newMiddle","tuples","ret","remove_empty_tuples","INSERT","DELETE","EQUAL","HASH_UNDEFINED","MAX_SAFE_INTEGER","argsTag","boolTag","dateTag","funcTag","genTag","mapTag","numberTag","objectTag","promiseTag","regexpTag","setTag","stringTag","symbolTag","weakMapTag","arrayBufferTag","dataViewTag","float32Tag","float64Tag","int8Tag","int16Tag","int32Tag","uint8Tag","uint8ClampedTag","uint16Tag","uint32Tag","reFlags","reIsHostCtor","reIsUint","cloneableTags","freeGlobal","g","freeSelf","Function","freeExports","freeModule","moduleExports","addMapEntry","addSetEntry","arrayReduce","array","iteratee","accumulator","initAccum","isHostObject","result","mapToArray","size","overArg","func","transform","arg","setToArray","uid","arrayProto","funcProto","objectProto","coreJsData","maskSrcKey","exec","IE_PROTO","funcToString","objectToString","reIsNative","Buffer","Symbol","Uint8Array","getPrototype","getPrototypeOf","objectCreate","propertyIsEnumerable","nativeGetSymbols","nativeIsBuffer","isBuffer","nativeKeys","DataView","getNative","Map","Promise","Set","nativeCreate","dataViewCtorString","toSource","mapCtorString","promiseCtorString","setCtorString","weakMapCtorString","symbolProto","symbolValueOf","valueOf","Hash","ListCache","MapCache","Stack","__data__","assignValue","object","objValue","eq","assocIndexOf","baseClone","isDeep","isFull","customizer","stack","isObject","isArr","input","initCloneArray","copyArray","getTag","isFunc","buffer","copy","cloneBuffer","isPrototype","proto","initCloneObject","copyObject","getSymbols","copySymbols","baseAssign","cloneFunc","symbol","Ctor","cloneArrayBuffer","dataView","byteOffset","byteLength","cloneDataView","typedArray","cloneTypedArray","cloneMap","regexp","lastIndex","cloneRegExp","cloneSet","initCloneByTag","stacked","props","keysFunc","symbolsFunc","arrayPush","baseGetAllKeys","getAllKeys","arrayEach","subValue","arrayBuffer","newValue","getMapData","getValue","isFunction","baseIsNative","pairs","LARGE_ARRAY_SIZE","isIndex","ArrayBuffer","resolve","ctorString","isArrayLike","isLength","inherited","isObjectLike","isArrayLikeObject","isArguments","baseTimes","String","skipIndexes","arrayLikeKeys","baseKeys","COMPARE_PARTIAL_FLAG","COMPARE_UNORDERED_FLAG","arrayTag","asyncTag","errorTag","nullTag","proxyTag","undefinedTag","typedArrayTags","freeProcess","process","nodeUtil","nodeIsTypedArray","isTypedArray","arraySome","predicate","nativeObjectToString","symToStringTag","toStringTag","SetCache","baseGetTag","isOwn","unmasked","getRawTag","baseIsArguments","baseIsEqual","bitmask","equalFunc","objIsArr","othIsArr","objTag","othTag","objIsObj","othIsObj","isSameTag","equalArrays","message","isPartial","equalByTag","objIsWrapped","othIsWrapped","objUnwrapped","othUnwrapped","objProps","objLength","skipCtor","othValue","compared","objCtor","othCtor","equalObjects","baseIsEqualDeep","arrLength","othLength","seen","arrValue","othIndex","isMasked","resIndex","arrayFilter","baseUnary","isArg","isBuff","isType","a","b","keepNull","attrs","invert","base","baseInverted","priority","OpIterator","NULL_CHARACTER","fromCharCode","getEmbedTypeAndData","embedType","registerEmbed","unregisterEmbed","getHandler","newOp","lastOp","chop","partition","passed","failed","initialValue","changeLength","elem","Infinity","iter","hasNext","nextOp","thisIter","otherIter","firstOther","peek","firstLeft","peekType","peekLength","thisOp","otherOp","action","thisData","otherData","strings","retDelta","diffResult","opLength","eachLine","newline","inverted","baseIndex","baseOp","opData","baseOpData","transformedData","nextType","retOp","substr","allocUnsafe","isNew","defineProperty","global","stubArray","require","keysIn","nodeIsMap","isMap","nodeIsSet","isSet","isFlat","arrStacked","othStacked","objStacked","isProto","count","lastCalled","assigner","iterable","objectCtorString","srcIndex","mergeFunc","srcValue","isCommon","isTyped","baseMerge","nativeMax","string","nativeNow","Date","now","stamp","remaining","otherArgs","thisArg","guard","TYPE","LEVEL","INLINE_ATTRIBUTE","ANY","attributeBit","item","canAdd","removeAttribute","ParchmentError","tags","blotClass","inline","definitions","definition","isBlot","isAttr","toUpperCase","camelize","part","build","move","rawValue","cloneNode","_context","replaceWith","replacement","_force","_mutations","wrapper","ShadowBlot","_domNode","compareDocumentPosition","DOCUMENT_POSITION_CONTAINED_BY","_inclusive","LinkedList","nodes","at","iterator","curNode","callback","curIndex","curLength","makeAttachedBlot","uiNode","attachUI","reverse","err","criteria","lengthLeft","childIndex","enforceAllowedChildren","done","splitAfter","childBlot","refBlot","refDomNode","targetParent","_length","addedNodes","removedNodes","sort","DOCUMENT_POSITION_FOLLOWING","obj1","obj2","prop","checkMerge","_scroll","OBSERVER_CONFIG","characterData","characterDataOldValue","childList","subtree","observer","MutationObserver","observe","disconnect","mutationsMap","records","takeRecords","mark","markParent","grandChild","splitText","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","loaded","__webpack_modules__","getter","__esModule","o","enumerable","globalThis","r","nmd","paths","isUpdatable","updateContent","Scroll","batch","handleDragStart","emitMount","emitUnmount","emitEmbedUpdate","first","last","renderBlocks","deltaToRenderBlocks","shouldInsertNewlineChar","insertInlineContents","newlineCharLength","lineEndIndex","refBlotOffset","renderBlock","createBlock","blockEmbed","blotIndex","blotLength","currentBlockDelta","splitted","inlineContents","History","delay","maxStack","userOnly","lastRecorded","ignoreChange","undo","redo","currentRange","record","transformRange","inputType","dest","inverseDelta","restoreSelection","changeDelta","undoDelta","undoRange","timestamp","transformStack","stackItem","deleteLength","changeIndex","endsWithNewlineChange","getLastChangeIndex","remoteDelta","oldItem","Uploader","caretRangeFromPoint","clientX","clientY","caretPositionFromPoint","offsetNode","dataTransfer","uploads","file","mimetypes","promises","reader","FileReader","onload","readAsDataURL","all","then","images","image","INSERT_TYPES","Input","handleBeforeInput","replaceText","staticRange","getTargetRanges","getPlainTextFromInputEvent","isMac","UINode","isListening","selectionChangeDeadline","handleArrowKeys","handleNavigationShortcuts","isRTL","canMoveCaretBeforeUINode","ensureListeningToSelectionChange","handleSelectionChange","setStartAfter","setEndAfter"],"sourceRoot":""} \ No newline at end of file diff --git a/public/assets/quill/dist/quill.js b/public/assets/quill/dist/quill.js new file mode 100644 index 0000000..aeddaa1 --- /dev/null +++ b/public/assets/quill/dist/quill.js @@ -0,0 +1,3 @@ +/*! For license information please see quill.js.LICENSE.txt */ +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.Quill=e():t.Quill=e()}(self,(function(){return function(){var t={9698:function(t,e,n){"use strict";n.d(e,{Ay:function(){return c},Ji:function(){return d},mG:function(){return h},zo:function(){return u}});var r=n(6003),i=n(5232),s=n.n(i),o=n(3036),l=n(4850),a=n(5508);class c extends r.BlockBlot{cache={};delta(){return null==this.cache.delta&&(this.cache.delta=h(this)),this.cache.delta}deleteAt(t,e){super.deleteAt(t,e),this.cache={}}formatAt(t,e,n,i){e<=0||(this.scroll.query(n,r.Scope.BLOCK)?t+e===this.length()&&this.format(n,i):super.formatAt(t,Math.min(e,this.length()-t-1),n,i),this.cache={})}insertAt(t,e,n){if(null!=n)return super.insertAt(t,e,n),void(this.cache={});if(0===e.length)return;const r=e.split("\n"),i=r.shift();i.length>0&&(t(s=s.split(t,!0),s.insertAt(0,e),e.length)),t+i.length)}insertBefore(t,e){const{head:n}=this.children;super.insertBefore(t,e),n instanceof o.A&&n.remove(),this.cache={}}length(){return null==this.cache.length&&(this.cache.length=super.length()+1),this.cache.length}moveChildren(t,e){super.moveChildren(t,e),this.cache={}}optimize(t){super.optimize(t),this.cache={}}path(t){return super.path(t,!0)}removeChild(t){super.removeChild(t),this.cache={}}split(t){let e=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(e&&(0===t||t>=this.length()-1)){const e=this.clone();return 0===t?(this.parent.insertBefore(e,this),this):(this.parent.insertBefore(e,this.next),e)}const n=super.split(t,e);return this.cache={},n}}c.blotName="block",c.tagName="P",c.defaultChild=o.A,c.allowedChildren=[o.A,l.A,r.EmbedBlot,a.A];class u extends r.EmbedBlot{attach(){super.attach(),this.attributes=new r.AttributorStore(this.domNode)}delta(){return(new(s())).insert(this.value(),{...this.formats(),...this.attributes.values()})}format(t,e){const n=this.scroll.query(t,r.Scope.BLOCK_ATTRIBUTE);null!=n&&this.attributes.attribute(n,e)}formatAt(t,e,n,r){this.format(n,r)}insertAt(t,e,n){if(null!=n)return void super.insertAt(t,e,n);const r=e.split("\n"),i=r.pop(),s=r.map((t=>{const e=this.scroll.create(c.blotName);return e.insertAt(0,t),e})),o=this.split(t);s.forEach((t=>{this.parent.insertBefore(t,o)})),i&&this.parent.insertBefore(this.scroll.create("text",i),o)}}function h(t){let e=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];return t.descendants(r.LeafBlot).reduce(((t,n)=>0===n.length()?t:t.insert(n.value(),d(n,{},e))),new(s())).insert("\n",d(t))}function d(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=!(arguments.length>2&&void 0!==arguments[2])||arguments[2];return null==t?e:("formats"in t&&"function"==typeof t.formats&&(e={...e,...t.formats()},n&&delete e["code-token"]),null==t.parent||"scroll"===t.parent.statics.blotName||t.parent.statics.scope!==t.statics.scope?e:d(t.parent,e,n))}u.scope=r.Scope.BLOCK_BLOT},3036:function(t,e,n){"use strict";var r=n(6003);class i extends r.EmbedBlot{static value(){}optimize(){(this.prev||this.next)&&this.remove()}length(){return 0}value(){return""}}i.blotName="break",i.tagName="BR",e.A=i},580:function(t,e,n){"use strict";var r=n(6003);class i extends r.ContainerBlot{}e.A=i},4541:function(t,e,n){"use strict";var r=n(6003),i=n(5508);class s extends r.EmbedBlot{static blotName="cursor";static className="ql-cursor";static tagName="span";static CONTENTS="\ufeff";static value(){}constructor(t,e,n){super(t,e),this.selection=n,this.textNode=document.createTextNode(s.CONTENTS),this.domNode.appendChild(this.textNode),this.savedLength=0}detach(){null!=this.parent&&this.parent.removeChild(this)}format(t,e){if(0!==this.savedLength)return void super.format(t,e);let n=this,i=0;for(;null!=n&&n.statics.scope!==r.Scope.BLOCK_BLOT;)i+=n.offset(n.parent),n=n.parent;null!=n&&(this.savedLength=s.CONTENTS.length,n.optimize(),n.formatAt(i,s.CONTENTS.length,t,e),this.savedLength=0)}index(t,e){return t===this.textNode?0:super.index(t,e)}length(){return this.savedLength}position(){return[this.textNode,this.textNode.data.length]}remove(){super.remove(),this.parent=null}restore(){if(this.selection.composing||null==this.parent)return null;const t=this.selection.getNativeRange();for(;null!=this.domNode.lastChild&&this.domNode.lastChild!==this.textNode;)this.domNode.parentNode.insertBefore(this.domNode.lastChild,this.domNode);const e=this.prev instanceof i.A?this.prev:null,n=e?e.length():0,r=this.next instanceof i.A?this.next:null,o=r?r.text:"",{textNode:l}=this,a=l.data.split(s.CONTENTS).join("");let c;if(l.data=s.CONTENTS,e)c=e,(a||r)&&(e.insertAt(e.length(),a+o),r&&r.remove());else if(r)c=r,r.insertAt(0,a);else{const t=document.createTextNode(a);c=this.scroll.create(t),this.parent.insertBefore(c,this)}if(this.remove(),t){const i=(t,i)=>e&&t===e.domNode?i:t===l?n+i-1:r&&t===r.domNode?n+a.length+i:null,s=i(t.start.node,t.start.offset),o=i(t.end.node,t.end.offset);if(null!==s&&null!==o)return{startNode:c.domNode,startOffset:s,endNode:c.domNode,endOffset:o}}return null}update(t,e){if(t.some((t=>"characterData"===t.type&&t.target===this.textNode))){const t=this.restore();t&&(e.range=t)}}optimize(t){super.optimize(t);let{parent:e}=this;for(;e;){if("A"===e.domNode.tagName){this.savedLength=s.CONTENTS.length,e.isolate(this.offset(e),this.length()).unwrap(),this.savedLength=0;break}e=e.parent}}value(){return""}}e.A=s},746:function(t,e,n){"use strict";var r=n(6003),i=n(5508);const s="\ufeff";class o extends r.EmbedBlot{constructor(t,e){super(t,e),this.contentNode=document.createElement("span"),this.contentNode.setAttribute("contenteditable","false"),Array.from(this.domNode.childNodes).forEach((t=>{this.contentNode.appendChild(t)})),this.leftGuard=document.createTextNode(s),this.rightGuard=document.createTextNode(s),this.domNode.appendChild(this.leftGuard),this.domNode.appendChild(this.contentNode),this.domNode.appendChild(this.rightGuard)}index(t,e){return t===this.leftGuard?0:t===this.rightGuard?1:super.index(t,e)}restore(t){let e,n=null;const r=t.data.split(s).join("");if(t===this.leftGuard)if(this.prev instanceof i.A){const t=this.prev.length();this.prev.insertAt(t,r),n={startNode:this.prev.domNode,startOffset:t+r.length}}else e=document.createTextNode(r),this.parent.insertBefore(this.scroll.create(e),this),n={startNode:e,startOffset:r.length};else t===this.rightGuard&&(this.next instanceof i.A?(this.next.insertAt(0,r),n={startNode:this.next.domNode,startOffset:r.length}):(e=document.createTextNode(r),this.parent.insertBefore(this.scroll.create(e),this.next),n={startNode:e,startOffset:r.length}));return t.data=s,n}update(t,e){t.forEach((t=>{if("characterData"===t.type&&(t.target===this.leftGuard||t.target===this.rightGuard)){const n=this.restore(t.target);n&&(e.range=n)}}))}}e.A=o},4850:function(t,e,n){"use strict";var r=n(6003),i=n(3036),s=n(5508);class o extends r.InlineBlot{static allowedChildren=[o,i.A,r.EmbedBlot,s.A];static order=["cursor","inline","link","underline","strike","italic","bold","script","code"];static compare(t,e){const n=o.order.indexOf(t),r=o.order.indexOf(e);return n>=0||r>=0?n-r:t===e?0:t0){const t=this.parent.isolate(this.offset(),this.length());this.moveChildren(t),t.wrap(this)}}}e.A=o},5508:function(t,e,n){"use strict";n.d(e,{A:function(){return i},X:function(){return o}});var r=n(6003);class i extends r.TextBlot{}const s={"&":"&","<":"<",">":">",'"':""","'":"'"};function o(t){return t.replace(/[&<>"']/g,(t=>s[t]))}},3729:function(t,e,n){"use strict";n.d(e,{default:function(){return R}});var r=n(6142),i=n(9698),s=n(3036),o=n(580),l=n(4541),a=n(746),c=n(4850),u=n(6003),h=n(5232),d=n.n(h),f=n(5374);function p(t){return t instanceof i.Ay||t instanceof i.zo}function g(t){return"function"==typeof t.updateContent}class m extends u.ScrollBlot{static blotName="scroll";static className="ql-editor";static tagName="DIV";static defaultChild=i.Ay;static allowedChildren=[i.Ay,i.zo,o.A];constructor(t,e,n){let{emitter:r}=n;super(t,e),this.emitter=r,this.batch=!1,this.optimize(),this.enable(),this.domNode.addEventListener("dragstart",(t=>this.handleDragStart(t)))}batchStart(){Array.isArray(this.batch)||(this.batch=[])}batchEnd(){if(!this.batch)return;const t=this.batch;this.batch=!1,this.update(t)}emitMount(t){this.emitter.emit(f.A.events.SCROLL_BLOT_MOUNT,t)}emitUnmount(t){this.emitter.emit(f.A.events.SCROLL_BLOT_UNMOUNT,t)}emitEmbedUpdate(t,e){this.emitter.emit(f.A.events.SCROLL_EMBED_UPDATE,t,e)}deleteAt(t,e){const[n,r]=this.line(t),[o]=this.line(t+e);if(super.deleteAt(t,e),null!=o&&n!==o&&r>0){if(n instanceof i.zo||o instanceof i.zo)return void this.optimize();const t=o.children.head instanceof s.A?null:o.children.head;n.moveChildren(o,t),n.remove()}this.optimize()}enable(){let t=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];this.domNode.setAttribute("contenteditable",t?"true":"false")}formatAt(t,e,n,r){super.formatAt(t,e,n,r),this.optimize()}insertAt(t,e,n){if(t>=this.length())if(null==n||null==this.scroll.query(e,u.Scope.BLOCK)){const t=this.scroll.create(this.statics.defaultChild.blotName);this.appendChild(t),null==n&&e.endsWith("\n")?t.insertAt(0,e.slice(0,-1),n):t.insertAt(0,e,n)}else{const t=this.scroll.create(e,n);this.appendChild(t)}else super.insertAt(t,e,n);this.optimize()}insertBefore(t,e){if(t.statics.scope===u.Scope.INLINE_BLOT){const n=this.scroll.create(this.statics.defaultChild.blotName);n.appendChild(t),super.insertBefore(n,e)}else super.insertBefore(t,e)}insertContents(t,e){const n=this.deltaToRenderBlocks(e.concat((new(d())).insert("\n"))),r=n.pop();if(null==r)return;this.batchStart();const s=n.shift();if(s){const e="block"===s.type&&(0===s.delta.length()||!this.descendant(i.zo,t)[0]&&t{this.formatAt(o-1,1,t,a[t])})),t=o}let[o,l]=this.children.find(t);n.length&&(o&&(o=o.split(l),l=0),n.forEach((t=>{if("block"===t.type)b(this.createBlock(t.attributes,o||void 0),0,t.delta);else{const e=this.create(t.key,t.value);this.insertBefore(e,o||void 0),Object.keys(t.attributes).forEach((n=>{e.format(n,t.attributes[n])}))}}))),"block"===r.type&&r.delta.length()&&b(this,o?o.offset(o.scroll)+l:this.length(),r.delta),this.batchEnd(),this.optimize()}isEnabled(){return"true"===this.domNode.getAttribute("contenteditable")}leaf(t){const e=this.path(t).pop();if(!e)return[null,-1];const[n,r]=e;return n instanceof u.LeafBlot?[n,r]:[null,-1]}line(t){return t===this.length()?this.line(t-1):this.descendant(p,t)}lines(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:Number.MAX_VALUE;const n=(t,e,r)=>{let i=[],s=r;return t.children.forEachAt(e,r,((t,e,r)=>{p(t)?i.push(t):t instanceof u.ContainerBlot&&(i=i.concat(n(t,e,s))),s-=r})),i};return n(this,t,e)}optimize(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};this.batch||(super.optimize(t,e),t.length>0&&this.emitter.emit(f.A.events.SCROLL_OPTIMIZE,t,e))}path(t){return super.path(t).slice(1)}remove(){}update(t){if(this.batch)return void(Array.isArray(t)&&(this.batch=this.batch.concat(t)));let e=f.A.sources.USER;"string"==typeof t&&(e=t),Array.isArray(t)||(t=this.observer.takeRecords()),(t=t.filter((t=>{let{target:e}=t;const n=this.find(e,!0);return n&&!g(n)}))).length>0&&this.emitter.emit(f.A.events.SCROLL_BEFORE_UPDATE,e,t),super.update(t.concat([])),t.length>0&&this.emitter.emit(f.A.events.SCROLL_UPDATE,e,t)}updateEmbedAt(t,e,n){const[r]=this.descendant((t=>t instanceof i.zo),t);r&&r.statics.blotName===e&&g(r)&&r.updateContent(n)}handleDragStart(t){t.preventDefault()}deltaToRenderBlocks(t){const e=[];let n=new(d());return t.forEach((t=>{const r=t?.insert;if(r)if("string"==typeof r){const i=r.split("\n");i.slice(0,-1).forEach((r=>{n.insert(r,t.attributes),e.push({type:"block",delta:n,attributes:t.attributes??{}}),n=new(d())}));const s=i[i.length-1];s&&n.insert(s,t.attributes)}else{const i=Object.keys(r)[0];if(!i)return;this.query(i,u.Scope.INLINE)?n.push(t):(n.length()&&e.push({type:"block",delta:n,attributes:{}}),n=new(d()),e.push({type:"blockEmbed",key:i,value:r[i],attributes:t.attributes??{}}))}})),n.length()&&e.push({type:"block",delta:n,attributes:{}}),e}createBlock(t,e){let n;const r={};Object.entries(t).forEach((t=>{let[e,i]=t;null!=this.query(e,u.Scope.BLOCK&u.Scope.BLOT)?n=e:r[e]=i}));const i=this.create(n||this.statics.defaultChild.blotName,n?t[n]:void 0);this.insertBefore(i,e||void 0);const s=i.length();return Object.entries(r).forEach((t=>{let[e,n]=t;i.formatAt(0,s,e,n)})),i}}function b(t,e,n){n.reduce(((e,n)=>{const r=h.Op.length(n);let s=n.attributes||{};if(null!=n.insert)if("string"==typeof n.insert){const r=n.insert;t.insertAt(e,r);const[o]=t.descendant(u.LeafBlot,e),l=(0,i.Ji)(o);s=h.AttributeMap.diff(l,s)||{}}else if("object"==typeof n.insert){const r=Object.keys(n.insert)[0];if(null==r)return e;if(t.insertAt(e,r,n.insert[r]),null!=t.scroll.query(r,u.Scope.INLINE)){const[n]=t.descendant(u.LeafBlot,e),r=(0,i.Ji)(n);s=h.AttributeMap.diff(r,s)||{}}}return Object.keys(s).forEach((n=>{t.formatAt(e,r,n,s[n])})),e+r}),e)}var y=m,v=n(5508),A=n(584),x=n(4266);class N extends x.A{static DEFAULTS={delay:1e3,maxStack:100,userOnly:!1};lastRecorded=0;ignoreChange=!1;stack={undo:[],redo:[]};currentRange=null;constructor(t,e){super(t,e),this.quill.on(r.Ay.events.EDITOR_CHANGE,((t,e,n,i)=>{t===r.Ay.events.SELECTION_CHANGE?e&&i!==r.Ay.sources.SILENT&&(this.currentRange=e):t===r.Ay.events.TEXT_CHANGE&&(this.ignoreChange||(this.options.userOnly&&i!==r.Ay.sources.USER?this.transform(e):this.record(e,n)),this.currentRange=w(this.currentRange,e))})),this.quill.keyboard.addBinding({key:"z",shortKey:!0},this.undo.bind(this)),this.quill.keyboard.addBinding({key:["z","Z"],shortKey:!0,shiftKey:!0},this.redo.bind(this)),/Win/i.test(navigator.platform)&&this.quill.keyboard.addBinding({key:"y",shortKey:!0},this.redo.bind(this)),this.quill.root.addEventListener("beforeinput",(t=>{"historyUndo"===t.inputType?(this.undo(),t.preventDefault()):"historyRedo"===t.inputType&&(this.redo(),t.preventDefault())}))}change(t,e){if(0===this.stack[t].length)return;const n=this.stack[t].pop();if(!n)return;const i=this.quill.getContents(),s=n.delta.invert(i);this.stack[e].push({delta:s,range:w(n.range,s)}),this.lastRecorded=0,this.ignoreChange=!0,this.quill.updateContents(n.delta,r.Ay.sources.USER),this.ignoreChange=!1,this.restoreSelection(n)}clear(){this.stack={undo:[],redo:[]}}cutoff(){this.lastRecorded=0}record(t,e){if(0===t.ops.length)return;this.stack.redo=[];let n=t.invert(e),r=this.currentRange;const i=Date.now();if(this.lastRecorded+this.options.delay>i&&this.stack.undo.length>0){const t=this.stack.undo.pop();t&&(n=n.compose(t.delta),r=t.range)}else this.lastRecorded=i;0!==n.length()&&(this.stack.undo.push({delta:n,range:r}),this.stack.undo.length>this.options.maxStack&&this.stack.undo.shift())}redo(){this.change("redo","undo")}transform(t){E(this.stack.undo,t),E(this.stack.redo,t)}undo(){this.change("undo","redo")}restoreSelection(t){if(t.range)this.quill.setSelection(t.range,r.Ay.sources.USER);else{const e=function(t,e){const n=e.reduce(((t,e)=>t+(e.delete||0)),0);let r=e.length()-n;return function(t,e){const n=e.ops[e.ops.length-1];return null!=n&&(null!=n.insert?"string"==typeof n.insert&&n.insert.endsWith("\n"):null!=n.attributes&&Object.keys(n.attributes).some((e=>null!=t.query(e,u.Scope.BLOCK))))}(t,e)&&(r-=1),r}(this.quill.scroll,t.delta);this.quill.setSelection(e,r.Ay.sources.USER)}}}function E(t,e){let n=e;for(let e=t.length-1;e>=0;e-=1){const r=t[e];t[e]={delta:n.transform(r.delta,!0),range:r.range&&w(r.range,n)},n=r.delta.transform(n),0===t[e].delta.length()&&t.splice(e,1)}}function w(t,e){if(!t)return t;const n=e.transformPosition(t.index);return{index:n,length:e.transformPosition(t.index+t.length)-n}}var q=n(8123);class k extends x.A{constructor(t,e){super(t,e),t.root.addEventListener("drop",(e=>{e.preventDefault();let n=null;if(document.caretRangeFromPoint)n=document.caretRangeFromPoint(e.clientX,e.clientY);else if(document.caretPositionFromPoint){const t=document.caretPositionFromPoint(e.clientX,e.clientY);n=document.createRange(),n.setStart(t.offsetNode,t.offset),n.setEnd(t.offsetNode,t.offset)}const r=n&&t.selection.normalizeNative(n);if(r){const n=t.selection.normalizedToRange(r);e.dataTransfer?.files&&this.upload(n,e.dataTransfer.files)}}))}upload(t,e){const n=[];Array.from(e).forEach((t=>{t&&this.options.mimetypes?.includes(t.type)&&n.push(t)})),n.length>0&&this.options.handler.call(this,t,n)}}k.DEFAULTS={mimetypes:["image/png","image/jpeg"],handler(t,e){if(!this.quill.scroll.query("image"))return;const n=e.map((t=>new Promise((e=>{const n=new FileReader;n.onload=()=>{e(n.result)},n.readAsDataURL(t)}))));Promise.all(n).then((e=>{const n=e.reduce(((t,e)=>t.insert({image:e})),(new(d())).retain(t.index).delete(t.length));this.quill.updateContents(n,f.A.sources.USER),this.quill.setSelection(t.index+e.length,f.A.sources.SILENT)}))}};var _=k;const L=["insertText","insertReplacementText"];class S extends x.A{constructor(t,e){super(t,e),t.root.addEventListener("beforeinput",(t=>{this.handleBeforeInput(t)})),/Android/i.test(navigator.userAgent)||t.on(r.Ay.events.COMPOSITION_BEFORE_START,(()=>{this.handleCompositionStart()}))}deleteRange(t){(0,q.Xo)({range:t,quill:this.quill})}replaceText(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";if(0===t.length)return!1;if(e){const n=this.quill.getFormat(t.index,1);this.deleteRange(t),this.quill.updateContents((new(d())).retain(t.index).insert(e,n),r.Ay.sources.USER)}else this.deleteRange(t);return this.quill.setSelection(t.index+e.length,0,r.Ay.sources.SILENT),!0}handleBeforeInput(t){if(this.quill.composition.isComposing||t.defaultPrevented||!L.includes(t.inputType))return;const e=t.getTargetRanges?t.getTargetRanges()[0]:null;if(!e||!0===e.collapsed)return;const n=function(t){return"string"==typeof t.data?t.data:t.dataTransfer?.types.includes("text/plain")?t.dataTransfer.getData("text/plain"):null}(t);if(null==n)return;const r=this.quill.selection.normalizeNative(e),i=r?this.quill.selection.normalizedToRange(r):null;i&&this.replaceText(i,n)&&t.preventDefault()}handleCompositionStart(){const t=this.quill.getSelection();t&&this.replaceText(t)}}var O=S;const T=/Mac/i.test(navigator.platform);class j extends x.A{isListening=!1;selectionChangeDeadline=0;constructor(t,e){super(t,e),this.handleArrowKeys(),this.handleNavigationShortcuts()}handleArrowKeys(){this.quill.keyboard.addBinding({key:["ArrowLeft","ArrowRight"],offset:0,shiftKey:null,handler(t,e){let{line:n,event:i}=e;if(!(n instanceof u.ParentBlot&&n.uiNode))return!0;const s="rtl"===getComputedStyle(n.domNode).direction;return!!(s&&"ArrowRight"!==i.key||!s&&"ArrowLeft"!==i.key)||(this.quill.setSelection(t.index-1,t.length+(i.shiftKey?1:0),r.Ay.sources.USER),!1)}})}handleNavigationShortcuts(){this.quill.root.addEventListener("keydown",(t=>{!t.defaultPrevented&&(t=>"ArrowLeft"===t.key||"ArrowRight"===t.key||"ArrowUp"===t.key||"ArrowDown"===t.key||"Home"===t.key||!(!T||"a"!==t.key||!0!==t.ctrlKey))(t)&&this.ensureListeningToSelectionChange()}))}ensureListeningToSelectionChange(){this.selectionChangeDeadline=Date.now()+100,this.isListening||(this.isListening=!0,document.addEventListener("selectionchange",(()=>{this.isListening=!1,Date.now()<=this.selectionChangeDeadline&&this.handleSelectionChange()}),{once:!0}))}handleSelectionChange(){const t=document.getSelection();if(!t)return;const e=t.getRangeAt(0);if(!0!==e.collapsed||0!==e.startOffset)return;const n=this.quill.scroll.find(e.startContainer);if(!(n instanceof u.ParentBlot&&n.uiNode))return;const r=document.createRange();r.setStartAfter(n.uiNode),r.setEndAfter(n.uiNode),t.removeAllRanges(),t.addRange(r)}}var C=j;r.Ay.register({"blots/block":i.Ay,"blots/block/embed":i.zo,"blots/break":s.A,"blots/container":o.A,"blots/cursor":l.A,"blots/embed":a.A,"blots/inline":c.A,"blots/scroll":y,"blots/text":v.A,"modules/clipboard":A.Ay,"modules/history":N,"modules/keyboard":q.Ay,"modules/uploader":_,"modules/input":O,"modules/uiNode":C});var R=r.Ay},5374:function(t,e,n){"use strict";n.d(e,{A:function(){return o}});var r=n(8920),i=n(7356);const s=(0,n(6078).A)("quill:events");["selectionchange","mousedown","mouseup","click"].forEach((t=>{document.addEventListener(t,(function(){for(var t=arguments.length,e=new Array(t),n=0;n{const n=i.A.get(t);n&&n.emitter&&n.emitter.handleDOM(...e)}))}))}));var o=class extends r{static events={EDITOR_CHANGE:"editor-change",SCROLL_BEFORE_UPDATE:"scroll-before-update",SCROLL_BLOT_MOUNT:"scroll-blot-mount",SCROLL_BLOT_UNMOUNT:"scroll-blot-unmount",SCROLL_OPTIMIZE:"scroll-optimize",SCROLL_UPDATE:"scroll-update",SCROLL_EMBED_UPDATE:"scroll-embed-update",SELECTION_CHANGE:"selection-change",TEXT_CHANGE:"text-change",COMPOSITION_BEFORE_START:"composition-before-start",COMPOSITION_START:"composition-start",COMPOSITION_BEFORE_END:"composition-before-end",COMPOSITION_END:"composition-end"};static sources={API:"api",SILENT:"silent",USER:"user"};constructor(){super(),this.domListeners={},this.on("error",s.error)}emit(){for(var t=arguments.length,e=new Array(t),n=0;n1?e-1:0),r=1;r{let{node:r,handler:i}=e;(t.target===r||r.contains(t.target))&&i(t,...n)}))}listenDOM(t,e,n){this.domListeners[t]||(this.domListeners[t]=[]),this.domListeners[t].push({node:e,handler:n})}}},7356:function(t,e){"use strict";e.A=new WeakMap},6078:function(t,e){"use strict";const n=["error","warn","log","info"];let r="warn";function i(t){if(r&&n.indexOf(t)<=n.indexOf(r)){for(var e=arguments.length,i=new Array(e>1?e-1:0),s=1;s(e[n]=i.bind(console,n,t),e)),{})}s.level=t=>{r=t},i.level=s.level,e.A=s},4266:function(t,e){"use strict";e.A=class{static DEFAULTS={};constructor(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};this.quill=t,this.options=e}}},6142:function(t,e,n){"use strict";n.d(e,{Ay:function(){return I}});var r=n(8347),i=n(6003),s=n(5232),o=n.n(s),l=n(3707),a=n(5123),c=n(9698),u=n(3036),h=n(4541),d=n(5508),f=n(8298);const p=/^[ -~]*$/;function g(t,e,n){if(0===t.length){const[t]=y(n.pop());return e<=0?``:`${g([],e-1,n)}`}const[{child:r,offset:i,length:s,indent:o,type:l},...a]=t,[c,u]=y(l);if(o>e)return n.push(l),o===e+1?`<${c}>${m(r,i,s)}${g(a,o,n)}`:`<${c}>
  • ${g(t,e+1,n)}`;const h=n[n.length-1];if(o===e&&l===h)return`
  • ${m(r,i,s)}${g(a,o,n)}`;const[d]=y(n.pop());return`${g(t,e-1,n)}`}function m(t,e,n){let r=arguments.length>3&&void 0!==arguments[3]&&arguments[3];if("html"in t&&"function"==typeof t.html)return t.html(e,n);if(t instanceof d.A)return(0,d.X)(t.value().slice(e,e+n)).replaceAll(" "," ");if(t instanceof i.ParentBlot){if("list-container"===t.statics.blotName){const r=[];return t.children.forEachAt(e,n,((t,e,n)=>{const i="formats"in t&&"function"==typeof t.formats?t.formats():{};r.push({child:t,offset:e,length:n,indent:i.indent||0,type:i.list})})),g(r,-1,[])}const i=[];if(t.children.forEachAt(e,n,((t,e,n)=>{i.push(m(t,e,n))})),r||"list"===t.statics.blotName)return i.join("");const{outerHTML:s,innerHTML:o}=t.domNode,[l,a]=s.split(`>${o}<`);return"${i.join("")}<${a}`:`${l}>${i.join("")}<${a}`}return t.domNode instanceof Element?t.domNode.outerHTML:""}function b(t,e){return Object.keys(e).reduce(((n,r)=>{if(null==t[r])return n;const i=e[r];return i===t[r]?n[r]=i:Array.isArray(i)?i.indexOf(t[r])<0?n[r]=i.concat([t[r]]):n[r]=i:n[r]=[i,t[r]],n}),{})}function y(t){const e="ordered"===t?"ol":"ul";switch(t){case"checked":return[e,' data-list="checked"'];case"unchecked":return[e,' data-list="unchecked"'];default:return[e,""]}}function v(t){return t.reduce(((t,e)=>{if("string"==typeof e.insert){const n=e.insert.replace(/\r\n/g,"\n").replace(/\r/g,"\n");return t.insert(n,e.attributes)}return t.push(e)}),new(o()))}function A(t,e){let{index:n,length:r}=t;return new f.Q(n+e,r)}var x=class{constructor(t){this.scroll=t,this.delta=this.getDelta()}applyDelta(t){this.scroll.update();let e=this.scroll.length();this.scroll.batchStart();const n=v(t),l=new(o());return function(t){const e=[];return t.forEach((t=>{"string"==typeof t.insert?t.insert.split("\n").forEach(((n,r)=>{r&&e.push({insert:"\n",attributes:t.attributes}),n&&e.push({insert:n,attributes:t.attributes})})):e.push(t)})),e}(n.ops.slice()).reduce(((t,n)=>{const o=s.Op.length(n);let a=n.attributes||{},u=!1,h=!1;if(null!=n.insert){if(l.retain(o),"string"==typeof n.insert){const o=n.insert;h=!o.endsWith("\n")&&(e<=t||!!this.scroll.descendant(c.zo,t)[0]),this.scroll.insertAt(t,o);const[l,u]=this.scroll.line(t);let d=(0,r.A)({},(0,c.Ji)(l));if(l instanceof c.Ay){const[t]=l.descendant(i.LeafBlot,u);t&&(d=(0,r.A)(d,(0,c.Ji)(t)))}a=s.AttributeMap.diff(d,a)||{}}else if("object"==typeof n.insert){const o=Object.keys(n.insert)[0];if(null==o)return t;const l=null!=this.scroll.query(o,i.Scope.INLINE);if(l)(e<=t||this.scroll.descendant(c.zo,t)[0])&&(h=!0);else if(t>0){const[e,n]=this.scroll.descendant(i.LeafBlot,t-1);e instanceof d.A?"\n"!==e.value()[n]&&(u=!0):e instanceof i.EmbedBlot&&e.statics.scope===i.Scope.INLINE_BLOT&&(u=!0)}if(this.scroll.insertAt(t,o,n.insert[o]),l){const[e]=this.scroll.descendant(i.LeafBlot,t);if(e){const t=(0,r.A)({},(0,c.Ji)(e));a=s.AttributeMap.diff(t,a)||{}}}}e+=o}else if(l.push(n),null!==n.retain&&"object"==typeof n.retain){const e=Object.keys(n.retain)[0];if(null==e)return t;this.scroll.updateEmbedAt(t,e,n.retain[e])}Object.keys(a).forEach((e=>{this.scroll.formatAt(t,o,e,a[e])}));const f=u?1:0,p=h?1:0;return e+=f+p,l.retain(f),l.delete(p),t+o+f+p}),0),l.reduce(((t,e)=>"number"==typeof e.delete?(this.scroll.deleteAt(t,e.delete),t):t+s.Op.length(e)),0),this.scroll.batchEnd(),this.scroll.optimize(),this.update(n)}deleteText(t,e){return this.scroll.deleteAt(t,e),this.update((new(o())).retain(t).delete(e))}formatLine(t,e){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};this.scroll.update(),Object.keys(n).forEach((r=>{this.scroll.lines(t,Math.max(e,1)).forEach((t=>{t.format(r,n[r])}))})),this.scroll.optimize();const r=(new(o())).retain(t).retain(e,(0,l.A)(n));return this.update(r)}formatText(t,e){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};Object.keys(n).forEach((r=>{this.scroll.formatAt(t,e,r,n[r])}));const r=(new(o())).retain(t).retain(e,(0,l.A)(n));return this.update(r)}getContents(t,e){return this.delta.slice(t,t+e)}getDelta(){return this.scroll.lines().reduce(((t,e)=>t.concat(e.delta())),new(o()))}getFormat(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=[],r=[];0===e?this.scroll.path(t).forEach((t=>{const[e]=t;e instanceof c.Ay?n.push(e):e instanceof i.LeafBlot&&r.push(e)})):(n=this.scroll.lines(t,e),r=this.scroll.descendants(i.LeafBlot,t,e));const[s,o]=[n,r].map((t=>{const e=t.shift();if(null==e)return{};let n=(0,c.Ji)(e);for(;Object.keys(n).length>0;){const e=t.shift();if(null==e)return n;n=b((0,c.Ji)(e),n)}return n}));return{...s,...o}}getHTML(t,e){const[n,r]=this.scroll.line(t);if(n){const i=n.length();return n.length()>=r+e&&(0!==r||e!==i)?m(n,r,e,!0):m(this.scroll,t,e,!0)}return""}getText(t,e){return this.getContents(t,e).filter((t=>"string"==typeof t.insert)).map((t=>t.insert)).join("")}insertContents(t,e){const n=v(e),r=(new(o())).retain(t).concat(n);return this.scroll.insertContents(t,n),this.update(r)}insertEmbed(t,e,n){return this.scroll.insertAt(t,e,n),this.update((new(o())).retain(t).insert({[e]:n}))}insertText(t,e){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return e=e.replace(/\r\n/g,"\n").replace(/\r/g,"\n"),this.scroll.insertAt(t,e),Object.keys(n).forEach((r=>{this.scroll.formatAt(t,e.length,r,n[r])})),this.update((new(o())).retain(t).insert(e,(0,l.A)(n)))}isBlank(){if(0===this.scroll.children.length)return!0;if(this.scroll.children.length>1)return!1;const t=this.scroll.children.head;if(t?.statics.blotName!==c.Ay.blotName)return!1;const e=t;return!(e.children.length>1)&&e.children.head instanceof u.A}removeFormat(t,e){const n=this.getText(t,e),[r,i]=this.scroll.line(t+e);let s=0,l=new(o());null!=r&&(s=r.length()-i,l=r.delta().slice(i,i+s-1).insert("\n"));const a=this.getContents(t,e+s).diff((new(o())).insert(n).concat(l)),c=(new(o())).retain(t).concat(a);return this.applyDelta(c)}update(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:void 0;const r=this.delta;if(1===e.length&&"characterData"===e[0].type&&e[0].target.data.match(p)&&this.scroll.find(e[0].target)){const i=this.scroll.find(e[0].target),s=(0,c.Ji)(i),l=i.offset(this.scroll),a=e[0].oldValue.replace(h.A.CONTENTS,""),u=(new(o())).insert(a),d=(new(o())).insert(i.value()),f=n&&{oldRange:A(n.oldRange,-l),newRange:A(n.newRange,-l)};t=(new(o())).retain(l).concat(u.diff(d,f)).reduce(((t,e)=>e.insert?t.insert(e.insert,s):t.push(e)),new(o())),this.delta=r.compose(t)}else this.delta=this.getDelta(),t&&(0,a.A)(r.compose(t),this.delta)||(t=r.diff(this.delta,n));return t}},N=n(5374),E=n(7356),w=n(6078),q=n(4266),k=n(746),_=class{isComposing=!1;constructor(t,e){this.scroll=t,this.emitter=e,this.setupListeners()}setupListeners(){this.scroll.domNode.addEventListener("compositionstart",(t=>{this.isComposing||this.handleCompositionStart(t)})),this.scroll.domNode.addEventListener("compositionend",(t=>{this.isComposing&&queueMicrotask((()=>{this.handleCompositionEnd(t)}))}))}handleCompositionStart(t){const e=t.target instanceof Node?this.scroll.find(t.target,!0):null;!e||e instanceof k.A||(this.emitter.emit(N.A.events.COMPOSITION_BEFORE_START,t),this.scroll.batchStart(),this.emitter.emit(N.A.events.COMPOSITION_START,t),this.isComposing=!0)}handleCompositionEnd(t){this.emitter.emit(N.A.events.COMPOSITION_BEFORE_END,t),this.scroll.batchEnd(),this.emitter.emit(N.A.events.COMPOSITION_END,t),this.isComposing=!1}},L=n(9609);const S=t=>{const e=t.getBoundingClientRect(),n="offsetWidth"in t&&Math.abs(e.width)/t.offsetWidth||1,r="offsetHeight"in t&&Math.abs(e.height)/t.offsetHeight||1;return{top:e.top,right:e.left+t.clientWidth*n,bottom:e.top+t.clientHeight*r,left:e.left}},O=t=>{const e=parseInt(t,10);return Number.isNaN(e)?0:e},T=(t,e,n,r,i,s)=>tr?0:tr?e-t>r-n?t+i-n:e-r+s:0;const j=["block","break","cursor","inline","scroll","text"];const C=(0,w.A)("quill"),R=new i.Registry;i.ParentBlot.uiClass="ql-ui";class I{static DEFAULTS={bounds:null,modules:{clipboard:!0,keyboard:!0,history:!0,uploader:!0},placeholder:"",readOnly:!1,registry:R,theme:"default"};static events=N.A.events;static sources=N.A.sources;static version="2.0.3";static imports={delta:o(),parchment:i,"core/module":q.A,"core/theme":L.A};static debug(t){!0===t&&(t="log"),w.A.level(t)}static find(t){let e=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return E.A.get(t)||R.find(t,e)}static import(t){return null==this.imports[t]&&C.error(`Cannot import ${t}. Are you sure it was registered?`),this.imports[t]}static register(){if("string"!=typeof(arguments.length<=0?void 0:arguments[0])){const t=arguments.length<=0?void 0:arguments[0],e=!!(arguments.length<=1?void 0:arguments[1]),n="attrName"in t?t.attrName:t.blotName;"string"==typeof n?this.register(`formats/${n}`,t,e):Object.keys(t).forEach((n=>{this.register(n,t[n],e)}))}else{const t=arguments.length<=0?void 0:arguments[0],e=arguments.length<=1?void 0:arguments[1],n=!!(arguments.length<=2?void 0:arguments[2]);null==this.imports[t]||n||C.warn(`Overwriting ${t} with`,e),this.imports[t]=e,(t.startsWith("blots/")||t.startsWith("formats/"))&&e&&"boolean"!=typeof e&&"abstract"!==e.blotName&&R.register(e),"function"==typeof e.register&&e.register(R)}}constructor(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(this.options=function(t,e){const n=B(t);if(!n)throw new Error("Invalid Quill container");const s=!e.theme||e.theme===I.DEFAULTS.theme?L.A:I.import(`themes/${e.theme}`);if(!s)throw new Error(`Invalid theme ${e.theme}. Did you register it?`);const{modules:o,...l}=I.DEFAULTS,{modules:a,...c}=s.DEFAULTS;let u=M(e.modules);null!=u&&u.toolbar&&u.toolbar.constructor!==Object&&(u={...u,toolbar:{container:u.toolbar}});const h=(0,r.A)({},M(o),M(a),u),d={...l,...U(c),...U(e)};let f=e.registry;return f?e.formats&&C.warn('Ignoring "formats" option because "registry" is specified'):f=e.formats?((t,e,n)=>{const r=new i.Registry;return j.forEach((t=>{const n=e.query(t);n&&r.register(n)})),t.forEach((t=>{let i=e.query(t);i||n.error(`Cannot register "${t}" specified in "formats" config. Are you sure it was registered?`);let s=0;for(;i;)if(r.register(i),i="blotName"in i?i.requiredContainer??null:null,s+=1,s>100){n.error(`Cycle detected in registering blot requiredContainer: "${t}"`);break}})),r})(e.formats,d.registry,C):d.registry,{...d,registry:f,container:n,theme:s,modules:Object.entries(h).reduce(((t,e)=>{let[n,i]=e;if(!i)return t;const s=I.import(`modules/${n}`);return null==s?(C.error(`Cannot load ${n} module. Are you sure you registered it?`),t):{...t,[n]:(0,r.A)({},s.DEFAULTS||{},i)}}),{}),bounds:B(d.bounds)}}(t,e),this.container=this.options.container,null==this.container)return void C.error("Invalid Quill container",t);this.options.debug&&I.debug(this.options.debug);const n=this.container.innerHTML.trim();this.container.classList.add("ql-container"),this.container.innerHTML="",E.A.set(this.container,this),this.root=this.addContainer("ql-editor"),this.root.classList.add("ql-blank"),this.emitter=new N.A;const s=i.ScrollBlot.blotName,l=this.options.registry.query(s);if(!l||!("blotName"in l))throw new Error(`Cannot initialize Quill without "${s}" blot`);if(this.scroll=new l(this.options.registry,this.root,{emitter:this.emitter}),this.editor=new x(this.scroll),this.selection=new f.A(this.scroll,this.emitter),this.composition=new _(this.scroll,this.emitter),this.theme=new this.options.theme(this,this.options),this.keyboard=this.theme.addModule("keyboard"),this.clipboard=this.theme.addModule("clipboard"),this.history=this.theme.addModule("history"),this.uploader=this.theme.addModule("uploader"),this.theme.addModule("input"),this.theme.addModule("uiNode"),this.theme.init(),this.emitter.on(N.A.events.EDITOR_CHANGE,(t=>{t===N.A.events.TEXT_CHANGE&&this.root.classList.toggle("ql-blank",this.editor.isBlank())})),this.emitter.on(N.A.events.SCROLL_UPDATE,((t,e)=>{const n=this.selection.lastRange,[r]=this.selection.getRange(),i=n&&r?{oldRange:n,newRange:r}:void 0;D.call(this,(()=>this.editor.update(null,e,i)),t)})),this.emitter.on(N.A.events.SCROLL_EMBED_UPDATE,((t,e)=>{const n=this.selection.lastRange,[r]=this.selection.getRange(),i=n&&r?{oldRange:n,newRange:r}:void 0;D.call(this,(()=>{const n=(new(o())).retain(t.offset(this)).retain({[t.statics.blotName]:e});return this.editor.update(n,[],i)}),I.sources.USER)})),n){const t=this.clipboard.convert({html:`${n}


    `,text:"\n"});this.setContents(t)}this.history.clear(),this.options.placeholder&&this.root.setAttribute("data-placeholder",this.options.placeholder),this.options.readOnly&&this.disable(),this.allowReadOnlyEdits=!1}addContainer(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;if("string"==typeof t){const e=t;(t=document.createElement("div")).classList.add(e)}return this.container.insertBefore(t,e),t}blur(){this.selection.setRange(null)}deleteText(t,e,n){return[t,e,,n]=P(t,e,n),D.call(this,(()=>this.editor.deleteText(t,e)),n,t,-1*e)}disable(){this.enable(!1)}editReadOnly(t){this.allowReadOnlyEdits=!0;const e=t();return this.allowReadOnlyEdits=!1,e}enable(){let t=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];this.scroll.enable(t),this.container.classList.toggle("ql-disabled",!t)}focus(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};this.selection.focus(),t.preventScroll||this.scrollSelectionIntoView()}format(t,e){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:N.A.sources.API;return D.call(this,(()=>{const n=this.getSelection(!0);let r=new(o());if(null==n)return r;if(this.scroll.query(t,i.Scope.BLOCK))r=this.editor.formatLine(n.index,n.length,{[t]:e});else{if(0===n.length)return this.selection.format(t,e),r;r=this.editor.formatText(n.index,n.length,{[t]:e})}return this.setSelection(n,N.A.sources.SILENT),r}),n)}formatLine(t,e,n,r,i){let s;return[t,e,s,i]=P(t,e,n,r,i),D.call(this,(()=>this.editor.formatLine(t,e,s)),i,t,0)}formatText(t,e,n,r,i){let s;return[t,e,s,i]=P(t,e,n,r,i),D.call(this,(()=>this.editor.formatText(t,e,s)),i,t,0)}getBounds(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=null;if(n="number"==typeof t?this.selection.getBounds(t,e):this.selection.getBounds(t.index,t.length),!n)return null;const r=this.container.getBoundingClientRect();return{bottom:n.bottom-r.top,height:n.height,left:n.left-r.left,right:n.right-r.left,top:n.top-r.top,width:n.width}}getContents(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.getLength()-t;return[t,e]=P(t,e),this.editor.getContents(t,e)}getFormat(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.getSelection(!0),e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;return"number"==typeof t?this.editor.getFormat(t,e):this.editor.getFormat(t.index,t.length)}getIndex(t){return t.offset(this.scroll)}getLength(){return this.scroll.length()}getLeaf(t){return this.scroll.leaf(t)}getLine(t){return this.scroll.line(t)}getLines(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:Number.MAX_VALUE;return"number"!=typeof t?this.scroll.lines(t.index,t.length):this.scroll.lines(t,e)}getModule(t){return this.theme.modules[t]}getSelection(){return arguments.length>0&&void 0!==arguments[0]&&arguments[0]&&this.focus(),this.update(),this.selection.getRange()[0]}getSemanticHTML(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,e=arguments.length>1?arguments[1]:void 0;return"number"==typeof t&&(e=e??this.getLength()-t),[t,e]=P(t,e),this.editor.getHTML(t,e)}getText(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,e=arguments.length>1?arguments[1]:void 0;return"number"==typeof t&&(e=e??this.getLength()-t),[t,e]=P(t,e),this.editor.getText(t,e)}hasFocus(){return this.selection.hasFocus()}insertEmbed(t,e,n){let r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:I.sources.API;return D.call(this,(()=>this.editor.insertEmbed(t,e,n)),r,t)}insertText(t,e,n,r,i){let s;return[t,,s,i]=P(t,0,n,r,i),D.call(this,(()=>this.editor.insertText(t,e,s)),i,t,e.length)}isEnabled(){return this.scroll.isEnabled()}off(){return this.emitter.off(...arguments)}on(){return this.emitter.on(...arguments)}once(){return this.emitter.once(...arguments)}removeFormat(t,e,n){return[t,e,,n]=P(t,e,n),D.call(this,(()=>this.editor.removeFormat(t,e)),n,t)}scrollRectIntoView(t){((t,e)=>{const n=t.ownerDocument;let r=e,i=t;for(;i;){const t=i===n.body,e=t?{top:0,right:window.visualViewport?.width??n.documentElement.clientWidth,bottom:window.visualViewport?.height??n.documentElement.clientHeight,left:0}:S(i),o=getComputedStyle(i),l=T(r.left,r.right,e.left,e.right,O(o.scrollPaddingLeft),O(o.scrollPaddingRight)),a=T(r.top,r.bottom,e.top,e.bottom,O(o.scrollPaddingTop),O(o.scrollPaddingBottom));if(l||a)if(t)n.defaultView?.scrollBy(l,a);else{const{scrollLeft:t,scrollTop:e}=i;a&&(i.scrollTop+=a),l&&(i.scrollLeft+=l);const n=i.scrollLeft-t,s=i.scrollTop-e;r={left:r.left-n,top:r.top-s,right:r.right-n,bottom:r.bottom-s}}i=t||"fixed"===o.position?null:(s=i).parentElement||s.getRootNode().host||null}var s})(this.root,t)}scrollIntoView(){console.warn("Quill#scrollIntoView() has been deprecated and will be removed in the near future. Please use Quill#scrollSelectionIntoView() instead."),this.scrollSelectionIntoView()}scrollSelectionIntoView(){const t=this.selection.lastRange,e=t&&this.selection.getBounds(t.index,t.length);e&&this.scrollRectIntoView(e)}setContents(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:N.A.sources.API;return D.call(this,(()=>{t=new(o())(t);const e=this.getLength(),n=this.editor.deleteText(0,e),r=this.editor.insertContents(0,t),i=this.editor.deleteText(this.getLength()-1,1);return n.compose(r).compose(i)}),e)}setSelection(t,e,n){null==t?this.selection.setRange(null,e||I.sources.API):([t,e,,n]=P(t,e,n),this.selection.setRange(new f.Q(Math.max(0,t),e),n),n!==N.A.sources.SILENT&&this.scrollSelectionIntoView())}setText(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:N.A.sources.API;const n=(new(o())).insert(t);return this.setContents(n,e)}update(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:N.A.sources.USER;const e=this.scroll.update(t);return this.selection.update(t),e}updateContents(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:N.A.sources.API;return D.call(this,(()=>(t=new(o())(t),this.editor.applyDelta(t))),e,!0)}}function B(t){return"string"==typeof t?document.querySelector(t):t}function M(t){return Object.entries(t??{}).reduce(((t,e)=>{let[n,r]=e;return{...t,[n]:!0===r?{}:r}}),{})}function U(t){return Object.fromEntries(Object.entries(t).filter((t=>void 0!==t[1])))}function D(t,e,n,r){if(!this.isEnabled()&&e===N.A.sources.USER&&!this.allowReadOnlyEdits)return new(o());let i=null==n?null:this.getSelection();const s=this.editor.delta,l=t();if(null!=i&&(!0===n&&(n=i.index),null==r?i=z(i,l,e):0!==r&&(i=z(i,n,r,e)),this.setSelection(i,N.A.sources.SILENT)),l.length()>0){const t=[N.A.events.TEXT_CHANGE,l,s,e];this.emitter.emit(N.A.events.EDITOR_CHANGE,...t),e!==N.A.sources.SILENT&&this.emitter.emit(...t)}return l}function P(t,e,n,r,i){let s={};return"number"==typeof t.index&&"number"==typeof t.length?"number"!=typeof e?(i=r,r=n,n=e,e=t.length,t=t.index):(e=t.length,t=t.index):"number"!=typeof e&&(i=r,r=n,n=e,e=0),"object"==typeof n?(s=n,i=r):"string"==typeof n&&(null!=r?s[n]=r:i=n),[t,e,s,i=i||N.A.sources.API]}function z(t,e,n,r){const i="number"==typeof n?n:0;if(null==t)return null;let s,o;return e&&"function"==typeof e.transformPosition?[s,o]=[t.index,t.index+t.length].map((t=>e.transformPosition(t,r!==N.A.sources.USER))):[s,o]=[t.index,t.index+t.length].map((t=>t=0?t+i:Math.max(e,t+i))),new f.Q(s,o-s)}},8298:function(t,e,n){"use strict";n.d(e,{Q:function(){return a}});var r=n(6003),i=n(5123),s=n(3707),o=n(5374);const l=(0,n(6078).A)("quill:selection");class a{constructor(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;this.index=t,this.length=e}}function c(t,e){try{e.parentNode}catch(t){return!1}return t.contains(e)}e.A=class{constructor(t,e){this.emitter=e,this.scroll=t,this.composing=!1,this.mouseDown=!1,this.root=this.scroll.domNode,this.cursor=this.scroll.create("cursor",this),this.savedRange=new a(0,0),this.lastRange=this.savedRange,this.lastNative=null,this.handleComposition(),this.handleDragging(),this.emitter.listenDOM("selectionchange",document,(()=>{this.mouseDown||this.composing||setTimeout(this.update.bind(this,o.A.sources.USER),1)})),this.emitter.on(o.A.events.SCROLL_BEFORE_UPDATE,(()=>{if(!this.hasFocus())return;const t=this.getNativeRange();null!=t&&t.start.node!==this.cursor.textNode&&this.emitter.once(o.A.events.SCROLL_UPDATE,((e,n)=>{try{this.root.contains(t.start.node)&&this.root.contains(t.end.node)&&this.setNativeRange(t.start.node,t.start.offset,t.end.node,t.end.offset);const r=n.some((t=>"characterData"===t.type||"childList"===t.type||"attributes"===t.type&&t.target===this.root));this.update(r?o.A.sources.SILENT:e)}catch(t){}}))})),this.emitter.on(o.A.events.SCROLL_OPTIMIZE,((t,e)=>{if(e.range){const{startNode:t,startOffset:n,endNode:r,endOffset:i}=e.range;this.setNativeRange(t,n,r,i),this.update(o.A.sources.SILENT)}})),this.update(o.A.sources.SILENT)}handleComposition(){this.emitter.on(o.A.events.COMPOSITION_BEFORE_START,(()=>{this.composing=!0})),this.emitter.on(o.A.events.COMPOSITION_END,(()=>{if(this.composing=!1,this.cursor.parent){const t=this.cursor.restore();if(!t)return;setTimeout((()=>{this.setNativeRange(t.startNode,t.startOffset,t.endNode,t.endOffset)}),1)}}))}handleDragging(){this.emitter.listenDOM("mousedown",document.body,(()=>{this.mouseDown=!0})),this.emitter.listenDOM("mouseup",document.body,(()=>{this.mouseDown=!1,this.update(o.A.sources.USER)}))}focus(){this.hasFocus()||(this.root.focus({preventScroll:!0}),this.setRange(this.savedRange))}format(t,e){this.scroll.update();const n=this.getNativeRange();if(null!=n&&n.native.collapsed&&!this.scroll.query(t,r.Scope.BLOCK)){if(n.start.node!==this.cursor.textNode){const t=this.scroll.find(n.start.node,!1);if(null==t)return;if(t instanceof r.LeafBlot){const e=t.split(n.start.offset);t.parent.insertBefore(this.cursor,e)}else t.insertBefore(this.cursor,n.start.node);this.cursor.attach()}this.cursor.format(t,e),this.scroll.optimize(),this.setNativeRange(this.cursor.textNode,this.cursor.textNode.data.length),this.update()}}getBounds(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;const n=this.scroll.length();let r;t=Math.min(t,n-1),e=Math.min(t+e,n-1)-t;let[i,s]=this.scroll.leaf(t);if(null==i)return null;if(e>0&&s===i.length()){const[e]=this.scroll.leaf(t+1);if(e){const[n]=this.scroll.line(t),[r]=this.scroll.line(t+1);n===r&&(i=e,s=0)}}[r,s]=i.position(s,!0);const o=document.createRange();if(e>0)return o.setStart(r,s),[i,s]=this.scroll.leaf(t+e),null==i?null:([r,s]=i.position(s,!0),o.setEnd(r,s),o.getBoundingClientRect());let l,a="left";if(r instanceof Text){if(!r.data.length)return null;s0&&(a="right")}return{bottom:l.top+l.height,height:l.height,left:l[a],right:l[a],top:l.top,width:0}}getNativeRange(){const t=document.getSelection();if(null==t||t.rangeCount<=0)return null;const e=t.getRangeAt(0);if(null==e)return null;const n=this.normalizeNative(e);return l.info("getNativeRange",n),n}getRange(){const t=this.scroll.domNode;if("isConnected"in t&&!t.isConnected)return[null,null];const e=this.getNativeRange();return null==e?[null,null]:[this.normalizedToRange(e),e]}hasFocus(){return document.activeElement===this.root||null!=document.activeElement&&c(this.root,document.activeElement)}normalizedToRange(t){const e=[[t.start.node,t.start.offset]];t.native.collapsed||e.push([t.end.node,t.end.offset]);const n=e.map((t=>{const[e,n]=t,i=this.scroll.find(e,!0),s=i.offset(this.scroll);return 0===n?s:i instanceof r.LeafBlot?s+i.index(e,n):s+i.length()})),i=Math.min(Math.max(...n),this.scroll.length()-1),s=Math.min(i,...n);return new a(s,i-s)}normalizeNative(t){if(!c(this.root,t.startContainer)||!t.collapsed&&!c(this.root,t.endContainer))return null;const e={start:{node:t.startContainer,offset:t.startOffset},end:{node:t.endContainer,offset:t.endOffset},native:t};return[e.start,e.end].forEach((t=>{let{node:e,offset:n}=t;for(;!(e instanceof Text)&&e.childNodes.length>0;)if(e.childNodes.length>n)e=e.childNodes[n],n=0;else{if(e.childNodes.length!==n)break;e=e.lastChild,n=e instanceof Text?e.data.length:e.childNodes.length>0?e.childNodes.length:e.childNodes.length+1}t.node=e,t.offset=n})),e}rangeToNative(t){const e=this.scroll.length(),n=(t,n)=>{t=Math.min(e-1,t);const[r,i]=this.scroll.leaf(t);return r?r.position(i,n):[null,-1]};return[...n(t.index,!1),...n(t.index+t.length,!0)]}setNativeRange(t,e){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:t,r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:e,i=arguments.length>4&&void 0!==arguments[4]&&arguments[4];if(l.info("setNativeRange",t,e,n,r),null!=t&&(null==this.root.parentNode||null==t.parentNode||null==n.parentNode))return;const s=document.getSelection();if(null!=s)if(null!=t){this.hasFocus()||this.root.focus({preventScroll:!0});const{native:o}=this.getNativeRange()||{};if(null==o||i||t!==o.startContainer||e!==o.startOffset||n!==o.endContainer||r!==o.endOffset){t instanceof Element&&"BR"===t.tagName&&(e=Array.from(t.parentNode.childNodes).indexOf(t),t=t.parentNode),n instanceof Element&&"BR"===n.tagName&&(r=Array.from(n.parentNode.childNodes).indexOf(n),n=n.parentNode);const i=document.createRange();i.setStart(t,e),i.setEnd(n,r),s.removeAllRanges(),s.addRange(i)}}else s.removeAllRanges(),this.root.blur()}setRange(t){let e=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:o.A.sources.API;if("string"==typeof e&&(n=e,e=!1),l.info("setRange",t),null!=t){const n=this.rangeToNative(t);this.setNativeRange(...n,e)}else this.setNativeRange(null);this.update(n)}update(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:o.A.sources.USER;const e=this.lastRange,[n,r]=this.getRange();if(this.lastRange=n,this.lastNative=r,null!=this.lastRange&&(this.savedRange=this.lastRange),!(0,i.A)(e,this.lastRange)){if(!this.composing&&null!=r&&r.native.collapsed&&r.start.node!==this.cursor.textNode){const t=this.cursor.restore();t&&this.setNativeRange(t.startNode,t.startOffset,t.endNode,t.endOffset)}const n=[o.A.events.SELECTION_CHANGE,(0,s.A)(this.lastRange),(0,s.A)(e),t];this.emitter.emit(o.A.events.EDITOR_CHANGE,...n),t!==o.A.sources.SILENT&&this.emitter.emit(...n)}}}},9609:function(t,e){"use strict";class n{static DEFAULTS={modules:{}};static themes={default:n};modules={};constructor(t,e){this.quill=t,this.options=e}init(){Object.keys(this.options.modules).forEach((t=>{null==this.modules[t]&&this.addModule(t)}))}addModule(t){const e=this.quill.constructor.import(`modules/${t}`);return this.modules[t]=new e(this.quill,this.options.modules[t]||{}),this.modules[t]}}e.A=n},8276:function(t,e,n){"use strict";n.d(e,{Hu:function(){return l},gS:function(){return s},qh:function(){return o}});var r=n(6003);const i={scope:r.Scope.BLOCK,whitelist:["right","center","justify"]},s=new r.Attributor("align","align",i),o=new r.ClassAttributor("align","ql-align",i),l=new r.StyleAttributor("align","text-align",i)},9541:function(t,e,n){"use strict";n.d(e,{l:function(){return s},s:function(){return o}});var r=n(6003),i=n(8638);const s=new r.ClassAttributor("background","ql-bg",{scope:r.Scope.INLINE}),o=new i.a2("background","background-color",{scope:r.Scope.INLINE})},9404:function(t,e,n){"use strict";n.d(e,{Ay:function(){return h},Cy:function(){return d},EJ:function(){return u}});var r=n(9698),i=n(3036),s=n(4541),o=n(4850),l=n(5508),a=n(580),c=n(6142);class u extends a.A{static create(t){const e=super.create(t);return e.setAttribute("spellcheck","false"),e}code(t,e){return this.children.map((t=>t.length()<=1?"":t.domNode.innerText)).join("\n").slice(t,t+e)}html(t,e){return`
    \n${(0,l.X)(this.code(t,e))}\n
    `}}class h extends r.Ay{static TAB=" ";static register(){c.Ay.register(u)}}class d extends o.A{}d.blotName="code",d.tagName="CODE",h.blotName="code-block",h.className="ql-code-block",h.tagName="DIV",u.blotName="code-block-container",u.className="ql-code-block-container",u.tagName="DIV",u.allowedChildren=[h],h.allowedChildren=[l.A,i.A,s.A],h.requiredContainer=u},8638:function(t,e,n){"use strict";n.d(e,{JM:function(){return o},a2:function(){return i},g3:function(){return s}});var r=n(6003);class i extends r.StyleAttributor{value(t){let e=super.value(t);return e.startsWith("rgb(")?(e=e.replace(/^[^\d]+/,"").replace(/[^\d]+$/,""),`#${e.split(",").map((t=>`00${parseInt(t,10).toString(16)}`.slice(-2))).join("")}`):e}}const s=new r.ClassAttributor("color","ql-color",{scope:r.Scope.INLINE}),o=new i("color","color",{scope:r.Scope.INLINE})},7912:function(t,e,n){"use strict";n.d(e,{Mc:function(){return s},VL:function(){return l},sY:function(){return o}});var r=n(6003);const i={scope:r.Scope.BLOCK,whitelist:["rtl"]},s=new r.Attributor("direction","dir",i),o=new r.ClassAttributor("direction","ql-direction",i),l=new r.StyleAttributor("direction","direction",i)},6772:function(t,e,n){"use strict";n.d(e,{q:function(){return s},z:function(){return l}});var r=n(6003);const i={scope:r.Scope.INLINE,whitelist:["serif","monospace"]},s=new r.ClassAttributor("font","ql-font",i);class o extends r.StyleAttributor{value(t){return super.value(t).replace(/["']/g,"")}}const l=new o("font","font-family",i)},664:function(t,e,n){"use strict";n.d(e,{U:function(){return i},r:function(){return s}});var r=n(6003);const i=new r.ClassAttributor("size","ql-size",{scope:r.Scope.INLINE,whitelist:["small","large","huge"]}),s=new r.StyleAttributor("size","font-size",{scope:r.Scope.INLINE,whitelist:["10px","18px","32px"]})},584:function(t,e,n){"use strict";n.d(e,{Ay:function(){return S},hV:function(){return I}});var r=n(6003),i=n(5232),s=n.n(i),o=n(9698),l=n(6078),a=n(4266),c=n(6142),u=n(8276),h=n(9541),d=n(9404),f=n(8638),p=n(7912),g=n(6772),m=n(664),b=n(8123);const y=/font-weight:\s*normal/,v=["P","OL","UL"],A=t=>t&&v.includes(t.tagName),x=/\bmso-list:[^;]*ignore/i,N=/\bmso-list:[^;]*\bl(\d+)/i,E=/\bmso-list:[^;]*\blevel(\d+)/i,w=[function(t){"urn:schemas-microsoft-com:office:word"===t.documentElement.getAttribute("xmlns:w")&&(t=>{const e=Array.from(t.querySelectorAll("[style*=mso-list]")),n=[],r=[];e.forEach((t=>{(t.getAttribute("style")||"").match(x)?n.push(t):r.push(t)})),n.forEach((t=>t.parentNode?.removeChild(t)));const i=t.documentElement.innerHTML,s=r.map((t=>((t,e)=>{const n=t.getAttribute("style"),r=n?.match(N);if(!r)return null;const i=Number(r[1]),s=n?.match(E),o=s?Number(s[1]):1,l=new RegExp(`@list l${i}:level${o}\\s*\\{[^\\}]*mso-level-number-format:\\s*([\\w-]+)`,"i"),a=e.match(l);return{id:i,indent:o,type:a&&"bullet"===a[1]?"bullet":"ordered",element:t}})(t,i))).filter((t=>t));for(;s.length;){const t=[];let e=s.shift();for(;e;)t.push(e),e=s.length&&s[0]?.element===e.element.nextElementSibling&&s[0].id===e.id?s.shift():null;const n=document.createElement("ul");t.forEach((t=>{const e=document.createElement("li");e.setAttribute("data-list",t.type),t.indent>1&&e.setAttribute("class","ql-indent-"+(t.indent-1)),e.innerHTML=t.element.innerHTML,n.appendChild(e)}));const r=t[0]?.element,{parentNode:i}=r??{};r&&i?.replaceChild(n,r),t.slice(1).forEach((t=>{let{element:e}=t;i?.removeChild(e)}))}})(t)},function(t){t.querySelector('[id^="docs-internal-guid-"]')&&((t=>{Array.from(t.querySelectorAll('b[style*="font-weight"]')).filter((t=>t.getAttribute("style")?.match(y))).forEach((e=>{const n=t.createDocumentFragment();n.append(...e.childNodes),e.parentNode?.replaceChild(n,e)}))})(t),(t=>{Array.from(t.querySelectorAll("br")).filter((t=>A(t.previousElementSibling)&&A(t.nextElementSibling))).forEach((t=>{t.parentNode?.removeChild(t)}))})(t))}];const q=(0,l.A)("quill:clipboard"),k=[[Node.TEXT_NODE,function(t,e,n){let r=t.data;if("O:P"===t.parentElement?.tagName)return e.insert(r.trim());if(!R(t)){if(0===r.trim().length&&r.includes("\n")&&!function(t,e){return t.previousElementSibling&&t.nextElementSibling&&!j(t.previousElementSibling,e)&&!j(t.nextElementSibling,e)}(t,n))return e;r=r.replace(/[^\S\u00a0]/g," "),r=r.replace(/ {2,}/g," "),(null==t.previousSibling&&null!=t.parentElement&&j(t.parentElement,n)||t.previousSibling instanceof Element&&j(t.previousSibling,n))&&(r=r.replace(/^ /,"")),(null==t.nextSibling&&null!=t.parentElement&&j(t.parentElement,n)||t.nextSibling instanceof Element&&j(t.nextSibling,n))&&(r=r.replace(/ $/,"")),r=r.replaceAll(" "," ")}return e.insert(r)}],[Node.TEXT_NODE,M],["br",function(t,e){return T(e,"\n")||e.insert("\n"),e}],[Node.ELEMENT_NODE,M],[Node.ELEMENT_NODE,function(t,e,n){const i=n.query(t);if(null==i)return e;if(i.prototype instanceof r.EmbedBlot){const e={},r=i.value(t);if(null!=r)return e[i.blotName]=r,(new(s())).insert(e,i.formats(t,n))}else if(i.prototype instanceof r.BlockBlot&&!T(e,"\n")&&e.insert("\n"),"blotName"in i&&"formats"in i&&"function"==typeof i.formats)return O(e,i.blotName,i.formats(t,n),n);return e}],[Node.ELEMENT_NODE,function(t,e,n){const i=r.Attributor.keys(t),s=r.ClassAttributor.keys(t),o=r.StyleAttributor.keys(t),l={};return i.concat(s).concat(o).forEach((e=>{let i=n.query(e,r.Scope.ATTRIBUTE);null!=i&&(l[i.attrName]=i.value(t),l[i.attrName])||(i=_[e],null==i||i.attrName!==e&&i.keyName!==e||(l[i.attrName]=i.value(t)||void 0),i=L[e],null==i||i.attrName!==e&&i.keyName!==e||(i=L[e],l[i.attrName]=i.value(t)||void 0))})),Object.entries(l).reduce(((t,e)=>{let[r,i]=e;return O(t,r,i,n)}),e)}],[Node.ELEMENT_NODE,function(t,e,n){const r={},i=t.style||{};return"italic"===i.fontStyle&&(r.italic=!0),"underline"===i.textDecoration&&(r.underline=!0),"line-through"===i.textDecoration&&(r.strike=!0),(i.fontWeight?.startsWith("bold")||parseInt(i.fontWeight,10)>=700)&&(r.bold=!0),e=Object.entries(r).reduce(((t,e)=>{let[r,i]=e;return O(t,r,i,n)}),e),parseFloat(i.textIndent||0)>0?(new(s())).insert("\t").concat(e):e}],["li",function(t,e,n){const r=n.query(t);if(null==r||"list"!==r.blotName||!T(e,"\n"))return e;let i=-1,o=t.parentNode;for(;null!=o;)["OL","UL"].includes(o.tagName)&&(i+=1),o=o.parentNode;return i<=0?e:e.reduce(((t,e)=>e.insert?e.attributes&&"number"==typeof e.attributes.indent?t.push(e):t.insert(e.insert,{indent:i,...e.attributes||{}}):t),new(s()))}],["ol, ul",function(t,e,n){const r=t;let i="OL"===r.tagName?"ordered":"bullet";const s=r.getAttribute("data-checked");return s&&(i="true"===s?"checked":"unchecked"),O(e,"list",i,n)}],["pre",function(t,e,n){const r=n.query("code-block");return O(e,"code-block",!r||!("formats"in r)||"function"!=typeof r.formats||r.formats(t,n),n)}],["tr",function(t,e,n){const r="TABLE"===t.parentElement?.tagName?t.parentElement:t.parentElement?.parentElement;return null!=r?O(e,"table",Array.from(r.querySelectorAll("tr")).indexOf(t)+1,n):e}],["b",B("bold")],["i",B("italic")],["strike",B("strike")],["style",function(){return new(s())}]],_=[u.gS,p.Mc].reduce(((t,e)=>(t[e.keyName]=e,t)),{}),L=[u.Hu,h.s,f.JM,p.VL,g.z,m.r].reduce(((t,e)=>(t[e.keyName]=e,t)),{});class S extends a.A{static DEFAULTS={matchers:[]};constructor(t,e){super(t,e),this.quill.root.addEventListener("copy",(t=>this.onCaptureCopy(t,!1))),this.quill.root.addEventListener("cut",(t=>this.onCaptureCopy(t,!0))),this.quill.root.addEventListener("paste",this.onCapturePaste.bind(this)),this.matchers=[],k.concat(this.options.matchers??[]).forEach((t=>{let[e,n]=t;this.addMatcher(e,n)}))}addMatcher(t,e){this.matchers.push([t,e])}convert(t){let{html:e,text:n}=t,r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(r[d.Ay.blotName])return(new(s())).insert(n||"",{[d.Ay.blotName]:r[d.Ay.blotName]});if(!e)return(new(s())).insert(n||"",r);const i=this.convertHTML(e);return T(i,"\n")&&(null==i.ops[i.ops.length-1].attributes||r.table)?i.compose((new(s())).retain(i.length()-1).delete(1)):i}normalizeHTML(t){(t=>{t.documentElement&&w.forEach((e=>{e(t)}))})(t)}convertHTML(t){const e=(new DOMParser).parseFromString(t,"text/html");this.normalizeHTML(e);const n=e.body,r=new WeakMap,[i,s]=this.prepareMatching(n,r);return I(this.quill.scroll,n,i,s,r)}dangerouslyPasteHTML(t,e){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:c.Ay.sources.API;if("string"==typeof t){const n=this.convert({html:t,text:""});this.quill.setContents(n,e),this.quill.setSelection(0,c.Ay.sources.SILENT)}else{const r=this.convert({html:e,text:""});this.quill.updateContents((new(s())).retain(t).concat(r),n),this.quill.setSelection(t+r.length(),c.Ay.sources.SILENT)}}onCaptureCopy(t){let e=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(t.defaultPrevented)return;t.preventDefault();const[n]=this.quill.selection.getRange();if(null==n)return;const{html:r,text:i}=this.onCopy(n,e);t.clipboardData?.setData("text/plain",i),t.clipboardData?.setData("text/html",r),e&&(0,b.Xo)({range:n,quill:this.quill})}normalizeURIList(t){return t.split(/\r?\n/).filter((t=>"#"!==t[0])).join("\n")}onCapturePaste(t){if(t.defaultPrevented||!this.quill.isEnabled())return;t.preventDefault();const e=this.quill.getSelection(!0);if(null==e)return;const n=t.clipboardData?.getData("text/html");let r=t.clipboardData?.getData("text/plain");if(!n&&!r){const e=t.clipboardData?.getData("text/uri-list");e&&(r=this.normalizeURIList(e))}const i=Array.from(t.clipboardData?.files||[]);if(!n&&i.length>0)this.quill.uploader.upload(e,i);else{if(n&&i.length>0){const t=(new DOMParser).parseFromString(n,"text/html");if(1===t.body.childElementCount&&"IMG"===t.body.firstElementChild?.tagName)return void this.quill.uploader.upload(e,i)}this.onPaste(e,{html:n,text:r})}}onCopy(t){const e=this.quill.getText(t);return{html:this.quill.getSemanticHTML(t),text:e}}onPaste(t,e){let{text:n,html:r}=e;const i=this.quill.getFormat(t.index),o=this.convert({text:n,html:r},i);q.log("onPaste",o,{text:n,html:r});const l=(new(s())).retain(t.index).delete(t.length).concat(o);this.quill.updateContents(l,c.Ay.sources.USER),this.quill.setSelection(l.length()-t.length,c.Ay.sources.SILENT),this.quill.scrollSelectionIntoView()}prepareMatching(t,e){const n=[],r=[];return this.matchers.forEach((i=>{const[s,o]=i;switch(s){case Node.TEXT_NODE:r.push(o);break;case Node.ELEMENT_NODE:n.push(o);break;default:Array.from(t.querySelectorAll(s)).forEach((t=>{if(e.has(t)){const n=e.get(t);n?.push(o)}else e.set(t,[o])}))}})),[n,r]}}function O(t,e,n,r){return r.query(e)?t.reduce(((t,r)=>{if(!r.insert)return t;if(r.attributes&&r.attributes[e])return t.push(r);const i=n?{[e]:n}:{};return t.insert(r.insert,{...i,...r.attributes})}),new(s())):t}function T(t,e){let n="";for(let r=t.ops.length-1;r>=0&&n.lengthr(e,n,t)),new(s())):e.nodeType===e.ELEMENT_NODE?Array.from(e.childNodes||[]).reduce(((s,o)=>{let l=I(t,o,n,r,i);return o.nodeType===e.ELEMENT_NODE&&(l=n.reduce(((e,n)=>n(o,e,t)),l),l=(i.get(o)||[]).reduce(((e,n)=>n(o,e,t)),l)),s.concat(l)}),new(s())):new(s())}function B(t){return(e,n,r)=>O(n,t,!0,r)}function M(t,e,n){if(!T(e,"\n")){if(j(t,n)&&(t.childNodes.length>0||t instanceof HTMLParagraphElement))return e.insert("\n");if(e.length()>0&&t.nextSibling){let r=t.nextSibling;for(;null!=r;){if(j(r,n))return e.insert("\n");const t=n.query(r);if(t&&t.prototype instanceof o.zo)return e.insert("\n");r=r.firstChild}}}return e}},8123:function(t,e,n){"use strict";n.d(e,{Ay:function(){return f},Xo:function(){return v}});var r=n(5123),i=n(3707),s=n(5232),o=n.n(s),l=n(6003),a=n(6142),c=n(6078),u=n(4266);const h=(0,c.A)("quill:keyboard"),d=/Mac/i.test(navigator.platform)?"metaKey":"ctrlKey";class f extends u.A{static match(t,e){return!["altKey","ctrlKey","metaKey","shiftKey"].some((n=>!!e[n]!==t[n]&&null!==e[n]))&&(e.key===t.key||e.key===t.which)}constructor(t,e){super(t,e),this.bindings={},Object.keys(this.options.bindings).forEach((t=>{this.options.bindings[t]&&this.addBinding(this.options.bindings[t])})),this.addBinding({key:"Enter",shiftKey:null},this.handleEnter),this.addBinding({key:"Enter",metaKey:null,ctrlKey:null,altKey:null},(()=>{})),/Firefox/i.test(navigator.userAgent)?(this.addBinding({key:"Backspace"},{collapsed:!0},this.handleBackspace),this.addBinding({key:"Delete"},{collapsed:!0},this.handleDelete)):(this.addBinding({key:"Backspace"},{collapsed:!0,prefix:/^.?$/},this.handleBackspace),this.addBinding({key:"Delete"},{collapsed:!0,suffix:/^.?$/},this.handleDelete)),this.addBinding({key:"Backspace"},{collapsed:!1},this.handleDeleteRange),this.addBinding({key:"Delete"},{collapsed:!1},this.handleDeleteRange),this.addBinding({key:"Backspace",altKey:null,ctrlKey:null,metaKey:null,shiftKey:null},{collapsed:!0,offset:0},this.handleBackspace),this.listen()}addBinding(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};const r=function(t){if("string"==typeof t||"number"==typeof t)t={key:t};else{if("object"!=typeof t)return null;t=(0,i.A)(t)}return t.shortKey&&(t[d]=t.shortKey,delete t.shortKey),t}(t);null!=r?("function"==typeof e&&(e={handler:e}),"function"==typeof n&&(n={handler:n}),(Array.isArray(r.key)?r.key:[r.key]).forEach((t=>{const i={...r,key:t,...e,...n};this.bindings[i.key]=this.bindings[i.key]||[],this.bindings[i.key].push(i)}))):h.warn("Attempted to add invalid keyboard binding",r)}listen(){this.quill.root.addEventListener("keydown",(t=>{if(t.defaultPrevented||t.isComposing)return;if(229===t.keyCode&&("Enter"===t.key||"Backspace"===t.key))return;const e=(this.bindings[t.key]||[]).concat(this.bindings[t.which]||[]).filter((e=>f.match(t,e)));if(0===e.length)return;const n=a.Ay.find(t.target,!0);if(n&&n.scroll!==this.quill.scroll)return;const i=this.quill.getSelection();if(null==i||!this.quill.hasFocus())return;const[s,o]=this.quill.getLine(i.index),[c,u]=this.quill.getLeaf(i.index),[h,d]=0===i.length?[c,u]:this.quill.getLeaf(i.index+i.length),p=c instanceof l.TextBlot?c.value().slice(0,u):"",g=h instanceof l.TextBlot?h.value().slice(d):"",m={collapsed:0===i.length,empty:0===i.length&&s.length()<=1,format:this.quill.getFormat(i),line:s,offset:o,prefix:p,suffix:g,event:t};e.some((t=>{if(null!=t.collapsed&&t.collapsed!==m.collapsed)return!1;if(null!=t.empty&&t.empty!==m.empty)return!1;if(null!=t.offset&&t.offset!==m.offset)return!1;if(Array.isArray(t.format)){if(t.format.every((t=>null==m.format[t])))return!1}else if("object"==typeof t.format&&!Object.keys(t.format).every((e=>!0===t.format[e]?null!=m.format[e]:!1===t.format[e]?null==m.format[e]:(0,r.A)(t.format[e],m.format[e]))))return!1;return!(null!=t.prefix&&!t.prefix.test(m.prefix)||null!=t.suffix&&!t.suffix.test(m.suffix)||!0===t.handler.call(this,i,m,t))}))&&t.preventDefault()}))}handleBackspace(t,e){const n=/[\uD800-\uDBFF][\uDC00-\uDFFF]$/.test(e.prefix)?2:1;if(0===t.index||this.quill.getLength()<=1)return;let r={};const[i]=this.quill.getLine(t.index);let l=(new(o())).retain(t.index-n).delete(n);if(0===e.offset){const[e]=this.quill.getLine(t.index-1);if(e&&!("block"===e.statics.blotName&&e.length()<=1)){const e=i.formats(),n=this.quill.getFormat(t.index-1,1);if(r=s.AttributeMap.diff(e,n)||{},Object.keys(r).length>0){const e=(new(o())).retain(t.index+i.length()-2).retain(1,r);l=l.compose(e)}}}this.quill.updateContents(l,a.Ay.sources.USER),this.quill.focus()}handleDelete(t,e){const n=/^[\uD800-\uDBFF][\uDC00-\uDFFF]/.test(e.suffix)?2:1;if(t.index>=this.quill.getLength()-n)return;let r={};const[i]=this.quill.getLine(t.index);let l=(new(o())).retain(t.index).delete(n);if(e.offset>=i.length()-1){const[e]=this.quill.getLine(t.index+1);if(e){const n=i.formats(),o=this.quill.getFormat(t.index,1);r=s.AttributeMap.diff(n,o)||{},Object.keys(r).length>0&&(l=l.retain(e.length()-1).retain(1,r))}}this.quill.updateContents(l,a.Ay.sources.USER),this.quill.focus()}handleDeleteRange(t){v({range:t,quill:this.quill}),this.quill.focus()}handleEnter(t,e){const n=Object.keys(e.format).reduce(((t,n)=>(this.quill.scroll.query(n,l.Scope.BLOCK)&&!Array.isArray(e.format[n])&&(t[n]=e.format[n]),t)),{}),r=(new(o())).retain(t.index).delete(t.length).insert("\n",n);this.quill.updateContents(r,a.Ay.sources.USER),this.quill.setSelection(t.index+1,a.Ay.sources.SILENT),this.quill.focus()}}const p={bindings:{bold:b("bold"),italic:b("italic"),underline:b("underline"),indent:{key:"Tab",format:["blockquote","indent","list"],handler(t,e){return!(!e.collapsed||0===e.offset)||(this.quill.format("indent","+1",a.Ay.sources.USER),!1)}},outdent:{key:"Tab",shiftKey:!0,format:["blockquote","indent","list"],handler(t,e){return!(!e.collapsed||0===e.offset)||(this.quill.format("indent","-1",a.Ay.sources.USER),!1)}},"outdent backspace":{key:"Backspace",collapsed:!0,shiftKey:null,metaKey:null,ctrlKey:null,altKey:null,format:["indent","list"],offset:0,handler(t,e){null!=e.format.indent?this.quill.format("indent","-1",a.Ay.sources.USER):null!=e.format.list&&this.quill.format("list",!1,a.Ay.sources.USER)}},"indent code-block":g(!0),"outdent code-block":g(!1),"remove tab":{key:"Tab",shiftKey:!0,collapsed:!0,prefix:/\t$/,handler(t){this.quill.deleteText(t.index-1,1,a.Ay.sources.USER)}},tab:{key:"Tab",handler(t,e){if(e.format.table)return!0;this.quill.history.cutoff();const n=(new(o())).retain(t.index).delete(t.length).insert("\t");return this.quill.updateContents(n,a.Ay.sources.USER),this.quill.history.cutoff(),this.quill.setSelection(t.index+1,a.Ay.sources.SILENT),!1}},"blockquote empty enter":{key:"Enter",collapsed:!0,format:["blockquote"],empty:!0,handler(){this.quill.format("blockquote",!1,a.Ay.sources.USER)}},"list empty enter":{key:"Enter",collapsed:!0,format:["list"],empty:!0,handler(t,e){const n={list:!1};e.format.indent&&(n.indent=!1),this.quill.formatLine(t.index,t.length,n,a.Ay.sources.USER)}},"checklist enter":{key:"Enter",collapsed:!0,format:{list:"checked"},handler(t){const[e,n]=this.quill.getLine(t.index),r={...e.formats(),list:"checked"},i=(new(o())).retain(t.index).insert("\n",r).retain(e.length()-n-1).retain(1,{list:"unchecked"});this.quill.updateContents(i,a.Ay.sources.USER),this.quill.setSelection(t.index+1,a.Ay.sources.SILENT),this.quill.scrollSelectionIntoView()}},"header enter":{key:"Enter",collapsed:!0,format:["header"],suffix:/^$/,handler(t,e){const[n,r]=this.quill.getLine(t.index),i=(new(o())).retain(t.index).insert("\n",e.format).retain(n.length()-r-1).retain(1,{header:null});this.quill.updateContents(i,a.Ay.sources.USER),this.quill.setSelection(t.index+1,a.Ay.sources.SILENT),this.quill.scrollSelectionIntoView()}},"table backspace":{key:"Backspace",format:["table"],collapsed:!0,offset:0,handler(){}},"table delete":{key:"Delete",format:["table"],collapsed:!0,suffix:/^$/,handler(){}},"table enter":{key:"Enter",shiftKey:null,format:["table"],handler(t){const e=this.quill.getModule("table");if(e){const[n,r,i,s]=e.getTable(t),l=function(t,e,n,r){return null==e.prev&&null==e.next?null==n.prev&&null==n.next?0===r?-1:1:null==n.prev?-1:1:null==e.prev?-1:null==e.next?1:null}(0,r,i,s);if(null==l)return;let c=n.offset();if(l<0){const e=(new(o())).retain(c).insert("\n");this.quill.updateContents(e,a.Ay.sources.USER),this.quill.setSelection(t.index+1,t.length,a.Ay.sources.SILENT)}else if(l>0){c+=n.length();const t=(new(o())).retain(c).insert("\n");this.quill.updateContents(t,a.Ay.sources.USER),this.quill.setSelection(c,a.Ay.sources.USER)}}}},"table tab":{key:"Tab",shiftKey:null,format:["table"],handler(t,e){const{event:n,line:r}=e,i=r.offset(this.quill.scroll);n.shiftKey?this.quill.setSelection(i-1,a.Ay.sources.USER):this.quill.setSelection(i+r.length(),a.Ay.sources.USER)}},"list autofill":{key:" ",shiftKey:null,collapsed:!0,format:{"code-block":!1,blockquote:!1,table:!1},prefix:/^\s*?(\d+\.|-|\*|\[ ?\]|\[x\])$/,handler(t,e){if(null==this.quill.scroll.query("list"))return!0;const{length:n}=e.prefix,[r,i]=this.quill.getLine(t.index);if(i>n)return!0;let s;switch(e.prefix.trim()){case"[]":case"[ ]":s="unchecked";break;case"[x]":s="checked";break;case"-":case"*":s="bullet";break;default:s="ordered"}this.quill.insertText(t.index," ",a.Ay.sources.USER),this.quill.history.cutoff();const l=(new(o())).retain(t.index-i).delete(n+1).retain(r.length()-2-i).retain(1,{list:s});return this.quill.updateContents(l,a.Ay.sources.USER),this.quill.history.cutoff(),this.quill.setSelection(t.index-n,a.Ay.sources.SILENT),!1}},"code exit":{key:"Enter",collapsed:!0,format:["code-block"],prefix:/^$/,suffix:/^\s*$/,handler(t){const[e,n]=this.quill.getLine(t.index);let r=2,i=e;for(;null!=i&&i.length()<=1&&i.formats()["code-block"];)if(i=i.prev,r-=1,r<=0){const r=(new(o())).retain(t.index+e.length()-n-2).retain(1,{"code-block":null}).delete(1);return this.quill.updateContents(r,a.Ay.sources.USER),this.quill.setSelection(t.index-1,a.Ay.sources.SILENT),!1}return!0}},"embed left":m("ArrowLeft",!1),"embed left shift":m("ArrowLeft",!0),"embed right":m("ArrowRight",!1),"embed right shift":m("ArrowRight",!0),"table down":y(!1),"table up":y(!0)}};function g(t){return{key:"Tab",shiftKey:!t,format:{"code-block":!0},handler(e,n){let{event:r}=n;const i=this.quill.scroll.query("code-block"),{TAB:s}=i;if(0===e.length&&!r.shiftKey)return this.quill.insertText(e.index,s,a.Ay.sources.USER),void this.quill.setSelection(e.index+s.length,a.Ay.sources.SILENT);const o=0===e.length?this.quill.getLines(e.index,1):this.quill.getLines(e);let{index:l,length:c}=e;o.forEach(((e,n)=>{t?(e.insertAt(0,s),0===n?l+=s.length:c+=s.length):e.domNode.textContent.startsWith(s)&&(e.deleteAt(0,s.length),0===n?l-=s.length:c-=s.length)})),this.quill.update(a.Ay.sources.USER),this.quill.setSelection(l,c,a.Ay.sources.SILENT)}}}function m(t,e){return{key:t,shiftKey:e,altKey:null,["ArrowLeft"===t?"prefix":"suffix"]:/^$/,handler(n){let{index:r}=n;"ArrowRight"===t&&(r+=n.length+1);const[i]=this.quill.getLeaf(r);return!(i instanceof l.EmbedBlot&&("ArrowLeft"===t?e?this.quill.setSelection(n.index-1,n.length+1,a.Ay.sources.USER):this.quill.setSelection(n.index-1,a.Ay.sources.USER):e?this.quill.setSelection(n.index,n.length+1,a.Ay.sources.USER):this.quill.setSelection(n.index+n.length+1,a.Ay.sources.USER),1))}}}function b(t){return{key:t[0],shortKey:!0,handler(e,n){this.quill.format(t,!n.format[t],a.Ay.sources.USER)}}}function y(t){return{key:t?"ArrowUp":"ArrowDown",collapsed:!0,format:["table"],handler(e,n){const r=t?"prev":"next",i=n.line,s=i.parent[r];if(null!=s){if("table-row"===s.statics.blotName){let t=s.children.head,e=i;for(;null!=e.prev;)e=e.prev,t=t.next;const r=t.offset(this.quill.scroll)+Math.min(n.offset,t.length()-1);this.quill.setSelection(r,0,a.Ay.sources.USER)}}else{const e=i.table()[r];null!=e&&(t?this.quill.setSelection(e.offset(this.quill.scroll)+e.length()-1,0,a.Ay.sources.USER):this.quill.setSelection(e.offset(this.quill.scroll),0,a.Ay.sources.USER))}return!1}}}function v(t){let{quill:e,range:n}=t;const r=e.getLines(n);let i={};if(r.length>1){const t=r[0].formats(),e=r[r.length-1].formats();i=s.AttributeMap.diff(e,t)||{}}e.deleteText(n,a.Ay.sources.USER),Object.keys(i).length>0&&e.formatLine(n.index,1,i,a.Ay.sources.USER),e.setSelection(n.index,a.Ay.sources.SILENT)}f.DEFAULTS=p},8920:function(t){"use strict";var e=Object.prototype.hasOwnProperty,n="~";function r(){}function i(t,e,n){this.fn=t,this.context=e,this.once=n||!1}function s(t,e,r,s,o){if("function"!=typeof r)throw new TypeError("The listener must be a function");var l=new i(r,s||t,o),a=n?n+e:e;return t._events[a]?t._events[a].fn?t._events[a]=[t._events[a],l]:t._events[a].push(l):(t._events[a]=l,t._eventsCount++),t}function o(t,e){0==--t._eventsCount?t._events=new r:delete t._events[e]}function l(){this._events=new r,this._eventsCount=0}Object.create&&(r.prototype=Object.create(null),(new r).__proto__||(n=!1)),l.prototype.eventNames=function(){var t,r,i=[];if(0===this._eventsCount)return i;for(r in t=this._events)e.call(t,r)&&i.push(n?r.slice(1):r);return Object.getOwnPropertySymbols?i.concat(Object.getOwnPropertySymbols(t)):i},l.prototype.listeners=function(t){var e=n?n+t:t,r=this._events[e];if(!r)return[];if(r.fn)return[r.fn];for(var i=0,s=r.length,o=new Array(s);io)){var d=e.slice(0,h);if((g=e.slice(h))===c){var f=Math.min(l,h);if((b=a.slice(0,f))===(A=d.slice(0,f)))return v(b,a.slice(f),d.slice(f),c)}}if(null===u||u===l){var p=l,g=(d=e.slice(0,p),e.slice(p));if(d===a){var m=Math.min(s-p,o-p);if((y=c.slice(c.length-m))===(x=g.slice(g.length-m)))return v(a,c.slice(0,c.length-m),g.slice(0,g.length-m),y)}}}if(r.length>0&&i&&0===i.length){var b=t.slice(0,r.index),y=t.slice(r.index+r.length);if(!(o<(f=b.length)+(m=y.length))){var A=e.slice(0,f),x=e.slice(o-m);if(b===A&&y===x)return v(b,t.slice(f,s-m),e.slice(f,o-m),y)}}return null}(t,g,m);if(A)return A}var x=o(t,g),N=t.substring(0,x);x=a(t=t.substring(x),g=g.substring(x));var E=t.substring(t.length-x),w=function(t,l){var c;if(!t)return[[n,l]];if(!l)return[[e,t]];var u=t.length>l.length?t:l,h=t.length>l.length?l:t,d=u.indexOf(h);if(-1!==d)return c=[[n,u.substring(0,d)],[r,h],[n,u.substring(d+h.length)]],t.length>l.length&&(c[0][0]=c[2][0]=e),c;if(1===h.length)return[[e,t],[n,l]];var f=function(t,e){var n=t.length>e.length?t:e,r=t.length>e.length?e:t;if(n.length<4||2*r.length=t.length?[r,i,s,l,h]:null}var s,l,c,u,h,d=i(n,r,Math.ceil(n.length/4)),f=i(n,r,Math.ceil(n.length/2));return d||f?(s=f?d&&d[4].length>f[4].length?d:f:d,t.length>e.length?(l=s[0],c=s[1],u=s[2],h=s[3]):(u=s[0],h=s[1],l=s[2],c=s[3]),[l,c,u,h,s[4]]):null}(t,l);if(f){var p=f[0],g=f[1],m=f[2],b=f[3],y=f[4],v=i(p,m),A=i(g,b);return v.concat([[r,y]],A)}return function(t,r){for(var i=t.length,o=r.length,l=Math.ceil((i+o)/2),a=l,c=2*l,u=new Array(c),h=new Array(c),d=0;di)m+=2;else if(N>o)g+=2;else if(p&&(q=a+f-A)>=0&&q=(w=i-h[q]))return s(t,r,_,N)}for(var E=-v+b;E<=v-y;E+=2){for(var w,q=a+E,k=(w=E===-v||E!==v&&h[q-1]i)y+=2;else if(k>o)b+=2;else if(!p){var _;if((x=a+f-E)>=0&&x=(w=i-w))return s(t,r,_,N)}}}return[[e,t],[n,r]]}(t,l)}(t=t.substring(0,t.length-x),g=g.substring(0,g.length-x));return N&&w.unshift([r,N]),E&&w.push([r,E]),p(w,y),b&&function(t){for(var i=!1,s=[],o=0,g=null,m=0,b=0,y=0,v=0,A=0;m0?s[o-1]:-1,b=0,y=0,v=0,A=0,g=null,i=!0)),m++;for(i&&p(t),function(t){function e(t,e){if(!t||!e)return 6;var n=t.charAt(t.length-1),r=e.charAt(0),i=n.match(c),s=r.match(c),o=i&&n.match(u),l=s&&r.match(u),a=o&&n.match(h),p=l&&r.match(h),g=a&&t.match(d),m=p&&e.match(f);return g||m?5:a||p?4:i&&!o&&l?3:o||l?2:i||s?1:0}for(var n=1;n=y&&(y=v,g=i,m=s,b=o)}t[n-1][1]!=g&&(g?t[n-1][1]=g:(t.splice(n-1,1),n--),t[n][1]=m,b?t[n+1][1]=b:(t.splice(n+1,1),n--))}n++}}(t),m=1;m=w?(E>=x.length/2||E>=N.length/2)&&(t.splice(m,0,[r,N.substring(0,E)]),t[m-1][1]=x.substring(0,x.length-E),t[m+1][1]=N.substring(E),m++):(w>=x.length/2||w>=N.length/2)&&(t.splice(m,0,[r,x.substring(0,w)]),t[m-1][0]=n,t[m-1][1]=N.substring(0,N.length-w),t[m+1][0]=e,t[m+1][1]=x.substring(w),m++),m++}m++}}(w),w}function s(t,e,n,r){var s=t.substring(0,n),o=e.substring(0,r),l=t.substring(n),a=e.substring(r),c=i(s,o),u=i(l,a);return c.concat(u)}function o(t,e){if(!t||!e||t.charAt(0)!==e.charAt(0))return 0;for(var n=0,r=Math.min(t.length,e.length),i=r,s=0;nr?t=t.substring(n-r):n=0&&y(t[f][1])){var g=t[f][1].slice(-1);if(t[f][1]=t[f][1].slice(0,-1),h=g+h,d=g+d,!t[f][1]){t.splice(f,1),l--;var m=f-1;t[m]&&t[m][0]===n&&(u++,d=t[m][1]+d,m--),t[m]&&t[m][0]===e&&(c++,h=t[m][1]+h,m--),f=m}}b(t[l][1])&&(g=t[l][1].charAt(0),t[l][1]=t[l][1].slice(1),h+=g,d+=g)}if(l0||d.length>0){h.length>0&&d.length>0&&(0!==(s=o(d,h))&&(f>=0?t[f][1]+=d.substring(0,s):(t.splice(0,0,[r,d.substring(0,s)]),l++),d=d.substring(s),h=h.substring(s)),0!==(s=a(d,h))&&(t[l][1]=d.substring(d.length-s)+t[l][1],d=d.substring(0,d.length-s),h=h.substring(0,h.length-s)));var v=u+c;0===h.length&&0===d.length?(t.splice(l-v,v),l-=v):0===h.length?(t.splice(l-v,v,[n,d]),l=l-v+1):0===d.length?(t.splice(l-v,v,[e,h]),l=l-v+1):(t.splice(l-v,v,[e,h],[n,d]),l=l-v+2)}0!==l&&t[l-1][0]===r?(t[l-1][1]+=t[l][1],t.splice(l,1)):l++,u=0,c=0,h="",d=""}""===t[t.length-1][1]&&t.pop();var A=!1;for(l=1;l=55296&&t<=56319}function m(t){return t>=56320&&t<=57343}function b(t){return m(t.charCodeAt(0))}function y(t){return g(t.charCodeAt(t.length-1))}function v(t,i,s,o){return y(t)||b(o)?null:function(t){for(var e=[],n=0;n0&&e.push(t[n]);return e}([[r,t],[e,i],[n,s],[r,o]])}function A(t,e,n,r){return i(t,e,n,r,!0)}A.INSERT=n,A.DELETE=e,A.EQUAL=r,t.exports=A},9629:function(t,e,n){t=n.nmd(t);var r="__lodash_hash_undefined__",i=9007199254740991,s="[object Arguments]",o="[object Boolean]",l="[object Date]",a="[object Function]",c="[object GeneratorFunction]",u="[object Map]",h="[object Number]",d="[object Object]",f="[object Promise]",p="[object RegExp]",g="[object Set]",m="[object String]",b="[object Symbol]",y="[object WeakMap]",v="[object ArrayBuffer]",A="[object DataView]",x="[object Float32Array]",N="[object Float64Array]",E="[object Int8Array]",w="[object Int16Array]",q="[object Int32Array]",k="[object Uint8Array]",_="[object Uint8ClampedArray]",L="[object Uint16Array]",S="[object Uint32Array]",O=/\w*$/,T=/^\[object .+?Constructor\]$/,j=/^(?:0|[1-9]\d*)$/,C={};C[s]=C["[object Array]"]=C[v]=C[A]=C[o]=C[l]=C[x]=C[N]=C[E]=C[w]=C[q]=C[u]=C[h]=C[d]=C[p]=C[g]=C[m]=C[b]=C[k]=C[_]=C[L]=C[S]=!0,C["[object Error]"]=C[a]=C[y]=!1;var R="object"==typeof n.g&&n.g&&n.g.Object===Object&&n.g,I="object"==typeof self&&self&&self.Object===Object&&self,B=R||I||Function("return this")(),M=e&&!e.nodeType&&e,U=M&&t&&!t.nodeType&&t,D=U&&U.exports===M;function P(t,e){return t.set(e[0],e[1]),t}function z(t,e){return t.add(e),t}function F(t,e,n,r){var i=-1,s=t?t.length:0;for(r&&s&&(n=t[++i]);++i-1},_t.prototype.set=function(t,e){var n=this.__data__,r=Tt(n,t);return r<0?n.push([t,e]):n[r][1]=e,this},Lt.prototype.clear=function(){this.__data__={hash:new kt,map:new(pt||_t),string:new kt}},Lt.prototype.delete=function(t){return It(this,t).delete(t)},Lt.prototype.get=function(t){return It(this,t).get(t)},Lt.prototype.has=function(t){return It(this,t).has(t)},Lt.prototype.set=function(t,e){return It(this,t).set(t,e),this},St.prototype.clear=function(){this.__data__=new _t},St.prototype.delete=function(t){return this.__data__.delete(t)},St.prototype.get=function(t){return this.__data__.get(t)},St.prototype.has=function(t){return this.__data__.has(t)},St.prototype.set=function(t,e){var n=this.__data__;if(n instanceof _t){var r=n.__data__;if(!pt||r.length<199)return r.push([t,e]),this;n=this.__data__=new Lt(r)}return n.set(t,e),this};var Mt=ut?V(ut,Object):function(){return[]},Ut=function(t){return et.call(t)};function Dt(t,e){return!!(e=null==e?i:e)&&("number"==typeof t||j.test(t))&&t>-1&&t%1==0&&t-1&&t%1==0&&t<=i}(t.length)&&!Kt(t)}var Vt=ht||function(){return!1};function Kt(t){var e=Wt(t)?et.call(t):"";return e==a||e==c}function Wt(t){var e=typeof t;return!!t&&("object"==e||"function"==e)}function Zt(t){return $t(t)?function(t,e){var n=Ht(t)||function(t){return function(t){return function(t){return!!t&&"object"==typeof t}(t)&&$t(t)}(t)&&tt.call(t,"callee")&&(!at.call(t,"callee")||et.call(t)==s)}(t)?function(t,e){for(var n=-1,r=Array(t);++nc))return!1;var h=l.get(t);if(h&&l.get(e))return h==e;var d=-1,f=!0,p=n&s?new kt:void 0;for(l.set(t,e),l.set(e,t);++d-1},wt.prototype.set=function(t,e){var n=this.__data__,r=Lt(n,t);return r<0?(++this.size,n.push([t,e])):n[r][1]=e,this},qt.prototype.clear=function(){this.size=0,this.__data__={hash:new Et,map:new(ht||wt),string:new Et}},qt.prototype.delete=function(t){var e=Rt(this,t).delete(t);return this.size-=e?1:0,e},qt.prototype.get=function(t){return Rt(this,t).get(t)},qt.prototype.has=function(t){return Rt(this,t).has(t)},qt.prototype.set=function(t,e){var n=Rt(this,t),r=n.size;return n.set(t,e),this.size+=n.size==r?0:1,this},kt.prototype.add=kt.prototype.push=function(t){return this.__data__.set(t,r),this},kt.prototype.has=function(t){return this.__data__.has(t)},_t.prototype.clear=function(){this.__data__=new wt,this.size=0},_t.prototype.delete=function(t){var e=this.__data__,n=e.delete(t);return this.size=e.size,n},_t.prototype.get=function(t){return this.__data__.get(t)},_t.prototype.has=function(t){return this.__data__.has(t)},_t.prototype.set=function(t,e){var n=this.__data__;if(n instanceof wt){var r=n.__data__;if(!ht||r.length<199)return r.push([t,e]),this.size=++n.size,this;n=this.__data__=new qt(r)}return n.set(t,e),this.size=n.size,this};var Bt=lt?function(t){return null==t?[]:(t=Object(t),function(e,n){for(var r=-1,i=null==e?0:e.length,s=0,o=[];++r-1&&t%1==0&&t-1&&t%1==0&&t<=o}function Kt(t){var e=typeof t;return null!=t&&("object"==e||"function"==e)}function Wt(t){return null!=t&&"object"==typeof t}var Zt=D?function(t){return function(e){return t(e)}}(D):function(t){return Wt(t)&&Vt(t.length)&&!!O[St(t)]};function Gt(t){return null!=(e=t)&&Vt(e.length)&&!$t(e)?function(t,e){var n=Ft(t),r=!n&&zt(t),i=!n&&!r&&Ht(t),s=!n&&!r&&!i&&Zt(t),o=n||r||i||s,l=o?function(t,e){for(var n=-1,r=Array(t);++n(null!=i[e]&&(t[e]=i[e]),t)),{}));for(const n in t)void 0!==t[n]&&void 0===e[n]&&(i[n]=t[n]);return Object.keys(i).length>0?i:void 0},t.diff=function(t={},e={}){"object"!=typeof t&&(t={}),"object"!=typeof e&&(e={});const n=Object.keys(t).concat(Object.keys(e)).reduce(((n,r)=>(i(t[r],e[r])||(n[r]=void 0===e[r]?null:e[r]),n)),{});return Object.keys(n).length>0?n:void 0},t.invert=function(t={},e={}){t=t||{};const n=Object.keys(e).reduce(((n,r)=>(e[r]!==t[r]&&void 0!==t[r]&&(n[r]=e[r]),n)),{});return Object.keys(t).reduce(((n,r)=>(t[r]!==e[r]&&void 0===e[r]&&(n[r]=null),n)),n)},t.transform=function(t,e,n=!1){if("object"!=typeof t)return e;if("object"!=typeof e)return;if(!n)return e;const r=Object.keys(e).reduce(((n,r)=>(void 0===t[r]&&(n[r]=e[r]),n)),{});return Object.keys(r).length>0?r:void 0}}(s||(s={})),e.default=s},5232:function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.AttributeMap=e.OpIterator=e.Op=void 0;const r=n(5090),i=n(9629),s=n(4162),o=n(1270);e.AttributeMap=o.default;const l=n(4123);e.Op=l.default;const a=n(7033);e.OpIterator=a.default;const c=String.fromCharCode(0),u=(t,e)=>{if("object"!=typeof t||null===t)throw new Error("cannot retain a "+typeof t);if("object"!=typeof e||null===e)throw new Error("cannot retain a "+typeof e);const n=Object.keys(t)[0];if(!n||n!==Object.keys(e)[0])throw new Error(`embed types not matched: ${n} != ${Object.keys(e)[0]}`);return[n,t[n],e[n]]};class h{constructor(t){Array.isArray(t)?this.ops=t:null!=t&&Array.isArray(t.ops)?this.ops=t.ops:this.ops=[]}static registerEmbed(t,e){this.handlers[t]=e}static unregisterEmbed(t){delete this.handlers[t]}static getHandler(t){const e=this.handlers[t];if(!e)throw new Error(`no handlers for embed type "${t}"`);return e}insert(t,e){const n={};return"string"==typeof t&&0===t.length?this:(n.insert=t,null!=e&&"object"==typeof e&&Object.keys(e).length>0&&(n.attributes=e),this.push(n))}delete(t){return t<=0?this:this.push({delete:t})}retain(t,e){if("number"==typeof t&&t<=0)return this;const n={retain:t};return null!=e&&"object"==typeof e&&Object.keys(e).length>0&&(n.attributes=e),this.push(n)}push(t){let e=this.ops.length,n=this.ops[e-1];if(t=i(t),"object"==typeof n){if("number"==typeof t.delete&&"number"==typeof n.delete)return this.ops[e-1]={delete:n.delete+t.delete},this;if("number"==typeof n.delete&&null!=t.insert&&(e-=1,n=this.ops[e-1],"object"!=typeof n))return this.ops.unshift(t),this;if(s(t.attributes,n.attributes)){if("string"==typeof t.insert&&"string"==typeof n.insert)return this.ops[e-1]={insert:n.insert+t.insert},"object"==typeof t.attributes&&(this.ops[e-1].attributes=t.attributes),this;if("number"==typeof t.retain&&"number"==typeof n.retain)return this.ops[e-1]={retain:n.retain+t.retain},"object"==typeof t.attributes&&(this.ops[e-1].attributes=t.attributes),this}}return e===this.ops.length?this.ops.push(t):this.ops.splice(e,0,t),this}chop(){const t=this.ops[this.ops.length-1];return t&&"number"==typeof t.retain&&!t.attributes&&this.ops.pop(),this}filter(t){return this.ops.filter(t)}forEach(t){this.ops.forEach(t)}map(t){return this.ops.map(t)}partition(t){const e=[],n=[];return this.forEach((r=>{(t(r)?e:n).push(r)})),[e,n]}reduce(t,e){return this.ops.reduce(t,e)}changeLength(){return this.reduce(((t,e)=>e.insert?t+l.default.length(e):e.delete?t-e.delete:t),0)}length(){return this.reduce(((t,e)=>t+l.default.length(e)),0)}slice(t=0,e=1/0){const n=[],r=new a.default(this.ops);let i=0;for(;i0&&n.next(i.retain-t)}const l=new h(r);for(;e.hasNext()||n.hasNext();)if("insert"===n.peekType())l.push(n.next());else if("delete"===e.peekType())l.push(e.next());else{const t=Math.min(e.peekLength(),n.peekLength()),r=e.next(t),i=n.next(t);if(i.retain){const a={};if("number"==typeof r.retain)a.retain="number"==typeof i.retain?t:i.retain;else if("number"==typeof i.retain)null==r.retain?a.insert=r.insert:a.retain=r.retain;else{const t=null==r.retain?"insert":"retain",[e,n,s]=u(r[t],i.retain),o=h.getHandler(e);a[t]={[e]:o.compose(n,s,"retain"===t)}}const c=o.default.compose(r.attributes,i.attributes,"number"==typeof r.retain);if(c&&(a.attributes=c),l.push(a),!n.hasNext()&&s(l.ops[l.ops.length-1],a)){const t=new h(e.rest());return l.concat(t).chop()}}else"number"==typeof i.delete&&("number"==typeof r.retain||"object"==typeof r.retain&&null!==r.retain)&&l.push(i)}return l.chop()}concat(t){const e=new h(this.ops.slice());return t.ops.length>0&&(e.push(t.ops[0]),e.ops=e.ops.concat(t.ops.slice(1))),e}diff(t,e){if(this.ops===t.ops)return new h;const n=[this,t].map((e=>e.map((n=>{if(null!=n.insert)return"string"==typeof n.insert?n.insert:c;throw new Error("diff() called "+(e===t?"on":"with")+" non-document")})).join(""))),i=new h,l=r(n[0],n[1],e,!0),u=new a.default(this.ops),d=new a.default(t.ops);return l.forEach((t=>{let e=t[1].length;for(;e>0;){let n=0;switch(t[0]){case r.INSERT:n=Math.min(d.peekLength(),e),i.push(d.next(n));break;case r.DELETE:n=Math.min(e,u.peekLength()),u.next(n),i.delete(n);break;case r.EQUAL:n=Math.min(u.peekLength(),d.peekLength(),e);const t=u.next(n),l=d.next(n);s(t.insert,l.insert)?i.retain(n,o.default.diff(t.attributes,l.attributes)):i.push(l).delete(n)}e-=n}})),i.chop()}eachLine(t,e="\n"){const n=new a.default(this.ops);let r=new h,i=0;for(;n.hasNext();){if("insert"!==n.peekType())return;const s=n.peek(),o=l.default.length(s)-n.peekLength(),a="string"==typeof s.insert?s.insert.indexOf(e,o)-o:-1;if(a<0)r.push(n.next());else if(a>0)r.push(n.next(a));else{if(!1===t(r,n.next(1).attributes||{},i))return;i+=1,r=new h}}r.length()>0&&t(r,{},i)}invert(t){const e=new h;return this.reduce(((n,r)=>{if(r.insert)e.delete(l.default.length(r));else{if("number"==typeof r.retain&&null==r.attributes)return e.retain(r.retain),n+r.retain;if(r.delete||"number"==typeof r.retain){const i=r.delete||r.retain;return t.slice(n,n+i).forEach((t=>{r.delete?e.push(t):r.retain&&r.attributes&&e.retain(l.default.length(t),o.default.invert(r.attributes,t.attributes))})),n+i}if("object"==typeof r.retain&&null!==r.retain){const i=t.slice(n,n+1),s=new a.default(i.ops).next(),[l,c,d]=u(r.retain,s.insert),f=h.getHandler(l);return e.retain({[l]:f.invert(c,d)},o.default.invert(r.attributes,s.attributes)),n+1}}return n}),0),e.chop()}transform(t,e=!1){if(e=!!e,"number"==typeof t)return this.transformPosition(t,e);const n=t,r=new a.default(this.ops),i=new a.default(n.ops),s=new h;for(;r.hasNext()||i.hasNext();)if("insert"!==r.peekType()||!e&&"insert"===i.peekType())if("insert"===i.peekType())s.push(i.next());else{const t=Math.min(r.peekLength(),i.peekLength()),n=r.next(t),l=i.next(t);if(n.delete)continue;if(l.delete)s.push(l);else{const r=n.retain,i=l.retain;let a="object"==typeof i&&null!==i?i:t;if("object"==typeof r&&null!==r&&"object"==typeof i&&null!==i){const t=Object.keys(r)[0];if(t===Object.keys(i)[0]){const n=h.getHandler(t);n&&(a={[t]:n.transform(r[t],i[t],e)})}}s.retain(a,o.default.transform(n.attributes,l.attributes,e))}}else s.retain(l.default.length(r.next()));return s.chop()}transformPosition(t,e=!1){e=!!e;const n=new a.default(this.ops);let r=0;for(;n.hasNext()&&r<=t;){const i=n.peekLength(),s=n.peekType();n.next(),"delete"!==s?("insert"===s&&(r=i-n?(t=i-n,this.index+=1,this.offset=0):this.offset+=t,"number"==typeof e.delete)return{delete:t};{const r={};return e.attributes&&(r.attributes=e.attributes),"number"==typeof e.retain?r.retain=t:"object"==typeof e.retain&&null!==e.retain?r.retain=e.retain:"string"==typeof e.insert?r.insert=e.insert.substr(n,t):r.insert=e.insert,r}}return{retain:1/0}}peek(){return this.ops[this.index]}peekLength(){return this.ops[this.index]?r.default.length(this.ops[this.index])-this.offset:1/0}peekType(){const t=this.ops[this.index];return t?"number"==typeof t.delete?"delete":"number"==typeof t.retain||"object"==typeof t.retain&&null!==t.retain?"retain":"insert":"retain"}rest(){if(this.hasNext()){if(0===this.offset)return this.ops.slice(this.index);{const t=this.offset,e=this.index,n=this.next(),r=this.ops.slice(this.index);return this.offset=t,this.index=e,[n].concat(r)}}return[]}}},8820:function(t,e,n){"use strict";n.d(e,{A:function(){return l}});var r=n(8138),i=function(t,e){for(var n=t.length;n--;)if((0,r.A)(t[n][0],e))return n;return-1},s=Array.prototype.splice;function o(t){var e=-1,n=null==t?0:t.length;for(this.clear();++e-1},o.prototype.set=function(t,e){var n=this.__data__,r=i(n,t);return r<0?(++this.size,n.push([t,e])):n[r][1]=e,this};var l=o},2461:function(t,e,n){"use strict";var r=n(2281),i=n(5507),s=(0,r.A)(i.A,"Map");e.A=s},3558:function(t,e,n){"use strict";n.d(e,{A:function(){return d}});var r=(0,n(2281).A)(Object,"create"),i=Object.prototype.hasOwnProperty,s=Object.prototype.hasOwnProperty;function o(t){var e=-1,n=null==t?0:t.length;for(this.clear();++e-1&&t%1==0&&tc))return!1;var h=s.get(t),d=s.get(e);if(h&&d)return h==e&&d==t;var f=-1,p=!0,g=2&n?new o:void 0;for(s.set(t,e),s.set(e,t);++f-1&&t%1==0&&t<=9007199254740991}},659:function(t,e){"use strict";e.A=function(t){var e=typeof t;return null!=t&&("object"==e||"function"==e)}},7948:function(t,e){"use strict";e.A=function(t){return null!=t&&"object"==typeof t}},5755:function(t,e,n){"use strict";n.d(e,{A:function(){return u}});var r=n(2159),i=n(1628),s=n(7948),o={};o["[object Float32Array]"]=o["[object Float64Array]"]=o["[object Int8Array]"]=o["[object Int16Array]"]=o["[object Int32Array]"]=o["[object Uint8Array]"]=o["[object Uint8ClampedArray]"]=o["[object Uint16Array]"]=o["[object Uint32Array]"]=!0,o["[object Arguments]"]=o["[object Array]"]=o["[object ArrayBuffer]"]=o["[object Boolean]"]=o["[object DataView]"]=o["[object Date]"]=o["[object Error]"]=o["[object Function]"]=o["[object Map]"]=o["[object Number]"]=o["[object Object]"]=o["[object RegExp]"]=o["[object Set]"]=o["[object String]"]=o["[object WeakMap]"]=!1;var l=n(5771),a=n(8795),c=a.A&&a.A.isTypedArray,u=c?(0,l.A)(c):function(t){return(0,s.A)(t)&&(0,i.A)(t.length)&&!!o[(0,r.A)(t)]}},3169:function(t,e,n){"use strict";n.d(e,{A:function(){return a}});var r=n(6753),i=n(501),s=(0,n(2217).A)(Object.keys,Object),o=Object.prototype.hasOwnProperty,l=n(3628),a=function(t){return(0,l.A)(t)?(0,r.A)(t):function(t){if(!(0,i.A)(t))return s(t);var e=[];for(var n in Object(t))o.call(t,n)&&"constructor"!=n&&e.push(n);return e}(t)}},2624:function(t,e,n){"use strict";n.d(e,{A:function(){return c}});var r=n(6753),i=n(659),s=n(501),o=Object.prototype.hasOwnProperty,l=function(t){if(!(0,i.A)(t))return function(t){var e=[];if(null!=t)for(var n in Object(t))e.push(n);return e}(t);var e=(0,s.A)(t),n=[];for(var r in t)("constructor"!=r||!e&&o.call(t,r))&&n.push(r);return n},a=n(3628),c=function(t){return(0,a.A)(t)?(0,r.A)(t,!0):l(t)}},8347:function(t,e,n){"use strict";n.d(e,{A:function(){return $}});var r,i,s,o,l=n(2673),a=n(6770),c=n(8138),u=function(t,e,n){(void 0!==n&&!(0,c.A)(t[e],n)||void 0===n&&!(e in t))&&(0,a.A)(t,e,n)},h=function(t,e,n){for(var r=-1,i=Object(t),s=n(t),o=s.length;o--;){var l=s[++r];if(!1===e(i[l],l,i))break}return t},d=n(3812),f=n(1827),p=n(4405),g=n(1683),m=n(8412),b=n(723),y=n(3628),v=n(7948),A=n(776),x=n(7572),N=n(659),E=n(2159),w=n(8769),q=Function.prototype,k=Object.prototype,_=q.toString,L=k.hasOwnProperty,S=_.call(Object),O=n(5755),T=function(t,e){if(("constructor"!==e||"function"!=typeof t[e])&&"__proto__"!=e)return t[e]},j=n(9601),C=n(2624),R=function(t,e,n,r,i,s,o){var l,a=T(t,n),c=T(e,n),h=o.get(c);if(h)u(t,n,h);else{var q=s?s(a,c,n+"",t,e,o):void 0,k=void 0===q;if(k){var R=(0,b.A)(c),I=!R&&(0,A.A)(c),B=!R&&!I&&(0,O.A)(c);q=c,R||I||B?(0,b.A)(a)?q=a:(l=a,(0,v.A)(l)&&(0,y.A)(l)?q=(0,p.A)(a):I?(k=!1,q=(0,d.A)(c,!0)):B?(k=!1,q=(0,f.A)(c,!0)):q=[]):function(t){if(!(0,v.A)(t)||"[object Object]"!=(0,E.A)(t))return!1;var e=(0,w.A)(t);if(null===e)return!0;var n=L.call(e,"constructor")&&e.constructor;return"function"==typeof n&&n instanceof n&&_.call(n)==S}(c)||(0,m.A)(c)?(q=a,(0,m.A)(a)?q=function(t){return(0,j.A)(t,(0,C.A)(t))}(a):(0,N.A)(a)&&!(0,x.A)(a)||(q=(0,g.A)(c))):k=!1}k&&(o.set(c,q),i(q,c,r,s,o),o.delete(c)),u(t,n,q)}},I=function t(e,n,r,i,s){e!==n&&h(n,(function(o,a){if(s||(s=new l.A),(0,N.A)(o))R(e,n,a,r,t,i,s);else{var c=i?i(T(e,a),o,a+"",e,n,s):void 0;void 0===c&&(c=o),u(e,a,c)}}),C.A)},B=function(t){return t},M=Math.max,U=n(7889),D=U.A?function(t,e){return(0,U.A)(t,"toString",{configurable:!0,enumerable:!1,value:(n=e,function(){return n}),writable:!0});var n}:B,P=Date.now,z=(r=D,i=0,s=0,function(){var t=P(),e=16-(t-s);if(s=t,e>0){if(++i>=800)return arguments[0]}else i=0;return r.apply(void 0,arguments)}),F=function(t,e){return z(function(t,e,n){return e=M(void 0===e?t.length-1:e,0),function(){for(var r=arguments,i=-1,s=M(r.length-e,0),o=Array(s);++i1?e[r-1]:void 0,s=r>2?e[2]:void 0;for(i=o.length>3&&"function"==typeof i?(r--,i):void 0,s&&function(t,e,n){if(!(0,N.A)(n))return!1;var r=typeof e;return!!("number"==r?(0,y.A)(n)&&(0,H.A)(e,n.length):"string"==r&&e in n)&&(0,c.A)(n[e],t)}(e[0],e[1],s)&&(i=r<3?void 0:i,r=1),t=Object(t);++n(t[t.TYPE=3]="TYPE",t[t.LEVEL=12]="LEVEL",t[t.ATTRIBUTE=13]="ATTRIBUTE",t[t.BLOT=14]="BLOT",t[t.INLINE=7]="INLINE",t[t.BLOCK=11]="BLOCK",t[t.BLOCK_BLOT=10]="BLOCK_BLOT",t[t.INLINE_BLOT=6]="INLINE_BLOT",t[t.BLOCK_ATTRIBUTE=9]="BLOCK_ATTRIBUTE",t[t.INLINE_ATTRIBUTE=5]="INLINE_ATTRIBUTE",t[t.ANY=15]="ANY",t))(r||{});class i{constructor(t,e,n={}){this.attrName=t,this.keyName=e;const i=r.TYPE&r.ATTRIBUTE;this.scope=null!=n.scope?n.scope&r.LEVEL|i:r.ATTRIBUTE,null!=n.whitelist&&(this.whitelist=n.whitelist)}static keys(t){return Array.from(t.attributes).map((t=>t.name))}add(t,e){return!!this.canAdd(t,e)&&(t.setAttribute(this.keyName,e),!0)}canAdd(t,e){return null==this.whitelist||("string"==typeof e?this.whitelist.indexOf(e.replace(/["']/g,""))>-1:this.whitelist.indexOf(e)>-1)}remove(t){t.removeAttribute(this.keyName)}value(t){const e=t.getAttribute(this.keyName);return this.canAdd(t,e)&&e?e:""}}class s extends Error{constructor(t){super(t="[Parchment] "+t),this.message=t,this.name=this.constructor.name}}const o=class t{constructor(){this.attributes={},this.classes={},this.tags={},this.types={}}static find(t,e=!1){if(null==t)return null;if(this.blots.has(t))return this.blots.get(t)||null;if(e){let n=null;try{n=t.parentNode}catch{return null}return this.find(n,e)}return null}create(e,n,r){const i=this.query(n);if(null==i)throw new s(`Unable to create ${n} blot`);const o=i,l=n instanceof Node||n.nodeType===Node.TEXT_NODE?n:o.create(r),a=new o(e,l,r);return t.blots.set(a.domNode,a),a}find(e,n=!1){return t.find(e,n)}query(t,e=r.ANY){let n;return"string"==typeof t?n=this.types[t]||this.attributes[t]:t instanceof Text||t.nodeType===Node.TEXT_NODE?n=this.types.text:"number"==typeof t?t&r.LEVEL&r.BLOCK?n=this.types.block:t&r.LEVEL&r.INLINE&&(n=this.types.inline):t instanceof Element&&((t.getAttribute("class")||"").split(/\s+/).some((t=>(n=this.classes[t],!!n))),n=n||this.tags[t.tagName]),null==n?null:"scope"in n&&e&r.LEVEL&n.scope&&e&r.TYPE&n.scope?n:null}register(...t){return t.map((t=>{const e="blotName"in t,n="attrName"in t;if(!e&&!n)throw new s("Invalid definition");if(e&&"abstract"===t.blotName)throw new s("Cannot register abstract class");const r=e?t.blotName:n?t.attrName:void 0;return this.types[r]=t,n?"string"==typeof t.keyName&&(this.attributes[t.keyName]=t):e&&(t.className&&(this.classes[t.className]=t),t.tagName&&(Array.isArray(t.tagName)?t.tagName=t.tagName.map((t=>t.toUpperCase())):t.tagName=t.tagName.toUpperCase(),(Array.isArray(t.tagName)?t.tagName:[t.tagName]).forEach((e=>{(null==this.tags[e]||null==t.className)&&(this.tags[e]=t)})))),t}))}};o.blots=new WeakMap;let l=o;function a(t,e){return(t.getAttribute("class")||"").split(/\s+/).filter((t=>0===t.indexOf(`${e}-`)))}const c=class extends i{static keys(t){return(t.getAttribute("class")||"").split(/\s+/).map((t=>t.split("-").slice(0,-1).join("-")))}add(t,e){return!!this.canAdd(t,e)&&(this.remove(t),t.classList.add(`${this.keyName}-${e}`),!0)}remove(t){a(t,this.keyName).forEach((e=>{t.classList.remove(e)})),0===t.classList.length&&t.removeAttribute("class")}value(t){const e=(a(t,this.keyName)[0]||"").slice(this.keyName.length+1);return this.canAdd(t,e)?e:""}};function u(t){const e=t.split("-"),n=e.slice(1).map((t=>t[0].toUpperCase()+t.slice(1))).join("");return e[0]+n}const h=class extends i{static keys(t){return(t.getAttribute("style")||"").split(";").map((t=>t.split(":")[0].trim()))}add(t,e){return!!this.canAdd(t,e)&&(t.style[u(this.keyName)]=e,!0)}remove(t){t.style[u(this.keyName)]="",t.getAttribute("style")||t.removeAttribute("style")}value(t){const e=t.style[u(this.keyName)];return this.canAdd(t,e)?e:""}},d=class{constructor(t){this.attributes={},this.domNode=t,this.build()}attribute(t,e){e?t.add(this.domNode,e)&&(null!=t.value(this.domNode)?this.attributes[t.attrName]=t:delete this.attributes[t.attrName]):(t.remove(this.domNode),delete this.attributes[t.attrName])}build(){this.attributes={};const t=l.find(this.domNode);if(null==t)return;const e=i.keys(this.domNode),n=c.keys(this.domNode),s=h.keys(this.domNode);e.concat(n).concat(s).forEach((e=>{const n=t.scroll.query(e,r.ATTRIBUTE);n instanceof i&&(this.attributes[n.attrName]=n)}))}copy(t){Object.keys(this.attributes).forEach((e=>{const n=this.attributes[e].value(this.domNode);t.format(e,n)}))}move(t){this.copy(t),Object.keys(this.attributes).forEach((t=>{this.attributes[t].remove(this.domNode)})),this.attributes={}}values(){return Object.keys(this.attributes).reduce(((t,e)=>(t[e]=this.attributes[e].value(this.domNode),t)),{})}},f=class{constructor(t,e){this.scroll=t,this.domNode=e,l.blots.set(e,this),this.prev=null,this.next=null}static create(t){if(null==this.tagName)throw new s("Blot definition missing tagName");let e,n;return Array.isArray(this.tagName)?("string"==typeof t?(n=t.toUpperCase(),parseInt(n,10).toString()===n&&(n=parseInt(n,10))):"number"==typeof t&&(n=t),e="number"==typeof n?document.createElement(this.tagName[n-1]):n&&this.tagName.indexOf(n)>-1?document.createElement(n):document.createElement(this.tagName[0])):e=document.createElement(this.tagName),this.className&&e.classList.add(this.className),e}get statics(){return this.constructor}attach(){}clone(){const t=this.domNode.cloneNode(!1);return this.scroll.create(t)}detach(){null!=this.parent&&this.parent.removeChild(this),l.blots.delete(this.domNode)}deleteAt(t,e){this.isolate(t,e).remove()}formatAt(t,e,n,i){const s=this.isolate(t,e);if(null!=this.scroll.query(n,r.BLOT)&&i)s.wrap(n,i);else if(null!=this.scroll.query(n,r.ATTRIBUTE)){const t=this.scroll.create(this.statics.scope);s.wrap(t),t.format(n,i)}}insertAt(t,e,n){const r=null==n?this.scroll.create("text",e):this.scroll.create(e,n),i=this.split(t);this.parent.insertBefore(r,i||void 0)}isolate(t,e){const n=this.split(t);if(null==n)throw new Error("Attempt to isolate at end");return n.split(e),n}length(){return 1}offset(t=this.parent){return null==this.parent||this===t?0:this.parent.children.offset(this)+this.parent.offset(t)}optimize(t){this.statics.requiredContainer&&!(this.parent instanceof this.statics.requiredContainer)&&this.wrap(this.statics.requiredContainer.blotName)}remove(){null!=this.domNode.parentNode&&this.domNode.parentNode.removeChild(this.domNode),this.detach()}replaceWith(t,e){const n="string"==typeof t?this.scroll.create(t,e):t;return null!=this.parent&&(this.parent.insertBefore(n,this.next||void 0),this.remove()),n}split(t,e){return 0===t?this:this.next}update(t,e){}wrap(t,e){const n="string"==typeof t?this.scroll.create(t,e):t;if(null!=this.parent&&this.parent.insertBefore(n,this.next||void 0),"function"!=typeof n.appendChild)throw new s(`Cannot wrap ${t}`);return n.appendChild(this),n}};f.blotName="abstract";let p=f;const g=class extends p{static value(t){return!0}index(t,e){return this.domNode===t||this.domNode.compareDocumentPosition(t)&Node.DOCUMENT_POSITION_CONTAINED_BY?Math.min(e,1):-1}position(t,e){let n=Array.from(this.parent.domNode.childNodes).indexOf(this.domNode);return t>0&&(n+=1),[this.parent.domNode,n]}value(){return{[this.statics.blotName]:this.statics.value(this.domNode)||!0}}};g.scope=r.INLINE_BLOT;const m=g;class b{constructor(){this.head=null,this.tail=null,this.length=0}append(...t){if(this.insertBefore(t[0],null),t.length>1){const e=t.slice(1);this.append(...e)}}at(t){const e=this.iterator();let n=e();for(;n&&t>0;)t-=1,n=e();return n}contains(t){const e=this.iterator();let n=e();for(;n;){if(n===t)return!0;n=e()}return!1}indexOf(t){const e=this.iterator();let n=e(),r=0;for(;n;){if(n===t)return r;r+=1,n=e()}return-1}insertBefore(t,e){null!=t&&(this.remove(t),t.next=e,null!=e?(t.prev=e.prev,null!=e.prev&&(e.prev.next=t),e.prev=t,e===this.head&&(this.head=t)):null!=this.tail?(this.tail.next=t,t.prev=this.tail,this.tail=t):(t.prev=null,this.head=this.tail=t),this.length+=1)}offset(t){let e=0,n=this.head;for(;null!=n;){if(n===t)return e;e+=n.length(),n=n.next}return-1}remove(t){this.contains(t)&&(null!=t.prev&&(t.prev.next=t.next),null!=t.next&&(t.next.prev=t.prev),t===this.head&&(this.head=t.next),t===this.tail&&(this.tail=t.prev),this.length-=1)}iterator(t=this.head){return()=>{const e=t;return null!=t&&(t=t.next),e}}find(t,e=!1){const n=this.iterator();let r=n();for(;r;){const i=r.length();if(ts?n(l,t-s,Math.min(e,s+r-t)):n(l,0,Math.min(r,t+e-s)),s+=r,l=o()}}map(t){return this.reduce(((e,n)=>(e.push(t(n)),e)),[])}reduce(t,e){const n=this.iterator();let r=n();for(;r;)e=t(e,r),r=n();return e}}function y(t,e){const n=e.find(t);if(n)return n;try{return e.create(t)}catch{const n=e.create(r.INLINE);return Array.from(t.childNodes).forEach((t=>{n.domNode.appendChild(t)})),t.parentNode&&t.parentNode.replaceChild(n.domNode,t),n.attach(),n}}const v=class t extends p{constructor(t,e){super(t,e),this.uiNode=null,this.build()}appendChild(t){this.insertBefore(t)}attach(){super.attach(),this.children.forEach((t=>{t.attach()}))}attachUI(e){null!=this.uiNode&&this.uiNode.remove(),this.uiNode=e,t.uiClass&&this.uiNode.classList.add(t.uiClass),this.uiNode.setAttribute("contenteditable","false"),this.domNode.insertBefore(this.uiNode,this.domNode.firstChild)}build(){this.children=new b,Array.from(this.domNode.childNodes).filter((t=>t!==this.uiNode)).reverse().forEach((t=>{try{const e=y(t,this.scroll);this.insertBefore(e,this.children.head||void 0)}catch(t){if(t instanceof s)return;throw t}}))}deleteAt(t,e){if(0===t&&e===this.length())return this.remove();this.children.forEachAt(t,e,((t,e,n)=>{t.deleteAt(e,n)}))}descendant(e,n=0){const[r,i]=this.children.find(n);return null==e.blotName&&e(r)||null!=e.blotName&&r instanceof e?[r,i]:r instanceof t?r.descendant(e,i):[null,-1]}descendants(e,n=0,r=Number.MAX_VALUE){let i=[],s=r;return this.children.forEachAt(n,r,((n,r,o)=>{(null==e.blotName&&e(n)||null!=e.blotName&&n instanceof e)&&i.push(n),n instanceof t&&(i=i.concat(n.descendants(e,r,s))),s-=o})),i}detach(){this.children.forEach((t=>{t.detach()})),super.detach()}enforceAllowedChildren(){let e=!1;this.children.forEach((n=>{e||this.statics.allowedChildren.some((t=>n instanceof t))||(n.statics.scope===r.BLOCK_BLOT?(null!=n.next&&this.splitAfter(n),null!=n.prev&&this.splitAfter(n.prev),n.parent.unwrap(),e=!0):n instanceof t?n.unwrap():n.remove())}))}formatAt(t,e,n,r){this.children.forEachAt(t,e,((t,e,i)=>{t.formatAt(e,i,n,r)}))}insertAt(t,e,n){const[r,i]=this.children.find(t);if(r)r.insertAt(i,e,n);else{const t=null==n?this.scroll.create("text",e):this.scroll.create(e,n);this.appendChild(t)}}insertBefore(t,e){null!=t.parent&&t.parent.children.remove(t);let n=null;this.children.insertBefore(t,e||null),t.parent=this,null!=e&&(n=e.domNode),(this.domNode.parentNode!==t.domNode||this.domNode.nextSibling!==n)&&this.domNode.insertBefore(t.domNode,n),t.attach()}length(){return this.children.reduce(((t,e)=>t+e.length()),0)}moveChildren(t,e){this.children.forEach((n=>{t.insertBefore(n,e)}))}optimize(t){if(super.optimize(t),this.enforceAllowedChildren(),null!=this.uiNode&&this.uiNode!==this.domNode.firstChild&&this.domNode.insertBefore(this.uiNode,this.domNode.firstChild),0===this.children.length)if(null!=this.statics.defaultChild){const t=this.scroll.create(this.statics.defaultChild.blotName);this.appendChild(t)}else this.remove()}path(e,n=!1){const[r,i]=this.children.find(e,n),s=[[this,e]];return r instanceof t?s.concat(r.path(i,n)):(null!=r&&s.push([r,i]),s)}removeChild(t){this.children.remove(t)}replaceWith(e,n){const r="string"==typeof e?this.scroll.create(e,n):e;return r instanceof t&&this.moveChildren(r),super.replaceWith(r)}split(t,e=!1){if(!e){if(0===t)return this;if(t===this.length())return this.next}const n=this.clone();return this.parent&&this.parent.insertBefore(n,this.next||void 0),this.children.forEachAt(t,this.length(),((t,r,i)=>{const s=t.split(r,e);null!=s&&n.appendChild(s)})),n}splitAfter(t){const e=this.clone();for(;null!=t.next;)e.appendChild(t.next);return this.parent&&this.parent.insertBefore(e,this.next||void 0),e}unwrap(){this.parent&&this.moveChildren(this.parent,this.next||void 0),this.remove()}update(t,e){const n=[],r=[];t.forEach((t=>{t.target===this.domNode&&"childList"===t.type&&(n.push(...t.addedNodes),r.push(...t.removedNodes))})),r.forEach((t=>{if(null!=t.parentNode&&"IFRAME"!==t.tagName&&document.body.compareDocumentPosition(t)&Node.DOCUMENT_POSITION_CONTAINED_BY)return;const e=this.scroll.find(t);null!=e&&(null==e.domNode.parentNode||e.domNode.parentNode===this.domNode)&&e.detach()})),n.filter((t=>t.parentNode===this.domNode&&t!==this.uiNode)).sort(((t,e)=>t===e?0:t.compareDocumentPosition(e)&Node.DOCUMENT_POSITION_FOLLOWING?1:-1)).forEach((t=>{let e=null;null!=t.nextSibling&&(e=this.scroll.find(t.nextSibling));const n=y(t,this.scroll);(n.next!==e||null==n.next)&&(null!=n.parent&&n.parent.removeChild(this),this.insertBefore(n,e||void 0))})),this.enforceAllowedChildren()}};v.uiClass="";const A=v,x=class t extends A{static create(t){return super.create(t)}static formats(e,n){const r=n.query(t.blotName);if(null==r||e.tagName!==r.tagName){if("string"==typeof this.tagName)return!0;if(Array.isArray(this.tagName))return e.tagName.toLowerCase()}}constructor(t,e){super(t,e),this.attributes=new d(this.domNode)}format(e,n){if(e!==this.statics.blotName||n){const t=this.scroll.query(e,r.INLINE);if(null==t)return;t instanceof i?this.attributes.attribute(t,n):n&&(e!==this.statics.blotName||this.formats()[e]!==n)&&this.replaceWith(e,n)}else this.children.forEach((e=>{e instanceof t||(e=e.wrap(t.blotName,!0)),this.attributes.copy(e)})),this.unwrap()}formats(){const t=this.attributes.values(),e=this.statics.formats(this.domNode,this.scroll);return null!=e&&(t[this.statics.blotName]=e),t}formatAt(t,e,n,i){null!=this.formats()[n]||this.scroll.query(n,r.ATTRIBUTE)?this.isolate(t,e).format(n,i):super.formatAt(t,e,n,i)}optimize(e){super.optimize(e);const n=this.formats();if(0===Object.keys(n).length)return this.unwrap();const r=this.next;r instanceof t&&r.prev===this&&function(t,e){if(Object.keys(t).length!==Object.keys(e).length)return!1;for(const n in t)if(t[n]!==e[n])return!1;return!0}(n,r.formats())&&(r.moveChildren(this),r.remove())}replaceWith(t,e){const n=super.replaceWith(t,e);return this.attributes.copy(n),n}update(t,e){super.update(t,e),t.some((t=>t.target===this.domNode&&"attributes"===t.type))&&this.attributes.build()}wrap(e,n){const r=super.wrap(e,n);return r instanceof t&&this.attributes.move(r),r}};x.allowedChildren=[x,m],x.blotName="inline",x.scope=r.INLINE_BLOT,x.tagName="SPAN";const N=x,E=class t extends A{static create(t){return super.create(t)}static formats(e,n){const r=n.query(t.blotName);if(null==r||e.tagName!==r.tagName){if("string"==typeof this.tagName)return!0;if(Array.isArray(this.tagName))return e.tagName.toLowerCase()}}constructor(t,e){super(t,e),this.attributes=new d(this.domNode)}format(e,n){const s=this.scroll.query(e,r.BLOCK);null!=s&&(s instanceof i?this.attributes.attribute(s,n):e!==this.statics.blotName||n?n&&(e!==this.statics.blotName||this.formats()[e]!==n)&&this.replaceWith(e,n):this.replaceWith(t.blotName))}formats(){const t=this.attributes.values(),e=this.statics.formats(this.domNode,this.scroll);return null!=e&&(t[this.statics.blotName]=e),t}formatAt(t,e,n,i){null!=this.scroll.query(n,r.BLOCK)?this.format(n,i):super.formatAt(t,e,n,i)}insertAt(t,e,n){if(null==n||null!=this.scroll.query(e,r.INLINE))super.insertAt(t,e,n);else{const r=this.split(t);if(null==r)throw new Error("Attempt to insertAt after block boundaries");{const t=this.scroll.create(e,n);r.parent.insertBefore(t,r)}}}replaceWith(t,e){const n=super.replaceWith(t,e);return this.attributes.copy(n),n}update(t,e){super.update(t,e),t.some((t=>t.target===this.domNode&&"attributes"===t.type))&&this.attributes.build()}};E.blotName="block",E.scope=r.BLOCK_BLOT,E.tagName="P",E.allowedChildren=[N,E,m];const w=E,q=class extends A{checkMerge(){return null!==this.next&&this.next.statics.blotName===this.statics.blotName}deleteAt(t,e){super.deleteAt(t,e),this.enforceAllowedChildren()}formatAt(t,e,n,r){super.formatAt(t,e,n,r),this.enforceAllowedChildren()}insertAt(t,e,n){super.insertAt(t,e,n),this.enforceAllowedChildren()}optimize(t){super.optimize(t),this.children.length>0&&null!=this.next&&this.checkMerge()&&(this.next.moveChildren(this),this.next.remove())}};q.blotName="container",q.scope=r.BLOCK_BLOT;const k=q,_=class extends m{static formats(t,e){}format(t,e){super.formatAt(0,this.length(),t,e)}formatAt(t,e,n,r){0===t&&e===this.length()?this.format(n,r):super.formatAt(t,e,n,r)}formats(){return this.statics.formats(this.domNode,this.scroll)}},L={attributes:!0,characterData:!0,characterDataOldValue:!0,childList:!0,subtree:!0},S=class extends A{constructor(t,e){super(null,e),this.registry=t,this.scroll=this,this.build(),this.observer=new MutationObserver((t=>{this.update(t)})),this.observer.observe(this.domNode,L),this.attach()}create(t,e){return this.registry.create(this,t,e)}find(t,e=!1){const n=this.registry.find(t,e);return n?n.scroll===this?n:e?this.find(n.scroll.domNode.parentNode,!0):null:null}query(t,e=r.ANY){return this.registry.query(t,e)}register(...t){return this.registry.register(...t)}build(){null!=this.scroll&&super.build()}detach(){super.detach(),this.observer.disconnect()}deleteAt(t,e){this.update(),0===t&&e===this.length()?this.children.forEach((t=>{t.remove()})):super.deleteAt(t,e)}formatAt(t,e,n,r){this.update(),super.formatAt(t,e,n,r)}insertAt(t,e,n){this.update(),super.insertAt(t,e,n)}optimize(t=[],e={}){super.optimize(e);const n=e.mutationsMap||new WeakMap;let r=Array.from(this.observer.takeRecords());for(;r.length>0;)t.push(r.pop());const i=(t,e=!0)=>{null==t||t===this||null!=t.domNode.parentNode&&(n.has(t.domNode)||n.set(t.domNode,[]),e&&i(t.parent))},s=t=>{n.has(t.domNode)&&(t instanceof A&&t.children.forEach(s),n.delete(t.domNode),t.optimize(e))};let o=t;for(let e=0;o.length>0;e+=1){if(e>=100)throw new Error("[Parchment] Maximum optimize iterations reached");for(o.forEach((t=>{const e=this.find(t.target,!0);null!=e&&(e.domNode===t.target&&("childList"===t.type?(i(this.find(t.previousSibling,!1)),Array.from(t.addedNodes).forEach((t=>{const e=this.find(t,!1);i(e,!1),e instanceof A&&e.children.forEach((t=>{i(t,!1)}))}))):"attributes"===t.type&&i(e.prev)),i(e))})),this.children.forEach(s),o=Array.from(this.observer.takeRecords()),r=o.slice();r.length>0;)t.push(r.pop())}}update(t,e={}){t=t||this.observer.takeRecords();const n=new WeakMap;t.map((t=>{const e=this.find(t.target,!0);return null==e?null:n.has(e.domNode)?(n.get(e.domNode).push(t),null):(n.set(e.domNode,[t]),e)})).forEach((t=>{null!=t&&t!==this&&n.has(t.domNode)&&t.update(n.get(t.domNode)||[],e)})),e.mutationsMap=n,n.has(this.domNode)&&super.update(n.get(this.domNode),e),this.optimize(t,e)}};S.blotName="scroll",S.defaultChild=w,S.allowedChildren=[w,k],S.scope=r.BLOCK_BLOT,S.tagName="DIV";const O=S,T=class t extends m{static create(t){return document.createTextNode(t)}static value(t){return t.data}constructor(t,e){super(t,e),this.text=this.statics.value(this.domNode)}deleteAt(t,e){this.domNode.data=this.text=this.text.slice(0,t)+this.text.slice(t+e)}index(t,e){return this.domNode===t?e:-1}insertAt(t,e,n){null==n?(this.text=this.text.slice(0,t)+e+this.text.slice(t),this.domNode.data=this.text):super.insertAt(t,e,n)}length(){return this.text.length}optimize(e){super.optimize(e),this.text=this.statics.value(this.domNode),0===this.text.length?this.remove():this.next instanceof t&&this.next.prev===this&&(this.insertAt(this.length(),this.next.value()),this.next.remove())}position(t,e=!1){return[this.domNode,t]}split(t,e=!1){if(!e){if(0===t)return this;if(t===this.length())return this.next}const n=this.scroll.create(this.domNode.splitText(t));return this.parent.insertBefore(n,this.next||void 0),this.text=this.statics.value(this.domNode),n}update(t,e){t.some((t=>"characterData"===t.type&&t.target===this.domNode))&&(this.text=this.statics.value(this.domNode))}value(){return this.text}};T.blotName="text",T.scope=r.INLINE_BLOT;const j=T}},e={};function n(r){var i=e[r];if(void 0!==i)return i.exports;var s=e[r]={id:r,loaded:!1,exports:{}};return t[r](s,s.exports,n),s.loaded=!0,s.exports}n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,{a:e}),e},n.d=function(t,e){for(var r in e)n.o(e,r)&&!n.o(t,r)&&Object.defineProperty(t,r,{enumerable:!0,get:e[r]})},n.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(t){if("object"==typeof window)return window}}(),n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},n.nmd=function(t){return t.paths=[],t.children||(t.children=[]),t};var r={};return function(){"use strict";n.d(r,{default:function(){return It}});var t=n(3729),e=n(8276),i=n(7912),s=n(6003);class o extends s.ClassAttributor{add(t,e){let n=0;if("+1"===e||"-1"===e){const r=this.value(t)||0;n="+1"===e?r+1:r-1}else"number"==typeof e&&(n=e);return 0===n?(this.remove(t),!0):super.add(t,n.toString())}canAdd(t,e){return super.canAdd(t,e)||super.canAdd(t,parseInt(e,10))}value(t){return parseInt(super.value(t),10)||void 0}}var l=new o("indent","ql-indent",{scope:s.Scope.BLOCK,whitelist:[1,2,3,4,5,6,7,8]}),a=n(9698);class c extends a.Ay{static blotName="blockquote";static tagName="blockquote"}var u=c;class h extends a.Ay{static blotName="header";static tagName=["H1","H2","H3","H4","H5","H6"];static formats(t){return this.tagName.indexOf(t.tagName)+1}}var d=h,f=n(580),p=n(6142);class g extends f.A{}g.blotName="list-container",g.tagName="OL";class m extends a.Ay{static create(t){const e=super.create();return e.setAttribute("data-list",t),e}static formats(t){return t.getAttribute("data-list")||void 0}static register(){p.Ay.register(g)}constructor(t,e){super(t,e);const n=e.ownerDocument.createElement("span"),r=n=>{if(!t.isEnabled())return;const r=this.statics.formats(e,t);"checked"===r?(this.format("list","unchecked"),n.preventDefault()):"unchecked"===r&&(this.format("list","checked"),n.preventDefault())};n.addEventListener("mousedown",r),n.addEventListener("touchstart",r),this.attachUI(n)}format(t,e){t===this.statics.blotName&&e?this.domNode.setAttribute("data-list",e):super.format(t,e)}}m.blotName="list",m.tagName="LI",g.allowedChildren=[m],m.requiredContainer=g;var b=n(9541),y=n(8638),v=n(6772),A=n(664),x=n(4850);class N extends x.A{static blotName="bold";static tagName=["STRONG","B"];static create(){return super.create()}static formats(){return!0}optimize(t){super.optimize(t),this.domNode.tagName!==this.statics.tagName[0]&&this.replaceWith(this.statics.blotName)}}var E=N;class w extends x.A{static blotName="link";static tagName="A";static SANITIZED_URL="about:blank";static PROTOCOL_WHITELIST=["http","https","mailto","tel","sms"];static create(t){const e=super.create(t);return e.setAttribute("href",this.sanitize(t)),e.setAttribute("rel","noopener noreferrer"),e.setAttribute("target","_blank"),e}static formats(t){return t.getAttribute("href")}static sanitize(t){return q(t,this.PROTOCOL_WHITELIST)?t:this.SANITIZED_URL}format(t,e){t===this.statics.blotName&&e?this.domNode.setAttribute("href",this.constructor.sanitize(e)):super.format(t,e)}}function q(t,e){const n=document.createElement("a");n.href=t;const r=n.href.slice(0,n.href.indexOf(":"));return e.indexOf(r)>-1}class k extends x.A{static blotName="script";static tagName=["SUB","SUP"];static create(t){return"super"===t?document.createElement("sup"):"sub"===t?document.createElement("sub"):super.create(t)}static formats(t){return"SUB"===t.tagName?"sub":"SUP"===t.tagName?"super":void 0}}var _=k;class L extends x.A{static blotName="underline";static tagName="U"}var S=L,O=n(746);class T extends O.A{static blotName="formula";static className="ql-formula";static tagName="SPAN";static create(t){if(null==window.katex)throw new Error("Formula module requires KaTeX.");const e=super.create(t);return"string"==typeof t&&(window.katex.render(t,e,{throwOnError:!1,errorColor:"#f00"}),e.setAttribute("data-value",t)),e}static value(t){return t.getAttribute("data-value")}html(){const{formula:t}=this.value();return`${t}`}}var j=T;const C=["alt","height","width"];class R extends s.EmbedBlot{static blotName="image";static tagName="IMG";static create(t){const e=super.create(t);return"string"==typeof t&&e.setAttribute("src",this.sanitize(t)),e}static formats(t){return C.reduce(((e,n)=>(t.hasAttribute(n)&&(e[n]=t.getAttribute(n)),e)),{})}static match(t){return/\.(jpe?g|gif|png)$/.test(t)||/^data:image\/.+;base64/.test(t)}static sanitize(t){return q(t,["http","https","data"])?t:"//:0"}static value(t){return t.getAttribute("src")}format(t,e){C.indexOf(t)>-1?e?this.domNode.setAttribute(t,e):this.domNode.removeAttribute(t):super.format(t,e)}}var I=R;const B=["height","width"];class M extends a.zo{static blotName="video";static className="ql-video";static tagName="IFRAME";static create(t){const e=super.create(t);return e.setAttribute("frameborder","0"),e.setAttribute("allowfullscreen","true"),e.setAttribute("src",this.sanitize(t)),e}static formats(t){return B.reduce(((e,n)=>(t.hasAttribute(n)&&(e[n]=t.getAttribute(n)),e)),{})}static sanitize(t){return w.sanitize(t)}static value(t){return t.getAttribute("src")}format(t,e){B.indexOf(t)>-1?e?this.domNode.setAttribute(t,e):this.domNode.removeAttribute(t):super.format(t,e)}html(){const{video:t}=this.value();return`
    ${t}`}}var U=M,D=n(9404),P=n(5232),z=n.n(P),F=n(4266),H=n(3036),$=n(4541),V=n(5508),K=n(584);const W=new s.ClassAttributor("code-token","hljs",{scope:s.Scope.INLINE});class Z extends x.A{static formats(t,e){for(;null!=t&&t!==e.domNode;){if(t.classList&&t.classList.contains(D.Ay.className))return super.formats(t,e);t=t.parentNode}}constructor(t,e,n){super(t,e,n),W.add(this.domNode,n)}format(t,e){t!==Z.blotName?super.format(t,e):e?W.add(this.domNode,e):(W.remove(this.domNode),this.domNode.classList.remove(this.statics.className))}optimize(){super.optimize(...arguments),W.value(this.domNode)||this.unwrap()}}Z.blotName="code-token",Z.className="ql-token";class G extends D.Ay{static create(t){const e=super.create(t);return"string"==typeof t&&e.setAttribute("data-language",t),e}static formats(t){return t.getAttribute("data-language")||"plain"}static register(){}format(t,e){t===this.statics.blotName&&e?this.domNode.setAttribute("data-language",e):super.format(t,e)}replaceWith(t,e){return this.formatAt(0,this.length(),Z.blotName,!1),super.replaceWith(t,e)}}class X extends D.EJ{attach(){super.attach(),this.forceNext=!1,this.scroll.emitMount(this)}format(t,e){t===G.blotName&&(this.forceNext=!0,this.children.forEach((n=>{n.format(t,e)})))}formatAt(t,e,n,r){n===G.blotName&&(this.forceNext=!0),super.formatAt(t,e,n,r)}highlight(t){let e=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(null==this.children.head)return;const n=`${Array.from(this.domNode.childNodes).filter((t=>t!==this.uiNode)).map((t=>t.textContent)).join("\n")}\n`,r=G.formats(this.children.head.domNode);if(e||this.forceNext||this.cachedText!==n){if(n.trim().length>0||null==this.cachedText){const e=this.children.reduce(((t,e)=>t.concat((0,a.mG)(e,!1))),new(z())),i=t(n,r);e.diff(i).reduce(((t,e)=>{let{retain:n,attributes:r}=e;return n?(r&&Object.keys(r).forEach((e=>{[G.blotName,Z.blotName].includes(e)&&this.formatAt(t,n,e,r[e])})),t+n):t}),0)}this.cachedText=n,this.forceNext=!1}}html(t,e){const[n]=this.children.find(t);return`
    \n${(0,V.X)(this.code(t,e))}\n
    `}optimize(t){if(super.optimize(t),null!=this.parent&&null!=this.children.head&&null!=this.uiNode){const t=G.formats(this.children.head.domNode);t!==this.uiNode.value&&(this.uiNode.value=t)}}}X.allowedChildren=[G],G.requiredContainer=X,G.allowedChildren=[Z,$.A,V.A,H.A];class Q extends F.A{static register(){p.Ay.register(Z,!0),p.Ay.register(G,!0),p.Ay.register(X,!0)}constructor(t,e){if(super(t,e),null==this.options.hljs)throw new Error("Syntax module requires highlight.js. Please include the library on the page before Quill.");this.languages=this.options.languages.reduce(((t,e)=>{let{key:n}=e;return t[n]=!0,t}),{}),this.highlightBlot=this.highlightBlot.bind(this),this.initListener(),this.initTimer()}initListener(){this.quill.on(p.Ay.events.SCROLL_BLOT_MOUNT,(t=>{if(!(t instanceof X))return;const e=this.quill.root.ownerDocument.createElement("select");this.options.languages.forEach((t=>{let{key:n,label:r}=t;const i=e.ownerDocument.createElement("option");i.textContent=r,i.setAttribute("value",n),e.appendChild(i)})),e.addEventListener("change",(()=>{t.format(G.blotName,e.value),this.quill.root.focus(),this.highlight(t,!0)})),null==t.uiNode&&(t.attachUI(e),t.children.head&&(e.value=G.formats(t.children.head.domNode)))}))}initTimer(){let t=null;this.quill.on(p.Ay.events.SCROLL_OPTIMIZE,(()=>{t&&clearTimeout(t),t=setTimeout((()=>{this.highlight(),t=null}),this.options.interval)}))}highlight(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,e=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(this.quill.selection.composing)return;this.quill.update(p.Ay.sources.USER);const n=this.quill.getSelection();(null==t?this.quill.scroll.descendants(X):[t]).forEach((t=>{t.highlight(this.highlightBlot,e)})),this.quill.update(p.Ay.sources.SILENT),null!=n&&this.quill.setSelection(n,p.Ay.sources.SILENT)}highlightBlot(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"plain";if(e=this.languages[e]?e:"plain","plain"===e)return(0,V.X)(t).split("\n").reduce(((t,n,r)=>(0!==r&&t.insert("\n",{[D.Ay.blotName]:e}),t.insert(n))),new(z()));const n=this.quill.root.ownerDocument.createElement("div");return n.classList.add(D.Ay.className),n.innerHTML=((t,e,n)=>{if("string"==typeof t.versionString){const r=t.versionString.split(".")[0];if(parseInt(r,10)>=11)return t.highlight(n,{language:e}).value}return t.highlight(e,n).value})(this.options.hljs,e,t),(0,K.hV)(this.quill.scroll,n,[(t,e)=>{const n=W.value(t);return n?e.compose((new(z())).retain(e.length(),{[Z.blotName]:n})):e}],[(t,n)=>t.data.split("\n").reduce(((t,n,r)=>(0!==r&&t.insert("\n",{[D.Ay.blotName]:e}),t.insert(n))),n)],new WeakMap)}}Q.DEFAULTS={hljs:window.hljs,interval:1e3,languages:[{key:"plain",label:"Plain"},{key:"bash",label:"Bash"},{key:"cpp",label:"C++"},{key:"cs",label:"C#"},{key:"css",label:"CSS"},{key:"diff",label:"Diff"},{key:"xml",label:"HTML/XML"},{key:"java",label:"Java"},{key:"javascript",label:"JavaScript"},{key:"markdown",label:"Markdown"},{key:"php",label:"PHP"},{key:"python",label:"Python"},{key:"ruby",label:"Ruby"},{key:"sql",label:"SQL"}]};class J extends a.Ay{static blotName="table";static tagName="TD";static create(t){const e=super.create();return t?e.setAttribute("data-row",t):e.setAttribute("data-row",nt()),e}static formats(t){if(t.hasAttribute("data-row"))return t.getAttribute("data-row")}cellOffset(){return this.parent?this.parent.children.indexOf(this):-1}format(t,e){t===J.blotName&&e?this.domNode.setAttribute("data-row",e):super.format(t,e)}row(){return this.parent}rowOffset(){return this.row()?this.row().rowOffset():-1}table(){return this.row()&&this.row().table()}}class Y extends f.A{static blotName="table-row";static tagName="TR";checkMerge(){if(super.checkMerge()&&null!=this.next.children.head){const t=this.children.head.formats(),e=this.children.tail.formats(),n=this.next.children.head.formats(),r=this.next.children.tail.formats();return t.table===e.table&&t.table===n.table&&t.table===r.table}return!1}optimize(t){super.optimize(t),this.children.forEach((t=>{if(null==t.next)return;const e=t.formats(),n=t.next.formats();if(e.table!==n.table){const e=this.splitAfter(t);e&&e.optimize(),this.prev&&this.prev.optimize()}}))}rowOffset(){return this.parent?this.parent.children.indexOf(this):-1}table(){return this.parent&&this.parent.parent}}class tt extends f.A{static blotName="table-body";static tagName="TBODY"}class et extends f.A{static blotName="table-container";static tagName="TABLE";balanceCells(){const t=this.descendants(Y),e=t.reduce(((t,e)=>Math.max(e.children.length,t)),0);t.forEach((t=>{new Array(e-t.children.length).fill(0).forEach((()=>{let e;null!=t.children.head&&(e=J.formats(t.children.head.domNode));const n=this.scroll.create(J.blotName,e);t.appendChild(n),n.optimize()}))}))}cells(t){return this.rows().map((e=>e.children.at(t)))}deleteColumn(t){const[e]=this.descendant(tt);null!=e&&null!=e.children.head&&e.children.forEach((e=>{const n=e.children.at(t);null!=n&&n.remove()}))}insertColumn(t){const[e]=this.descendant(tt);null!=e&&null!=e.children.head&&e.children.forEach((e=>{const n=e.children.at(t),r=J.formats(e.children.head.domNode),i=this.scroll.create(J.blotName,r);e.insertBefore(i,n)}))}insertRow(t){const[e]=this.descendant(tt);if(null==e||null==e.children.head)return;const n=nt(),r=this.scroll.create(Y.blotName);e.children.head.children.forEach((()=>{const t=this.scroll.create(J.blotName,n);r.appendChild(t)}));const i=e.children.at(t);e.insertBefore(r,i)}rows(){const t=this.children.head;return null==t?[]:t.children.map((t=>t))}}function nt(){return`row-${Math.random().toString(36).slice(2,6)}`}et.allowedChildren=[tt],tt.requiredContainer=et,tt.allowedChildren=[Y],Y.requiredContainer=tt,Y.allowedChildren=[J],J.requiredContainer=Y;class rt extends F.A{static register(){p.Ay.register(J),p.Ay.register(Y),p.Ay.register(tt),p.Ay.register(et)}constructor(){super(...arguments),this.listenBalanceCells()}balanceTables(){this.quill.scroll.descendants(et).forEach((t=>{t.balanceCells()}))}deleteColumn(){const[t,,e]=this.getTable();null!=e&&(t.deleteColumn(e.cellOffset()),this.quill.update(p.Ay.sources.USER))}deleteRow(){const[,t]=this.getTable();null!=t&&(t.remove(),this.quill.update(p.Ay.sources.USER))}deleteTable(){const[t]=this.getTable();if(null==t)return;const e=t.offset();t.remove(),this.quill.update(p.Ay.sources.USER),this.quill.setSelection(e,p.Ay.sources.SILENT)}getTable(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.quill.getSelection();if(null==t)return[null,null,null,-1];const[e,n]=this.quill.getLine(t.index);if(null==e||e.statics.blotName!==J.blotName)return[null,null,null,-1];const r=e.parent;return[r.parent.parent,r,e,n]}insertColumn(t){const e=this.quill.getSelection();if(!e)return;const[n,r,i]=this.getTable(e);if(null==i)return;const s=i.cellOffset();n.insertColumn(s+t),this.quill.update(p.Ay.sources.USER);let o=r.rowOffset();0===t&&(o+=1),this.quill.setSelection(e.index+o,e.length,p.Ay.sources.SILENT)}insertColumnLeft(){this.insertColumn(0)}insertColumnRight(){this.insertColumn(1)}insertRow(t){const e=this.quill.getSelection();if(!e)return;const[n,r,i]=this.getTable(e);if(null==i)return;const s=r.rowOffset();n.insertRow(s+t),this.quill.update(p.Ay.sources.USER),t>0?this.quill.setSelection(e,p.Ay.sources.SILENT):this.quill.setSelection(e.index+r.children.length,e.length,p.Ay.sources.SILENT)}insertRowAbove(){this.insertRow(0)}insertRowBelow(){this.insertRow(1)}insertTable(t,e){const n=this.quill.getSelection();if(null==n)return;const r=new Array(t).fill(0).reduce((t=>{const n=new Array(e).fill("\n").join("");return t.insert(n,{table:nt()})}),(new(z())).retain(n.index));this.quill.updateContents(r,p.Ay.sources.USER),this.quill.setSelection(n.index,p.Ay.sources.SILENT),this.balanceTables()}listenBalanceCells(){this.quill.on(p.Ay.events.SCROLL_OPTIMIZE,(t=>{t.some((t=>!!["TD","TR","TBODY","TABLE"].includes(t.target.tagName)&&(this.quill.once(p.Ay.events.TEXT_CHANGE,((t,e,n)=>{n===p.Ay.sources.USER&&this.balanceTables()})),!0)))}))}}var it=rt;const st=(0,n(6078).A)("quill:toolbar");class ot extends F.A{constructor(t,e){if(super(t,e),Array.isArray(this.options.container)){const e=document.createElement("div");e.setAttribute("role","toolbar"),function(t,e){Array.isArray(e[0])||(e=[e]),e.forEach((e=>{const n=document.createElement("span");n.classList.add("ql-formats"),e.forEach((t=>{if("string"==typeof t)lt(n,t);else{const e=Object.keys(t)[0],r=t[e];Array.isArray(r)?function(t,e,n){const r=document.createElement("select");r.classList.add(`ql-${e}`),n.forEach((t=>{const e=document.createElement("option");!1!==t?e.setAttribute("value",String(t)):e.setAttribute("selected","selected"),r.appendChild(e)})),t.appendChild(r)}(n,e,r):lt(n,e,r)}})),t.appendChild(n)}))}(e,this.options.container),t.container?.parentNode?.insertBefore(e,t.container),this.container=e}else"string"==typeof this.options.container?this.container=document.querySelector(this.options.container):this.container=this.options.container;this.container instanceof HTMLElement?(this.container.classList.add("ql-toolbar"),this.controls=[],this.handlers={},this.options.handlers&&Object.keys(this.options.handlers).forEach((t=>{const e=this.options.handlers?.[t];e&&this.addHandler(t,e)})),Array.from(this.container.querySelectorAll("button, select")).forEach((t=>{this.attach(t)})),this.quill.on(p.Ay.events.EDITOR_CHANGE,(()=>{const[t]=this.quill.selection.getRange();this.update(t)}))):st.error("Container required for toolbar",this.options)}addHandler(t,e){this.handlers[t]=e}attach(t){let e=Array.from(t.classList).find((t=>0===t.indexOf("ql-")));if(!e)return;if(e=e.slice(3),"BUTTON"===t.tagName&&t.setAttribute("type","button"),null==this.handlers[e]&&null==this.quill.scroll.query(e))return void st.warn("ignoring attaching to nonexistent format",e,t);const n="SELECT"===t.tagName?"change":"click";t.addEventListener(n,(n=>{let r;if("SELECT"===t.tagName){if(t.selectedIndex<0)return;const e=t.options[t.selectedIndex];r=!e.hasAttribute("selected")&&(e.value||!1)}else r=!t.classList.contains("ql-active")&&(t.value||!t.hasAttribute("value")),n.preventDefault();this.quill.focus();const[i]=this.quill.selection.getRange();if(null!=this.handlers[e])this.handlers[e].call(this,r);else if(this.quill.scroll.query(e).prototype instanceof s.EmbedBlot){if(r=prompt(`Enter ${e}`),!r)return;this.quill.updateContents((new(z())).retain(i.index).delete(i.length).insert({[e]:r}),p.Ay.sources.USER)}else this.quill.format(e,r,p.Ay.sources.USER);this.update(i)})),this.controls.push([e,t])}update(t){const e=null==t?{}:this.quill.getFormat(t);this.controls.forEach((n=>{const[r,i]=n;if("SELECT"===i.tagName){let n=null;if(null==t)n=null;else if(null==e[r])n=i.querySelector("option[selected]");else if(!Array.isArray(e[r])){let t=e[r];"string"==typeof t&&(t=t.replace(/"/g,'\\"')),n=i.querySelector(`option[value="${t}"]`)}null==n?(i.value="",i.selectedIndex=-1):n.selected=!0}else if(null==t)i.classList.remove("ql-active"),i.setAttribute("aria-pressed","false");else if(i.hasAttribute("value")){const t=e[r],n=t===i.getAttribute("value")||null!=t&&t.toString()===i.getAttribute("value")||null==t&&!i.getAttribute("value");i.classList.toggle("ql-active",n),i.setAttribute("aria-pressed",n.toString())}else{const t=null!=e[r];i.classList.toggle("ql-active",t),i.setAttribute("aria-pressed",t.toString())}}))}}function lt(t,e,n){const r=document.createElement("button");r.setAttribute("type","button"),r.classList.add(`ql-${e}`),r.setAttribute("aria-pressed","false"),null!=n?(r.value=n,r.setAttribute("aria-label",`${e}: ${n}`)):r.setAttribute("aria-label",e),t.appendChild(r)}ot.DEFAULTS={},ot.DEFAULTS={container:null,handlers:{clean(){const t=this.quill.getSelection();if(null!=t)if(0===t.length){const t=this.quill.getFormat();Object.keys(t).forEach((t=>{null!=this.quill.scroll.query(t,s.Scope.INLINE)&&this.quill.format(t,!1,p.Ay.sources.USER)}))}else this.quill.removeFormat(t.index,t.length,p.Ay.sources.USER)},direction(t){const{align:e}=this.quill.getFormat();"rtl"===t&&null==e?this.quill.format("align","right",p.Ay.sources.USER):t||"right"!==e||this.quill.format("align",!1,p.Ay.sources.USER),this.quill.format("direction",t,p.Ay.sources.USER)},indent(t){const e=this.quill.getSelection(),n=this.quill.getFormat(e),r=parseInt(n.indent||0,10);if("+1"===t||"-1"===t){let e="+1"===t?1:-1;"rtl"===n.direction&&(e*=-1),this.quill.format("indent",r+e,p.Ay.sources.USER)}},link(t){!0===t&&(t=prompt("Enter link URL:")),this.quill.format("link",t,p.Ay.sources.USER)},list(t){const e=this.quill.getSelection(),n=this.quill.getFormat(e);"check"===t?"checked"===n.list||"unchecked"===n.list?this.quill.format("list",!1,p.Ay.sources.USER):this.quill.format("list","unchecked",p.Ay.sources.USER):this.quill.format("list",t,p.Ay.sources.USER)}}};const at='';var ct={align:{"":'',center:'',right:'',justify:''},background:'',blockquote:'',bold:'',clean:'',code:at,"code-block":at,color:'',direction:{"":'',rtl:''},formula:'',header:{1:'',2:'',3:'',4:'',5:'',6:''},italic:'',image:'',indent:{"+1":'',"-1":''},link:'',list:{bullet:'',check:'',ordered:''},script:{sub:'',super:''},strike:'',table:'',underline:'',video:''};let ut=0;function ht(t,e){t.setAttribute(e,`${!("true"===t.getAttribute(e))}`)}var dt=class{constructor(t){this.select=t,this.container=document.createElement("span"),this.buildPicker(),this.select.style.display="none",this.select.parentNode.insertBefore(this.container,this.select),this.label.addEventListener("mousedown",(()=>{this.togglePicker()})),this.label.addEventListener("keydown",(t=>{switch(t.key){case"Enter":this.togglePicker();break;case"Escape":this.escape(),t.preventDefault()}})),this.select.addEventListener("change",this.update.bind(this))}togglePicker(){this.container.classList.toggle("ql-expanded"),ht(this.label,"aria-expanded"),ht(this.options,"aria-hidden")}buildItem(t){const e=document.createElement("span");e.tabIndex="0",e.setAttribute("role","button"),e.classList.add("ql-picker-item");const n=t.getAttribute("value");return n&&e.setAttribute("data-value",n),t.textContent&&e.setAttribute("data-label",t.textContent),e.addEventListener("click",(()=>{this.selectItem(e,!0)})),e.addEventListener("keydown",(t=>{switch(t.key){case"Enter":this.selectItem(e,!0),t.preventDefault();break;case"Escape":this.escape(),t.preventDefault()}})),e}buildLabel(){const t=document.createElement("span");return t.classList.add("ql-picker-label"),t.innerHTML='',t.tabIndex="0",t.setAttribute("role","button"),t.setAttribute("aria-expanded","false"),this.container.appendChild(t),t}buildOptions(){const t=document.createElement("span");t.classList.add("ql-picker-options"),t.setAttribute("aria-hidden","true"),t.tabIndex="-1",t.id=`ql-picker-options-${ut}`,ut+=1,this.label.setAttribute("aria-controls",t.id),this.options=t,Array.from(this.select.options).forEach((e=>{const n=this.buildItem(e);t.appendChild(n),!0===e.selected&&this.selectItem(n)})),this.container.appendChild(t)}buildPicker(){Array.from(this.select.attributes).forEach((t=>{this.container.setAttribute(t.name,t.value)})),this.container.classList.add("ql-picker"),this.label=this.buildLabel(),this.buildOptions()}escape(){this.close(),setTimeout((()=>this.label.focus()),1)}close(){this.container.classList.remove("ql-expanded"),this.label.setAttribute("aria-expanded","false"),this.options.setAttribute("aria-hidden","true")}selectItem(t){let e=arguments.length>1&&void 0!==arguments[1]&&arguments[1];const n=this.container.querySelector(".ql-selected");t!==n&&(null!=n&&n.classList.remove("ql-selected"),null!=t&&(t.classList.add("ql-selected"),this.select.selectedIndex=Array.from(t.parentNode.children).indexOf(t),t.hasAttribute("data-value")?this.label.setAttribute("data-value",t.getAttribute("data-value")):this.label.removeAttribute("data-value"),t.hasAttribute("data-label")?this.label.setAttribute("data-label",t.getAttribute("data-label")):this.label.removeAttribute("data-label"),e&&(this.select.dispatchEvent(new Event("change")),this.close())))}update(){let t;if(this.select.selectedIndex>-1){const e=this.container.querySelector(".ql-picker-options").children[this.select.selectedIndex];t=this.select.options[this.select.selectedIndex],this.selectItem(e)}else this.selectItem(null);const e=null!=t&&t!==this.select.querySelector("option[selected]");this.label.classList.toggle("ql-active",e)}},ft=class extends dt{constructor(t,e){super(t),this.label.innerHTML=e,this.container.classList.add("ql-color-picker"),Array.from(this.container.querySelectorAll(".ql-picker-item")).slice(0,7).forEach((t=>{t.classList.add("ql-primary")}))}buildItem(t){const e=super.buildItem(t);return e.style.backgroundColor=t.getAttribute("value")||"",e}selectItem(t,e){super.selectItem(t,e);const n=this.label.querySelector(".ql-color-label"),r=t&&t.getAttribute("data-value")||"";n&&("line"===n.tagName?n.style.stroke=r:n.style.fill=r)}},pt=class extends dt{constructor(t,e){super(t),this.container.classList.add("ql-icon-picker"),Array.from(this.container.querySelectorAll(".ql-picker-item")).forEach((t=>{t.innerHTML=e[t.getAttribute("data-value")||""]})),this.defaultItem=this.container.querySelector(".ql-selected"),this.selectItem(this.defaultItem)}selectItem(t,e){super.selectItem(t,e);const n=t||this.defaultItem;if(null!=n){if(this.label.innerHTML===n.innerHTML)return;this.label.innerHTML=n.innerHTML}}},gt=class{constructor(t,e){this.quill=t,this.boundsContainer=e||document.body,this.root=t.addContainer("ql-tooltip"),this.root.innerHTML=this.constructor.TEMPLATE,(t=>{const{overflowY:e}=getComputedStyle(t,null);return"visible"!==e&&"clip"!==e})(this.quill.root)&&this.quill.root.addEventListener("scroll",(()=>{this.root.style.marginTop=-1*this.quill.root.scrollTop+"px"})),this.hide()}hide(){this.root.classList.add("ql-hidden")}position(t){const e=t.left+t.width/2-this.root.offsetWidth/2,n=t.bottom+this.quill.root.scrollTop;this.root.style.left=`${e}px`,this.root.style.top=`${n}px`,this.root.classList.remove("ql-flip");const r=this.boundsContainer.getBoundingClientRect(),i=this.root.getBoundingClientRect();let s=0;if(i.right>r.right&&(s=r.right-i.right,this.root.style.left=`${e+s}px`),i.leftr.bottom){const e=i.bottom-i.top,r=t.bottom-t.top+e;this.root.style.top=n-r+"px",this.root.classList.add("ql-flip")}return s}show(){this.root.classList.remove("ql-editing"),this.root.classList.remove("ql-hidden")}},mt=n(8347),bt=n(5374),yt=n(9609);const vt=[!1,"center","right","justify"],At=["#000000","#e60000","#ff9900","#ffff00","#008a00","#0066cc","#9933ff","#ffffff","#facccc","#ffebcc","#ffffcc","#cce8cc","#cce0f5","#ebd6ff","#bbbbbb","#f06666","#ffc266","#ffff66","#66b966","#66a3e0","#c285ff","#888888","#a10000","#b26b00","#b2b200","#006100","#0047b2","#6b24b2","#444444","#5c0000","#663d00","#666600","#003700","#002966","#3d1466"],xt=[!1,"serif","monospace"],Nt=["1","2","3",!1],Et=["small",!1,"large","huge"];class wt extends yt.A{constructor(t,e){super(t,e);const n=e=>{document.body.contains(t.root)?(null==this.tooltip||this.tooltip.root.contains(e.target)||document.activeElement===this.tooltip.textbox||this.quill.hasFocus()||this.tooltip.hide(),null!=this.pickers&&this.pickers.forEach((t=>{t.container.contains(e.target)||t.close()}))):document.body.removeEventListener("click",n)};t.emitter.listenDOM("click",document.body,n)}addModule(t){const e=super.addModule(t);return"toolbar"===t&&this.extendToolbar(e),e}buildButtons(t,e){Array.from(t).forEach((t=>{(t.getAttribute("class")||"").split(/\s+/).forEach((n=>{if(n.startsWith("ql-")&&(n=n.slice(3),null!=e[n]))if("direction"===n)t.innerHTML=e[n][""]+e[n].rtl;else if("string"==typeof e[n])t.innerHTML=e[n];else{const r=t.value||"";null!=r&&e[n][r]&&(t.innerHTML=e[n][r])}}))}))}buildPickers(t,e){this.pickers=Array.from(t).map((t=>{if(t.classList.contains("ql-align")&&(null==t.querySelector("option")&&kt(t,vt),"object"==typeof e.align))return new pt(t,e.align);if(t.classList.contains("ql-background")||t.classList.contains("ql-color")){const n=t.classList.contains("ql-background")?"background":"color";return null==t.querySelector("option")&&kt(t,At,"background"===n?"#ffffff":"#000000"),new ft(t,e[n])}return null==t.querySelector("option")&&(t.classList.contains("ql-font")?kt(t,xt):t.classList.contains("ql-header")?kt(t,Nt):t.classList.contains("ql-size")&&kt(t,Et)),new dt(t)})),this.quill.on(bt.A.events.EDITOR_CHANGE,(()=>{this.pickers.forEach((t=>{t.update()}))}))}}wt.DEFAULTS=(0,mt.A)({},yt.A.DEFAULTS,{modules:{toolbar:{handlers:{formula(){this.quill.theme.tooltip.edit("formula")},image(){let t=this.container.querySelector("input.ql-image[type=file]");null==t&&(t=document.createElement("input"),t.setAttribute("type","file"),t.setAttribute("accept",this.quill.uploader.options.mimetypes.join(", ")),t.classList.add("ql-image"),t.addEventListener("change",(()=>{const e=this.quill.getSelection(!0);this.quill.uploader.upload(e,t.files),t.value=""})),this.container.appendChild(t)),t.click()},video(){this.quill.theme.tooltip.edit("video")}}}}});class qt extends gt{constructor(t,e){super(t,e),this.textbox=this.root.querySelector('input[type="text"]'),this.listen()}listen(){this.textbox.addEventListener("keydown",(t=>{"Enter"===t.key?(this.save(),t.preventDefault()):"Escape"===t.key&&(this.cancel(),t.preventDefault())}))}cancel(){this.hide(),this.restoreFocus()}edit(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"link",e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;if(this.root.classList.remove("ql-hidden"),this.root.classList.add("ql-editing"),null==this.textbox)return;null!=e?this.textbox.value=e:t!==this.root.getAttribute("data-mode")&&(this.textbox.value="");const n=this.quill.getBounds(this.quill.selection.savedRange);null!=n&&this.position(n),this.textbox.select(),this.textbox.setAttribute("placeholder",this.textbox.getAttribute(`data-${t}`)||""),this.root.setAttribute("data-mode",t)}restoreFocus(){this.quill.focus({preventScroll:!0})}save(){let{value:t}=this.textbox;switch(this.root.getAttribute("data-mode")){case"link":{const{scrollTop:e}=this.quill.root;this.linkRange?(this.quill.formatText(this.linkRange,"link",t,bt.A.sources.USER),delete this.linkRange):(this.restoreFocus(),this.quill.format("link",t,bt.A.sources.USER)),this.quill.root.scrollTop=e;break}case"video":t=function(t){let e=t.match(/^(?:(https?):\/\/)?(?:(?:www|m)\.)?youtube\.com\/watch.*v=([a-zA-Z0-9_-]+)/)||t.match(/^(?:(https?):\/\/)?(?:(?:www|m)\.)?youtu\.be\/([a-zA-Z0-9_-]+)/);return e?`${e[1]||"https"}://www.youtube.com/embed/${e[2]}?showinfo=0`:(e=t.match(/^(?:(https?):\/\/)?(?:www\.)?vimeo\.com\/(\d+)/))?`${e[1]||"https"}://player.vimeo.com/video/${e[2]}/`:t}(t);case"formula":{if(!t)break;const e=this.quill.getSelection(!0);if(null!=e){const n=e.index+e.length;this.quill.insertEmbed(n,this.root.getAttribute("data-mode"),t,bt.A.sources.USER),"formula"===this.root.getAttribute("data-mode")&&this.quill.insertText(n+1," ",bt.A.sources.USER),this.quill.setSelection(n+2,bt.A.sources.USER)}break}}this.textbox.value="",this.hide()}}function kt(t,e){let n=arguments.length>2&&void 0!==arguments[2]&&arguments[2];e.forEach((e=>{const r=document.createElement("option");e===n?r.setAttribute("selected","selected"):r.setAttribute("value",String(e)),t.appendChild(r)}))}var _t=n(8298);const Lt=[["bold","italic","link"],[{header:1},{header:2},"blockquote"]];class St extends qt{static TEMPLATE=['','
    ','','',"
    "].join("");constructor(t,e){super(t,e),this.quill.on(bt.A.events.EDITOR_CHANGE,((t,e,n,r)=>{if(t===bt.A.events.SELECTION_CHANGE)if(null!=e&&e.length>0&&r===bt.A.sources.USER){this.show(),this.root.style.left="0px",this.root.style.width="",this.root.style.width=`${this.root.offsetWidth}px`;const t=this.quill.getLines(e.index,e.length);if(1===t.length){const t=this.quill.getBounds(e);null!=t&&this.position(t)}else{const n=t[t.length-1],r=this.quill.getIndex(n),i=Math.min(n.length()-1,e.index+e.length-r),s=this.quill.getBounds(new _t.Q(r,i));null!=s&&this.position(s)}}else document.activeElement!==this.textbox&&this.quill.hasFocus()&&this.hide()}))}listen(){super.listen(),this.root.querySelector(".ql-close").addEventListener("click",(()=>{this.root.classList.remove("ql-editing")})),this.quill.on(bt.A.events.SCROLL_OPTIMIZE,(()=>{setTimeout((()=>{if(this.root.classList.contains("ql-hidden"))return;const t=this.quill.getSelection();if(null!=t){const e=this.quill.getBounds(t);null!=e&&this.position(e)}}),1)}))}cancel(){this.show()}position(t){const e=super.position(t),n=this.root.querySelector(".ql-tooltip-arrow");return n.style.marginLeft="",0!==e&&(n.style.marginLeft=-1*e-n.offsetWidth/2+"px"),e}}class Ot extends wt{constructor(t,e){null!=e.modules.toolbar&&null==e.modules.toolbar.container&&(e.modules.toolbar.container=Lt),super(t,e),this.quill.container.classList.add("ql-bubble")}extendToolbar(t){this.tooltip=new St(this.quill,this.options.bounds),null!=t.container&&(this.tooltip.root.appendChild(t.container),this.buildButtons(t.container.querySelectorAll("button"),ct),this.buildPickers(t.container.querySelectorAll("select"),ct))}}Ot.DEFAULTS=(0,mt.A)({},wt.DEFAULTS,{modules:{toolbar:{handlers:{link(t){t?this.quill.theme.tooltip.edit():this.quill.format("link",!1,p.Ay.sources.USER)}}}}});const Tt=[[{header:["1","2","3",!1]}],["bold","italic","underline","link"],[{list:"ordered"},{list:"bullet"}],["clean"]];class jt extends qt{static TEMPLATE=['','','',''].join("");preview=this.root.querySelector("a.ql-preview");listen(){super.listen(),this.root.querySelector("a.ql-action").addEventListener("click",(t=>{this.root.classList.contains("ql-editing")?this.save():this.edit("link",this.preview.textContent),t.preventDefault()})),this.root.querySelector("a.ql-remove").addEventListener("click",(t=>{if(null!=this.linkRange){const t=this.linkRange;this.restoreFocus(),this.quill.formatText(t,"link",!1,bt.A.sources.USER),delete this.linkRange}t.preventDefault(),this.hide()})),this.quill.on(bt.A.events.SELECTION_CHANGE,((t,e,n)=>{if(null!=t){if(0===t.length&&n===bt.A.sources.USER){const[e,n]=this.quill.scroll.descendant(w,t.index);if(null!=e){this.linkRange=new _t.Q(t.index-n,e.length());const r=w.formats(e.domNode);this.preview.textContent=r,this.preview.setAttribute("href",r),this.show();const i=this.quill.getBounds(this.linkRange);return void(null!=i&&this.position(i))}}else delete this.linkRange;this.hide()}}))}show(){super.show(),this.root.removeAttribute("data-mode")}}class Ct extends wt{constructor(t,e){null!=e.modules.toolbar&&null==e.modules.toolbar.container&&(e.modules.toolbar.container=Tt),super(t,e),this.quill.container.classList.add("ql-snow")}extendToolbar(t){null!=t.container&&(t.container.classList.add("ql-snow"),this.buildButtons(t.container.querySelectorAll("button"),ct),this.buildPickers(t.container.querySelectorAll("select"),ct),this.tooltip=new jt(this.quill,this.options.bounds),t.container.querySelector(".ql-link")&&this.quill.keyboard.addBinding({key:"k",shortKey:!0},((e,n)=>{t.handlers.link.call(t,!n.format.link)})))}}Ct.DEFAULTS=(0,mt.A)({},wt.DEFAULTS,{modules:{toolbar:{handlers:{link(t){if(t){const t=this.quill.getSelection();if(null==t||0===t.length)return;let e=this.quill.getText(t);/^\S+@\S+\.\S+$/.test(e)&&0!==e.indexOf("mailto:")&&(e=`mailto:${e}`);const{tooltip:n}=this.quill.theme;n.edit("link",e)}else this.quill.format("link",!1,p.Ay.sources.USER)}}}}});var Rt=Ct;t.default.register({"attributors/attribute/direction":i.Mc,"attributors/class/align":e.qh,"attributors/class/background":b.l,"attributors/class/color":y.g3,"attributors/class/direction":i.sY,"attributors/class/font":v.q,"attributors/class/size":A.U,"attributors/style/align":e.Hu,"attributors/style/background":b.s,"attributors/style/color":y.JM,"attributors/style/direction":i.VL,"attributors/style/font":v.z,"attributors/style/size":A.r},!0),t.default.register({"formats/align":e.qh,"formats/direction":i.sY,"formats/indent":l,"formats/background":b.s,"formats/color":y.JM,"formats/font":v.q,"formats/size":A.U,"formats/blockquote":u,"formats/code-block":D.Ay,"formats/header":d,"formats/list":m,"formats/bold":E,"formats/code":D.Cy,"formats/italic":class extends E{static blotName="italic";static tagName=["EM","I"]},"formats/link":w,"formats/script":_,"formats/strike":class extends E{static blotName="strike";static tagName=["S","STRIKE"]},"formats/underline":S,"formats/formula":j,"formats/image":I,"formats/video":U,"modules/syntax":Q,"modules/table":it,"modules/toolbar":ot,"themes/bubble":Ot,"themes/snow":Rt,"ui/icons":ct,"ui/picker":dt,"ui/icon-picker":pt,"ui/color-picker":ft,"ui/tooltip":gt},!0);var It=t.default}(),r.default}()})); +//# sourceMappingURL=quill.js.map \ No newline at end of file diff --git a/public/assets/quill/dist/quill.js.LICENSE.txt b/public/assets/quill/dist/quill.js.LICENSE.txt new file mode 100644 index 0000000..c086972 --- /dev/null +++ b/public/assets/quill/dist/quill.js.LICENSE.txt @@ -0,0 +1,7 @@ +/*! + * Quill Editor v2.0.3 + * https://quilljs.com + * Copyright (c) 2017-2024, Slab + * Copyright (c) 2014, Jason Chen + * Copyright (c) 2013, salesforce.com + */ diff --git a/public/assets/quill/dist/quill.js.map b/public/assets/quill/dist/quill.js.map new file mode 100644 index 0000000..dd79f07 --- /dev/null +++ b/public/assets/quill/dist/quill.js.map @@ -0,0 +1 @@ +{"version":3,"file":"quill.js","mappings":"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","sources":["webpack://Quill/webpack/universalModuleDefinition","webpack://Quill/./src/blots/block.ts","webpack://Quill/./src/blots/break.ts","webpack://Quill/./src/blots/container.ts","webpack://Quill/./src/blots/cursor.ts","webpack://Quill/./src/blots/embed.ts","webpack://Quill/./src/blots/inline.ts","webpack://Quill/./src/blots/text.ts","webpack://Quill/./src/blots/scroll.ts","webpack://Quill/./src/modules/history.ts","webpack://Quill/./src/modules/uploader.ts","webpack://Quill/./src/modules/input.ts","webpack://Quill/./src/modules/uiNode.ts","webpack://Quill/./src/core.ts","webpack://Quill/./src/core/emitter.ts","webpack://Quill/./src/core/instances.ts","webpack://Quill/./src/core/logger.ts","webpack://Quill/./src/core/module.ts","webpack://Quill/./src/core/editor.ts","webpack://Quill/./src/core/composition.ts","webpack://Quill/./src/core/utils/scrollRectIntoView.ts","webpack://Quill/./src/core/utils/createRegistryWithFormats.ts","webpack://Quill/./src/core/quill.ts","webpack://Quill/./src/core/selection.ts","webpack://Quill/./src/core/theme.ts","webpack://Quill/./src/formats/align.ts","webpack://Quill/./src/formats/background.ts","webpack://Quill/./src/formats/code.ts","webpack://Quill/./src/formats/color.ts","webpack://Quill/./src/formats/direction.ts","webpack://Quill/./src/formats/font.ts","webpack://Quill/./src/formats/size.ts","webpack://Quill/./src/modules/normalizeExternalHTML/normalizers/googleDocs.ts","webpack://Quill/./src/modules/normalizeExternalHTML/normalizers/msWord.ts","webpack://Quill/./src/modules/normalizeExternalHTML/index.ts","webpack://Quill/./src/modules/clipboard.ts","webpack://Quill/./src/modules/keyboard.ts","webpack://Quill/../../node_modules/eventemitter3/index.js","webpack://Quill/../../node_modules/fast-diff/diff.js","webpack://Quill/../../node_modules/lodash.clonedeep/index.js","webpack://Quill/../../node_modules/lodash.isequal/index.js","webpack://Quill/../../node_modules/quill-delta/src/AttributeMap.ts","webpack://Quill/../../node_modules/quill-delta/src/Delta.ts","webpack://Quill/../../node_modules/quill-delta/src/Op.ts","webpack://Quill/../../node_modules/quill-delta/src/OpIterator.ts","webpack://Quill/../../node_modules/lodash-es/_listCacheClear.js","webpack://Quill/../../node_modules/lodash-es/_assocIndexOf.js","webpack://Quill/../../node_modules/lodash-es/_listCacheDelete.js","webpack://Quill/../../node_modules/lodash-es/_ListCache.js","webpack://Quill/../../node_modules/lodash-es/_listCacheGet.js","webpack://Quill/../../node_modules/lodash-es/_listCacheHas.js","webpack://Quill/../../node_modules/lodash-es/_listCacheSet.js","webpack://Quill/../../node_modules/lodash-es/_Map.js","webpack://Quill/../../node_modules/lodash-es/_nativeCreate.js","webpack://Quill/../../node_modules/lodash-es/_hashGet.js","webpack://Quill/../../node_modules/lodash-es/_hashHas.js","webpack://Quill/../../node_modules/lodash-es/_Hash.js","webpack://Quill/../../node_modules/lodash-es/_hashClear.js","webpack://Quill/../../node_modules/lodash-es/_hashDelete.js","webpack://Quill/../../node_modules/lodash-es/_hashSet.js","webpack://Quill/../../node_modules/lodash-es/_getMapData.js","webpack://Quill/../../node_modules/lodash-es/_isKeyable.js","webpack://Quill/../../node_modules/lodash-es/_MapCache.js","webpack://Quill/../../node_modules/lodash-es/_mapCacheClear.js","webpack://Quill/../../node_modules/lodash-es/_mapCacheDelete.js","webpack://Quill/../../node_modules/lodash-es/_mapCacheGet.js","webpack://Quill/../../node_modules/lodash-es/_mapCacheHas.js","webpack://Quill/../../node_modules/lodash-es/_mapCacheSet.js","webpack://Quill/../../node_modules/lodash-es/_Stack.js","webpack://Quill/../../node_modules/lodash-es/_stackClear.js","webpack://Quill/../../node_modules/lodash-es/_stackDelete.js","webpack://Quill/../../node_modules/lodash-es/_stackGet.js","webpack://Quill/../../node_modules/lodash-es/_stackHas.js","webpack://Quill/../../node_modules/lodash-es/_stackSet.js","webpack://Quill/../../node_modules/lodash-es/_Symbol.js","webpack://Quill/../../node_modules/lodash-es/_Uint8Array.js","webpack://Quill/../../node_modules/lodash-es/_baseTimes.js","webpack://Quill/../../node_modules/lodash-es/_arrayLikeKeys.js","webpack://Quill/../../node_modules/lodash-es/_arrayPush.js","webpack://Quill/../../node_modules/lodash-es/_assignValue.js","webpack://Quill/../../node_modules/lodash-es/_baseAssignValue.js","webpack://Quill/../../node_modules/lodash-es/_baseGetAllKeys.js","webpack://Quill/../../node_modules/lodash-es/_getRawTag.js","webpack://Quill/../../node_modules/lodash-es/_objectToString.js","webpack://Quill/../../node_modules/lodash-es/_baseGetTag.js","webpack://Quill/../../node_modules/lodash-es/_baseUnary.js","webpack://Quill/../../node_modules/lodash-es/_cloneArrayBuffer.js","webpack://Quill/../../node_modules/lodash-es/_cloneBuffer.js","webpack://Quill/../../node_modules/lodash-es/_cloneTypedArray.js","webpack://Quill/../../node_modules/lodash-es/_copyArray.js","webpack://Quill/../../node_modules/lodash-es/_copyObject.js","webpack://Quill/../../node_modules/lodash-es/_defineProperty.js","webpack://Quill/../../node_modules/lodash-es/_freeGlobal.js","webpack://Quill/../../node_modules/lodash-es/_getAllKeys.js","webpack://Quill/../../node_modules/lodash-es/_isMasked.js","webpack://Quill/../../node_modules/lodash-es/_coreJsData.js","webpack://Quill/../../node_modules/lodash-es/_baseIsNative.js","webpack://Quill/../../node_modules/lodash-es/_getNative.js","webpack://Quill/../../node_modules/lodash-es/_getValue.js","webpack://Quill/../../node_modules/lodash-es/_getPrototype.js","webpack://Quill/../../node_modules/lodash-es/_arrayFilter.js","webpack://Quill/../../node_modules/lodash-es/_getSymbols.js","webpack://Quill/../../node_modules/lodash-es/_DataView.js","webpack://Quill/../../node_modules/lodash-es/_Promise.js","webpack://Quill/../../node_modules/lodash-es/_Set.js","webpack://Quill/../../node_modules/lodash-es/_WeakMap.js","webpack://Quill/../../node_modules/lodash-es/_getTag.js","webpack://Quill/../../node_modules/lodash-es/_baseCreate.js","webpack://Quill/../../node_modules/lodash-es/_initCloneObject.js","webpack://Quill/../../node_modules/lodash-es/_isIndex.js","webpack://Quill/../../node_modules/lodash-es/_isPrototype.js","webpack://Quill/../../node_modules/lodash-es/_nodeUtil.js","webpack://Quill/../../node_modules/lodash-es/_overArg.js","webpack://Quill/../../node_modules/lodash-es/_root.js","webpack://Quill/../../node_modules/lodash-es/_toSource.js","webpack://Quill/../../node_modules/lodash-es/_getSymbolsIn.js","webpack://Quill/../../node_modules/lodash-es/_getAllKeysIn.js","webpack://Quill/../../node_modules/lodash-es/_initCloneArray.js","webpack://Quill/../../node_modules/lodash-es/_cloneRegExp.js","webpack://Quill/../../node_modules/lodash-es/_cloneSymbol.js","webpack://Quill/../../node_modules/lodash-es/_initCloneByTag.js","webpack://Quill/../../node_modules/lodash-es/_cloneDataView.js","webpack://Quill/../../node_modules/lodash-es/isMap.js","webpack://Quill/../../node_modules/lodash-es/_baseIsMap.js","webpack://Quill/../../node_modules/lodash-es/isSet.js","webpack://Quill/../../node_modules/lodash-es/_baseIsSet.js","webpack://Quill/../../node_modules/lodash-es/_baseClone.js","webpack://Quill/../../node_modules/lodash-es/_copySymbolsIn.js","webpack://Quill/../../node_modules/lodash-es/_baseAssignIn.js","webpack://Quill/../../node_modules/lodash-es/_copySymbols.js","webpack://Quill/../../node_modules/lodash-es/_baseAssign.js","webpack://Quill/../../node_modules/lodash-es/_arrayEach.js","webpack://Quill/../../node_modules/lodash-es/cloneDeep.js","webpack://Quill/../../node_modules/lodash-es/eq.js","webpack://Quill/../../node_modules/lodash-es/_baseIsArguments.js","webpack://Quill/../../node_modules/lodash-es/isArguments.js","webpack://Quill/../../node_modules/lodash-es/isArray.js","webpack://Quill/../../node_modules/lodash-es/isArrayLike.js","webpack://Quill/../../node_modules/lodash-es/isBuffer.js","webpack://Quill/../../node_modules/lodash-es/stubFalse.js","webpack://Quill/../../node_modules/lodash-es/_SetCache.js","webpack://Quill/../../node_modules/lodash-es/_setCacheAdd.js","webpack://Quill/../../node_modules/lodash-es/_setCacheHas.js","webpack://Quill/../../node_modules/lodash-es/_arraySome.js","webpack://Quill/../../node_modules/lodash-es/_equalArrays.js","webpack://Quill/../../node_modules/lodash-es/_cacheHas.js","webpack://Quill/../../node_modules/lodash-es/_mapToArray.js","webpack://Quill/../../node_modules/lodash-es/_setToArray.js","webpack://Quill/../../node_modules/lodash-es/_equalByTag.js","webpack://Quill/../../node_modules/lodash-es/_equalObjects.js","webpack://Quill/../../node_modules/lodash-es/_baseIsEqualDeep.js","webpack://Quill/../../node_modules/lodash-es/_baseIsEqual.js","webpack://Quill/../../node_modules/lodash-es/isEqual.js","webpack://Quill/../../node_modules/lodash-es/isFunction.js","webpack://Quill/../../node_modules/lodash-es/isLength.js","webpack://Quill/../../node_modules/lodash-es/isObject.js","webpack://Quill/../../node_modules/lodash-es/isObjectLike.js","webpack://Quill/../../node_modules/lodash-es/_baseIsTypedArray.js","webpack://Quill/../../node_modules/lodash-es/isTypedArray.js","webpack://Quill/../../node_modules/lodash-es/_nativeKeys.js","webpack://Quill/../../node_modules/lodash-es/_baseKeys.js","webpack://Quill/../../node_modules/lodash-es/keys.js","webpack://Quill/../../node_modules/lodash-es/_baseKeysIn.js","webpack://Quill/../../node_modules/lodash-es/_nativeKeysIn.js","webpack://Quill/../../node_modules/lodash-es/keysIn.js","webpack://Quill/../../node_modules/lodash-es/_shortOut.js","webpack://Quill/../../node_modules/lodash-es/_createAssigner.js","webpack://Quill/../../node_modules/lodash-es/_assignMergeValue.js","webpack://Quill/../../node_modules/lodash-es/_baseFor.js","webpack://Quill/../../node_modules/lodash-es/_createBaseFor.js","webpack://Quill/../../node_modules/lodash-es/isPlainObject.js","webpack://Quill/../../node_modules/lodash-es/_safeGet.js","webpack://Quill/../../node_modules/lodash-es/_baseMergeDeep.js","webpack://Quill/../../node_modules/lodash-es/isArrayLikeObject.js","webpack://Quill/../../node_modules/lodash-es/toPlainObject.js","webpack://Quill/../../node_modules/lodash-es/_baseMerge.js","webpack://Quill/../../node_modules/lodash-es/identity.js","webpack://Quill/../../node_modules/lodash-es/_overRest.js","webpack://Quill/../../node_modules/lodash-es/_baseSetToString.js","webpack://Quill/../../node_modules/lodash-es/constant.js","webpack://Quill/../../node_modules/lodash-es/_setToString.js","webpack://Quill/../../node_modules/lodash-es/_baseRest.js","webpack://Quill/../../node_modules/lodash-es/_apply.js","webpack://Quill/../../node_modules/lodash-es/merge.js","webpack://Quill/../../node_modules/lodash-es/_isIterateeCall.js","webpack://Quill/../../node_modules/lodash-es/stubArray.js","webpack://Quill/../../node_modules/parchment/src/scope.ts","webpack://Quill/../../node_modules/parchment/src/attributor/attributor.ts","webpack://Quill/../../node_modules/parchment/src/error.ts","webpack://Quill/../../node_modules/parchment/src/registry.ts","webpack://Quill/../../node_modules/parchment/src/attributor/class.ts","webpack://Quill/../../node_modules/parchment/src/attributor/style.ts","webpack://Quill/../../node_modules/parchment/src/attributor/store.ts","webpack://Quill/../../node_modules/parchment/src/blot/abstract/shadow.ts","webpack://Quill/../../node_modules/parchment/src/blot/abstract/leaf.ts","webpack://Quill/../../node_modules/parchment/src/collection/linked-list.ts","webpack://Quill/../../node_modules/parchment/src/blot/abstract/parent.ts","webpack://Quill/../../node_modules/parchment/src/blot/inline.ts","webpack://Quill/../../node_modules/parchment/src/blot/block.ts","webpack://Quill/../../node_modules/parchment/src/blot/abstract/container.ts","webpack://Quill/../../node_modules/parchment/src/blot/embed.ts","webpack://Quill/../../node_modules/parchment/src/blot/scroll.ts","webpack://Quill/../../node_modules/parchment/src/blot/text.ts","webpack://Quill/webpack/bootstrap","webpack://Quill/webpack/runtime/compat get default export","webpack://Quill/webpack/runtime/define property getters","webpack://Quill/webpack/runtime/global","webpack://Quill/webpack/runtime/hasOwnProperty shorthand","webpack://Quill/webpack/runtime/make namespace object","webpack://Quill/webpack/runtime/node module decorator","webpack://Quill/./src/formats/indent.ts","webpack://Quill/./src/formats/blockquote.ts","webpack://Quill/./src/formats/header.ts","webpack://Quill/./src/formats/list.ts","webpack://Quill/./src/formats/bold.ts","webpack://Quill/./src/formats/link.ts","webpack://Quill/./src/formats/script.ts","webpack://Quill/./src/formats/underline.ts","webpack://Quill/./src/formats/formula.ts","webpack://Quill/./src/formats/image.ts","webpack://Quill/./src/formats/video.ts","webpack://Quill/./src/modules/syntax.ts","webpack://Quill/./src/formats/table.ts","webpack://Quill/./src/modules/table.ts","webpack://Quill/./src/modules/toolbar.ts","webpack://Quill/./src/ui/icons.ts","webpack://Quill/./src/ui/picker.ts","webpack://Quill/./src/ui/color-picker.ts","webpack://Quill/./src/ui/icon-picker.ts","webpack://Quill/./src/ui/tooltip.ts","webpack://Quill/./src/themes/base.ts","webpack://Quill/./src/themes/bubble.ts","webpack://Quill/./src/themes/snow.ts","webpack://Quill/./src/quill.ts","webpack://Quill/./src/formats/italic.ts","webpack://Quill/./src/formats/strike.ts"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"Quill\"] = factory();\n\telse\n\t\troot[\"Quill\"] = factory();\n})(self, function() {\nreturn ","import {\n AttributorStore,\n BlockBlot,\n EmbedBlot,\n LeafBlot,\n Scope,\n} from 'parchment';\nimport type { Blot, Parent } from 'parchment';\nimport Delta from 'quill-delta';\nimport Break from './break.js';\nimport Inline from './inline.js';\nimport TextBlot from './text.js';\n\nconst NEWLINE_LENGTH = 1;\n\nclass Block extends BlockBlot {\n cache: { delta?: Delta | null; length?: number } = {};\n\n delta(): Delta {\n if (this.cache.delta == null) {\n this.cache.delta = blockDelta(this);\n }\n return this.cache.delta;\n }\n\n deleteAt(index: number, length: number) {\n super.deleteAt(index, length);\n this.cache = {};\n }\n\n formatAt(index: number, length: number, name: string, value: unknown) {\n if (length <= 0) return;\n if (this.scroll.query(name, Scope.BLOCK)) {\n if (index + length === this.length()) {\n this.format(name, value);\n }\n } else {\n super.formatAt(\n index,\n Math.min(length, this.length() - index - 1),\n name,\n value,\n );\n }\n this.cache = {};\n }\n\n insertAt(index: number, value: string, def?: unknown) {\n if (def != null) {\n super.insertAt(index, value, def);\n this.cache = {};\n return;\n }\n if (value.length === 0) return;\n const lines = value.split('\\n');\n const text = lines.shift() as string;\n if (text.length > 0) {\n if (index < this.length() - 1 || this.children.tail == null) {\n super.insertAt(Math.min(index, this.length() - 1), text);\n } else {\n this.children.tail.insertAt(this.children.tail.length(), text);\n }\n this.cache = {};\n }\n // TODO: Fix this next time the file is edited.\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n let block: Blot | this = this;\n lines.reduce((lineIndex, line) => {\n // @ts-expect-error Fix me later\n block = block.split(lineIndex, true);\n block.insertAt(0, line);\n return line.length;\n }, index + text.length);\n }\n\n insertBefore(blot: Blot, ref?: Blot | null) {\n const { head } = this.children;\n super.insertBefore(blot, ref);\n if (head instanceof Break) {\n head.remove();\n }\n this.cache = {};\n }\n\n length() {\n if (this.cache.length == null) {\n this.cache.length = super.length() + NEWLINE_LENGTH;\n }\n return this.cache.length;\n }\n\n moveChildren(target: Parent, ref?: Blot | null) {\n super.moveChildren(target, ref);\n this.cache = {};\n }\n\n optimize(context: { [key: string]: any }) {\n super.optimize(context);\n this.cache = {};\n }\n\n path(index: number) {\n return super.path(index, true);\n }\n\n removeChild(child: Blot) {\n super.removeChild(child);\n this.cache = {};\n }\n\n split(index: number, force: boolean | undefined = false): Blot | null {\n if (force && (index === 0 || index >= this.length() - NEWLINE_LENGTH)) {\n const clone = this.clone();\n if (index === 0) {\n this.parent.insertBefore(clone, this);\n return this;\n }\n this.parent.insertBefore(clone, this.next);\n return clone;\n }\n const next = super.split(index, force);\n this.cache = {};\n return next;\n }\n}\nBlock.blotName = 'block';\nBlock.tagName = 'P';\nBlock.defaultChild = Break;\nBlock.allowedChildren = [Break, Inline, EmbedBlot, TextBlot];\n\nclass BlockEmbed extends EmbedBlot {\n attributes: AttributorStore;\n domNode: HTMLElement;\n\n attach() {\n super.attach();\n this.attributes = new AttributorStore(this.domNode);\n }\n\n delta() {\n return new Delta().insert(this.value(), {\n ...this.formats(),\n ...this.attributes.values(),\n });\n }\n\n format(name: string, value: unknown) {\n const attribute = this.scroll.query(name, Scope.BLOCK_ATTRIBUTE);\n if (attribute != null) {\n // @ts-expect-error TODO: Scroll#query() should return Attributor when scope is attribute\n this.attributes.attribute(attribute, value);\n }\n }\n\n formatAt(index: number, length: number, name: string, value: unknown) {\n this.format(name, value);\n }\n\n insertAt(index: number, value: string, def?: unknown) {\n if (def != null) {\n super.insertAt(index, value, def);\n return;\n }\n const lines = value.split('\\n');\n const text = lines.pop();\n const blocks = lines.map((line) => {\n const block = this.scroll.create(Block.blotName);\n block.insertAt(0, line);\n return block;\n });\n const ref = this.split(index);\n blocks.forEach((block) => {\n this.parent.insertBefore(block, ref);\n });\n if (text) {\n this.parent.insertBefore(this.scroll.create('text', text), ref);\n }\n }\n}\nBlockEmbed.scope = Scope.BLOCK_BLOT;\n// It is important for cursor behavior BlockEmbeds use tags that are block level elements\n\nfunction blockDelta(blot: BlockBlot, filter = true) {\n return blot\n .descendants(LeafBlot)\n .reduce((delta, leaf) => {\n if (leaf.length() === 0) {\n return delta;\n }\n return delta.insert(leaf.value(), bubbleFormats(leaf, {}, filter));\n }, new Delta())\n .insert('\\n', bubbleFormats(blot));\n}\n\nfunction bubbleFormats(\n blot: Blot | null,\n formats: Record = {},\n filter = true,\n): Record {\n if (blot == null) return formats;\n if ('formats' in blot && typeof blot.formats === 'function') {\n formats = {\n ...formats,\n ...blot.formats(),\n };\n if (filter) {\n // exclude syntax highlighting from deltas and getFormat()\n delete formats['code-token'];\n }\n }\n if (\n blot.parent == null ||\n blot.parent.statics.blotName === 'scroll' ||\n blot.parent.statics.scope !== blot.statics.scope\n ) {\n return formats;\n }\n return bubbleFormats(blot.parent, formats, filter);\n}\n\nexport { blockDelta, bubbleFormats, BlockEmbed, Block as default };\n","import { EmbedBlot } from 'parchment';\n\nclass Break extends EmbedBlot {\n static value() {\n return undefined;\n }\n\n optimize() {\n if (this.prev || this.next) {\n this.remove();\n }\n }\n\n length() {\n return 0;\n }\n\n value() {\n return '';\n }\n}\nBreak.blotName = 'break';\nBreak.tagName = 'BR';\n\nexport default Break;\n","import { ContainerBlot } from 'parchment';\n\nclass Container extends ContainerBlot {}\n\nexport default Container;\n","import { EmbedBlot, Scope } from 'parchment';\nimport type { Parent, ScrollBlot } from 'parchment';\nimport type Selection from '../core/selection.js';\nimport TextBlot from './text.js';\nimport type { EmbedContextRange } from './embed.js';\n\nclass Cursor extends EmbedBlot {\n static blotName = 'cursor';\n static className = 'ql-cursor';\n static tagName = 'span';\n static CONTENTS = '\\uFEFF'; // Zero width no break space\n\n static value() {\n return undefined;\n }\n\n selection: Selection;\n textNode: Text;\n savedLength: number;\n\n constructor(scroll: ScrollBlot, domNode: HTMLElement, selection: Selection) {\n super(scroll, domNode);\n this.selection = selection;\n this.textNode = document.createTextNode(Cursor.CONTENTS);\n this.domNode.appendChild(this.textNode);\n this.savedLength = 0;\n }\n\n detach() {\n // super.detach() will also clear domNode.__blot\n if (this.parent != null) this.parent.removeChild(this);\n }\n\n format(name: string, value: unknown) {\n if (this.savedLength !== 0) {\n super.format(name, value);\n return;\n }\n // TODO: Fix this next time the file is edited.\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n let target: Parent | this = this;\n let index = 0;\n while (target != null && target.statics.scope !== Scope.BLOCK_BLOT) {\n index += target.offset(target.parent);\n target = target.parent;\n }\n if (target != null) {\n this.savedLength = Cursor.CONTENTS.length;\n // @ts-expect-error TODO: allow empty context in Parchment\n target.optimize();\n target.formatAt(index, Cursor.CONTENTS.length, name, value);\n this.savedLength = 0;\n }\n }\n\n index(node: Node, offset: number) {\n if (node === this.textNode) return 0;\n return super.index(node, offset);\n }\n\n length() {\n return this.savedLength;\n }\n\n position(): [Text, number] {\n return [this.textNode, this.textNode.data.length];\n }\n\n remove() {\n super.remove();\n // @ts-expect-error Fix me later\n this.parent = null;\n }\n\n restore(): EmbedContextRange | null {\n if (this.selection.composing || this.parent == null) return null;\n const range = this.selection.getNativeRange();\n // Browser may push down styles/nodes inside the cursor blot.\n // https://dvcs.w3.org/hg/editing/raw-file/tip/editing.html#push-down-values\n while (\n this.domNode.lastChild != null &&\n this.domNode.lastChild !== this.textNode\n ) {\n // @ts-expect-error Fix me later\n this.domNode.parentNode.insertBefore(\n this.domNode.lastChild,\n this.domNode,\n );\n }\n\n const prevTextBlot = this.prev instanceof TextBlot ? this.prev : null;\n const prevTextLength = prevTextBlot ? prevTextBlot.length() : 0;\n const nextTextBlot = this.next instanceof TextBlot ? this.next : null;\n // @ts-expect-error TODO: make TextBlot.text public\n const nextText = nextTextBlot ? nextTextBlot.text : '';\n const { textNode } = this;\n // take text from inside this blot and reset it\n const newText = textNode.data.split(Cursor.CONTENTS).join('');\n textNode.data = Cursor.CONTENTS;\n\n // proactively merge TextBlots around cursor so that optimization\n // doesn't lose the cursor. the reason we are here in cursor.restore\n // could be that the user clicked in prevTextBlot or nextTextBlot, or\n // the user typed something.\n let mergedTextBlot;\n if (prevTextBlot) {\n mergedTextBlot = prevTextBlot;\n if (newText || nextTextBlot) {\n prevTextBlot.insertAt(prevTextBlot.length(), newText + nextText);\n if (nextTextBlot) {\n nextTextBlot.remove();\n }\n }\n } else if (nextTextBlot) {\n mergedTextBlot = nextTextBlot;\n nextTextBlot.insertAt(0, newText);\n } else {\n const newTextNode = document.createTextNode(newText);\n mergedTextBlot = this.scroll.create(newTextNode);\n this.parent.insertBefore(mergedTextBlot, this);\n }\n\n this.remove();\n if (range) {\n // calculate selection to restore\n const remapOffset = (node: Node, offset: number) => {\n if (prevTextBlot && node === prevTextBlot.domNode) {\n return offset;\n }\n if (node === textNode) {\n return prevTextLength + offset - 1;\n }\n if (nextTextBlot && node === nextTextBlot.domNode) {\n return prevTextLength + newText.length + offset;\n }\n return null;\n };\n\n const start = remapOffset(range.start.node, range.start.offset);\n const end = remapOffset(range.end.node, range.end.offset);\n if (start !== null && end !== null) {\n return {\n startNode: mergedTextBlot.domNode,\n startOffset: start,\n endNode: mergedTextBlot.domNode,\n endOffset: end,\n };\n }\n }\n return null;\n }\n\n update(mutations: MutationRecord[], context: Record) {\n if (\n mutations.some((mutation) => {\n return (\n mutation.type === 'characterData' && mutation.target === this.textNode\n );\n })\n ) {\n const range = this.restore();\n if (range) context.range = range;\n }\n }\n\n // Avoid .ql-cursor being a descendant of ``.\n // The reason is Safari pushes down `` on text insertion.\n // That will cause DOM nodes not sync with the model.\n //\n // For example ({I} is the caret), given the markup:\n // \\uFEFF{I}\n // When typing a char \"x\", `` will be pushed down inside the `` first:\n // \\uFEFF{I}\n // And then \"x\" will be inserted after ``:\n // \\uFEFFd{I}\n optimize(context?: unknown) {\n // @ts-expect-error Fix me later\n super.optimize(context);\n\n let { parent } = this;\n while (parent) {\n if (parent.domNode.tagName === 'A') {\n this.savedLength = Cursor.CONTENTS.length;\n // @ts-expect-error TODO: make isolate generic\n parent.isolate(this.offset(parent), this.length()).unwrap();\n this.savedLength = 0;\n break;\n }\n parent = parent.parent;\n }\n }\n\n value() {\n return '';\n }\n}\n\nexport default Cursor;\n","import type { ScrollBlot } from 'parchment';\nimport { EmbedBlot } from 'parchment';\nimport TextBlot from './text.js';\n\nconst GUARD_TEXT = '\\uFEFF';\n\nexport interface EmbedContextRange {\n startNode: Node | Text;\n startOffset: number;\n endNode?: Node | Text;\n endOffset?: number;\n}\n\nclass Embed extends EmbedBlot {\n contentNode: HTMLSpanElement;\n leftGuard: Text;\n rightGuard: Text;\n\n constructor(scroll: ScrollBlot, node: Node) {\n super(scroll, node);\n this.contentNode = document.createElement('span');\n this.contentNode.setAttribute('contenteditable', 'false');\n Array.from(this.domNode.childNodes).forEach((childNode) => {\n this.contentNode.appendChild(childNode);\n });\n this.leftGuard = document.createTextNode(GUARD_TEXT);\n this.rightGuard = document.createTextNode(GUARD_TEXT);\n this.domNode.appendChild(this.leftGuard);\n this.domNode.appendChild(this.contentNode);\n this.domNode.appendChild(this.rightGuard);\n }\n\n index(node: Node, offset: number) {\n if (node === this.leftGuard) return 0;\n if (node === this.rightGuard) return 1;\n return super.index(node, offset);\n }\n\n restore(node: Text): EmbedContextRange | null {\n let range: EmbedContextRange | null = null;\n let textNode: Text;\n const text = node.data.split(GUARD_TEXT).join('');\n if (node === this.leftGuard) {\n if (this.prev instanceof TextBlot) {\n const prevLength = this.prev.length();\n this.prev.insertAt(prevLength, text);\n range = {\n startNode: this.prev.domNode,\n startOffset: prevLength + text.length,\n };\n } else {\n textNode = document.createTextNode(text);\n this.parent.insertBefore(this.scroll.create(textNode), this);\n range = {\n startNode: textNode,\n startOffset: text.length,\n };\n }\n } else if (node === this.rightGuard) {\n if (this.next instanceof TextBlot) {\n this.next.insertAt(0, text);\n range = {\n startNode: this.next.domNode,\n startOffset: text.length,\n };\n } else {\n textNode = document.createTextNode(text);\n this.parent.insertBefore(this.scroll.create(textNode), this.next);\n range = {\n startNode: textNode,\n startOffset: text.length,\n };\n }\n }\n node.data = GUARD_TEXT;\n return range;\n }\n\n update(mutations: MutationRecord[], context: Record) {\n mutations.forEach((mutation) => {\n if (\n mutation.type === 'characterData' &&\n (mutation.target === this.leftGuard ||\n mutation.target === this.rightGuard)\n ) {\n const range = this.restore(mutation.target as Text);\n if (range) context.range = range;\n }\n });\n }\n}\n\nexport default Embed;\n","import { EmbedBlot, InlineBlot, Scope } from 'parchment';\nimport type { BlotConstructor } from 'parchment';\nimport Break from './break.js';\nimport Text from './text.js';\n\nclass Inline extends InlineBlot {\n static allowedChildren: BlotConstructor[] = [Inline, Break, EmbedBlot, Text];\n // Lower index means deeper in the DOM tree, since not found (-1) is for embeds\n static order = [\n 'cursor',\n 'inline', // Must be lower\n 'link', // Chrome wants to be lower\n 'underline',\n 'strike',\n 'italic',\n 'bold',\n 'script',\n 'code', // Must be higher\n ];\n\n static compare(self: string, other: string) {\n const selfIndex = Inline.order.indexOf(self);\n const otherIndex = Inline.order.indexOf(other);\n if (selfIndex >= 0 || otherIndex >= 0) {\n return selfIndex - otherIndex;\n }\n if (self === other) {\n return 0;\n }\n if (self < other) {\n return -1;\n }\n return 1;\n }\n\n formatAt(index: number, length: number, name: string, value: unknown) {\n if (\n Inline.compare(this.statics.blotName, name) < 0 &&\n this.scroll.query(name, Scope.BLOT)\n ) {\n const blot = this.isolate(index, length);\n if (value) {\n blot.wrap(name, value);\n }\n } else {\n super.formatAt(index, length, name, value);\n }\n }\n\n optimize(context: { [key: string]: any }) {\n super.optimize(context);\n if (\n this.parent instanceof Inline &&\n Inline.compare(this.statics.blotName, this.parent.statics.blotName) > 0\n ) {\n const parent = this.parent.isolate(this.offset(), this.length());\n // @ts-expect-error TODO: make isolate generic\n this.moveChildren(parent);\n parent.wrap(this);\n }\n }\n}\n\nexport default Inline;\n","import { TextBlot } from 'parchment';\n\nclass Text extends TextBlot {}\n\n// https://lodash.com/docs#escape\nconst entityMap: Record = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": ''',\n};\n\nfunction escapeText(text: string) {\n return text.replace(/[&<>\"']/g, (s) => entityMap[s]);\n}\n\nexport { Text as default, escapeText };\n","import { ContainerBlot, LeafBlot, Scope, ScrollBlot } from 'parchment';\nimport type { Blot, Parent, EmbedBlot, ParentBlot, Registry } from 'parchment';\nimport Delta, { AttributeMap, Op } from 'quill-delta';\nimport Emitter from '../core/emitter.js';\nimport type { EmitterSource } from '../core/emitter.js';\nimport Block, { BlockEmbed, bubbleFormats } from './block.js';\nimport Break from './break.js';\nimport Container from './container.js';\n\ntype RenderBlock =\n | {\n type: 'blockEmbed';\n attributes: AttributeMap;\n key: string;\n value: unknown;\n }\n | { type: 'block'; attributes: AttributeMap; delta: Delta };\n\nfunction isLine(blot: unknown): blot is Block | BlockEmbed {\n return blot instanceof Block || blot instanceof BlockEmbed;\n}\n\ninterface UpdatableEmbed {\n updateContent(change: unknown): void;\n}\n\nfunction isUpdatable(blot: Blot): blot is Blot & UpdatableEmbed {\n return typeof (blot as unknown as any).updateContent === 'function';\n}\n\nclass Scroll extends ScrollBlot {\n static blotName = 'scroll';\n static className = 'ql-editor';\n static tagName = 'DIV';\n static defaultChild = Block;\n static allowedChildren = [Block, BlockEmbed, Container];\n\n emitter: Emitter;\n batch: false | MutationRecord[];\n\n constructor(\n registry: Registry,\n domNode: HTMLDivElement,\n { emitter }: { emitter: Emitter },\n ) {\n super(registry, domNode);\n this.emitter = emitter;\n this.batch = false;\n this.optimize();\n this.enable();\n this.domNode.addEventListener('dragstart', (e) => this.handleDragStart(e));\n }\n\n batchStart() {\n if (!Array.isArray(this.batch)) {\n this.batch = [];\n }\n }\n\n batchEnd() {\n if (!this.batch) return;\n const mutations = this.batch;\n this.batch = false;\n this.update(mutations);\n }\n\n emitMount(blot: Blot) {\n this.emitter.emit(Emitter.events.SCROLL_BLOT_MOUNT, blot);\n }\n\n emitUnmount(blot: Blot) {\n this.emitter.emit(Emitter.events.SCROLL_BLOT_UNMOUNT, blot);\n }\n\n emitEmbedUpdate(blot: Blot, change: unknown) {\n this.emitter.emit(Emitter.events.SCROLL_EMBED_UPDATE, blot, change);\n }\n\n deleteAt(index: number, length: number) {\n const [first, offset] = this.line(index);\n const [last] = this.line(index + length);\n super.deleteAt(index, length);\n if (last != null && first !== last && offset > 0) {\n if (first instanceof BlockEmbed || last instanceof BlockEmbed) {\n this.optimize();\n return;\n }\n const ref =\n last.children.head instanceof Break ? null : last.children.head;\n // @ts-expect-error\n first.moveChildren(last, ref);\n // @ts-expect-error\n first.remove();\n }\n this.optimize();\n }\n\n enable(enabled = true) {\n this.domNode.setAttribute('contenteditable', enabled ? 'true' : 'false');\n }\n\n formatAt(index: number, length: number, format: string, value: unknown) {\n super.formatAt(index, length, format, value);\n this.optimize();\n }\n\n insertAt(index: number, value: string, def?: unknown) {\n if (index >= this.length()) {\n if (def == null || this.scroll.query(value, Scope.BLOCK) == null) {\n const blot = this.scroll.create(this.statics.defaultChild.blotName);\n this.appendChild(blot);\n if (def == null && value.endsWith('\\n')) {\n blot.insertAt(0, value.slice(0, -1), def);\n } else {\n blot.insertAt(0, value, def);\n }\n } else {\n const embed = this.scroll.create(value, def);\n this.appendChild(embed);\n }\n } else {\n super.insertAt(index, value, def);\n }\n this.optimize();\n }\n\n insertBefore(blot: Blot, ref?: Blot | null) {\n if (blot.statics.scope === Scope.INLINE_BLOT) {\n const wrapper = this.scroll.create(\n this.statics.defaultChild.blotName,\n ) as Parent;\n wrapper.appendChild(blot);\n super.insertBefore(wrapper, ref);\n } else {\n super.insertBefore(blot, ref);\n }\n }\n\n insertContents(index: number, delta: Delta) {\n const renderBlocks = this.deltaToRenderBlocks(\n delta.concat(new Delta().insert('\\n')),\n );\n const last = renderBlocks.pop();\n if (last == null) return;\n\n this.batchStart();\n\n const first = renderBlocks.shift();\n if (first) {\n const shouldInsertNewlineChar =\n first.type === 'block' &&\n (first.delta.length() === 0 ||\n (!this.descendant(BlockEmbed, index)[0] && index < this.length()));\n const delta =\n first.type === 'block'\n ? first.delta\n : new Delta().insert({ [first.key]: first.value });\n insertInlineContents(this, index, delta);\n const newlineCharLength = first.type === 'block' ? 1 : 0;\n const lineEndIndex = index + delta.length() + newlineCharLength;\n if (shouldInsertNewlineChar) {\n this.insertAt(lineEndIndex - 1, '\\n');\n }\n\n const formats = bubbleFormats(this.line(index)[0]);\n const attributes = AttributeMap.diff(formats, first.attributes) || {};\n Object.keys(attributes).forEach((name) => {\n this.formatAt(lineEndIndex - 1, 1, name, attributes[name]);\n });\n\n index = lineEndIndex;\n }\n\n let [refBlot, refBlotOffset] = this.children.find(index);\n if (renderBlocks.length) {\n if (refBlot) {\n refBlot = refBlot.split(refBlotOffset);\n refBlotOffset = 0;\n }\n\n renderBlocks.forEach((renderBlock) => {\n if (renderBlock.type === 'block') {\n const block = this.createBlock(\n renderBlock.attributes,\n refBlot || undefined,\n );\n insertInlineContents(block, 0, renderBlock.delta);\n } else {\n const blockEmbed = this.create(\n renderBlock.key,\n renderBlock.value,\n ) as EmbedBlot;\n this.insertBefore(blockEmbed, refBlot || undefined);\n Object.keys(renderBlock.attributes).forEach((name) => {\n blockEmbed.format(name, renderBlock.attributes[name]);\n });\n }\n });\n }\n\n if (last.type === 'block' && last.delta.length()) {\n const offset = refBlot\n ? refBlot.offset(refBlot.scroll) + refBlotOffset\n : this.length();\n insertInlineContents(this, offset, last.delta);\n }\n\n this.batchEnd();\n this.optimize();\n }\n\n isEnabled() {\n return this.domNode.getAttribute('contenteditable') === 'true';\n }\n\n leaf(index: number): [LeafBlot | null, number] {\n const last = this.path(index).pop();\n if (!last) {\n return [null, -1];\n }\n\n const [blot, offset] = last;\n return blot instanceof LeafBlot ? [blot, offset] : [null, -1];\n }\n\n line(index: number): [Block | BlockEmbed | null, number] {\n if (index === this.length()) {\n return this.line(index - 1);\n }\n // @ts-expect-error TODO: make descendant() generic\n return this.descendant(isLine, index);\n }\n\n lines(index = 0, length = Number.MAX_VALUE): (Block | BlockEmbed)[] {\n const getLines = (\n blot: ParentBlot,\n blotIndex: number,\n blotLength: number,\n ) => {\n let lines: (Block | BlockEmbed)[] = [];\n let lengthLeft = blotLength;\n blot.children.forEachAt(\n blotIndex,\n blotLength,\n (child, childIndex, childLength) => {\n if (isLine(child)) {\n lines.push(child);\n } else if (child instanceof ContainerBlot) {\n lines = lines.concat(getLines(child, childIndex, lengthLeft));\n }\n lengthLeft -= childLength;\n },\n );\n return lines;\n };\n return getLines(this, index, length);\n }\n\n optimize(context?: { [key: string]: any }): void;\n optimize(\n mutations?: MutationRecord[],\n context?: { [key: string]: any },\n ): void;\n optimize(mutations = [], context = {}) {\n if (this.batch) return;\n super.optimize(mutations, context);\n if (mutations.length > 0) {\n this.emitter.emit(Emitter.events.SCROLL_OPTIMIZE, mutations, context);\n }\n }\n\n path(index: number) {\n return super.path(index).slice(1); // Exclude self\n }\n\n remove() {\n // Never remove self\n }\n\n update(source?: EmitterSource): void;\n update(mutations?: MutationRecord[]): void;\n update(mutations?: MutationRecord[] | EmitterSource): void {\n if (this.batch) {\n if (Array.isArray(mutations)) {\n this.batch = this.batch.concat(mutations);\n }\n return;\n }\n let source: EmitterSource = Emitter.sources.USER;\n if (typeof mutations === 'string') {\n source = mutations;\n }\n if (!Array.isArray(mutations)) {\n mutations = this.observer.takeRecords();\n }\n mutations = mutations.filter(({ target }) => {\n const blot = this.find(target, true);\n return blot && !isUpdatable(blot);\n });\n if (mutations.length > 0) {\n this.emitter.emit(Emitter.events.SCROLL_BEFORE_UPDATE, source, mutations);\n }\n super.update(mutations.concat([])); // pass copy\n if (mutations.length > 0) {\n this.emitter.emit(Emitter.events.SCROLL_UPDATE, source, mutations);\n }\n }\n\n updateEmbedAt(index: number, key: string, change: unknown) {\n // Currently it only supports top-level embeds (BlockEmbed).\n // We can update `ParentBlot` in parchment to support inline embeds.\n const [blot] = this.descendant((b: Blot) => b instanceof BlockEmbed, index);\n if (blot && blot.statics.blotName === key && isUpdatable(blot)) {\n blot.updateContent(change);\n }\n }\n\n protected handleDragStart(event: DragEvent) {\n event.preventDefault();\n }\n\n private deltaToRenderBlocks(delta: Delta) {\n const renderBlocks: RenderBlock[] = [];\n\n let currentBlockDelta = new Delta();\n delta.forEach((op) => {\n const insert = op?.insert;\n if (!insert) return;\n if (typeof insert === 'string') {\n const splitted = insert.split('\\n');\n splitted.slice(0, -1).forEach((text) => {\n currentBlockDelta.insert(text, op.attributes);\n renderBlocks.push({\n type: 'block',\n delta: currentBlockDelta,\n attributes: op.attributes ?? {},\n });\n currentBlockDelta = new Delta();\n });\n const last = splitted[splitted.length - 1];\n if (last) {\n currentBlockDelta.insert(last, op.attributes);\n }\n } else {\n const key = Object.keys(insert)[0];\n if (!key) return;\n if (this.query(key, Scope.INLINE)) {\n currentBlockDelta.push(op);\n } else {\n if (currentBlockDelta.length()) {\n renderBlocks.push({\n type: 'block',\n delta: currentBlockDelta,\n attributes: {},\n });\n }\n currentBlockDelta = new Delta();\n renderBlocks.push({\n type: 'blockEmbed',\n key,\n value: insert[key],\n attributes: op.attributes ?? {},\n });\n }\n }\n });\n\n if (currentBlockDelta.length()) {\n renderBlocks.push({\n type: 'block',\n delta: currentBlockDelta,\n attributes: {},\n });\n }\n\n return renderBlocks;\n }\n\n private createBlock(attributes: AttributeMap, refBlot?: Blot) {\n let blotName: string | undefined;\n const formats: AttributeMap = {};\n\n Object.entries(attributes).forEach(([key, value]) => {\n const isBlockBlot = this.query(key, Scope.BLOCK & Scope.BLOT) != null;\n if (isBlockBlot) {\n blotName = key;\n } else {\n formats[key] = value;\n }\n });\n\n const block = this.create(\n blotName || this.statics.defaultChild.blotName,\n blotName ? attributes[blotName] : undefined,\n ) as ParentBlot;\n\n this.insertBefore(block, refBlot || undefined);\n\n const length = block.length();\n Object.entries(formats).forEach(([key, value]) => {\n block.formatAt(0, length, key, value);\n });\n\n return block;\n }\n}\n\nfunction insertInlineContents(\n parent: ParentBlot,\n index: number,\n inlineContents: Delta,\n) {\n inlineContents.reduce((index, op) => {\n const length = Op.length(op);\n let attributes = op.attributes || {};\n if (op.insert != null) {\n if (typeof op.insert === 'string') {\n const text = op.insert;\n parent.insertAt(index, text);\n const [leaf] = parent.descendant(LeafBlot, index);\n const formats = bubbleFormats(leaf);\n attributes = AttributeMap.diff(formats, attributes) || {};\n } else if (typeof op.insert === 'object') {\n const key = Object.keys(op.insert)[0]; // There should only be one key\n if (key == null) return index;\n parent.insertAt(index, key, op.insert[key]);\n const isInlineEmbed = parent.scroll.query(key, Scope.INLINE) != null;\n if (isInlineEmbed) {\n const [leaf] = parent.descendant(LeafBlot, index);\n const formats = bubbleFormats(leaf);\n attributes = AttributeMap.diff(formats, attributes) || {};\n }\n }\n }\n Object.keys(attributes).forEach((key) => {\n parent.formatAt(index, length, key, attributes[key]);\n });\n return index + length;\n }, index);\n}\n\nexport default Scroll;\n","import { Scope } from 'parchment';\nimport type Delta from 'quill-delta';\nimport Module from '../core/module.js';\nimport Quill from '../core/quill.js';\nimport type Scroll from '../blots/scroll.js';\nimport type { Range } from '../core/selection.js';\n\nexport interface HistoryOptions {\n userOnly: boolean;\n delay: number;\n maxStack: number;\n}\n\nexport interface StackItem {\n delta: Delta;\n range: Range | null;\n}\n\ninterface Stack {\n undo: StackItem[];\n redo: StackItem[];\n}\n\nclass History extends Module {\n static DEFAULTS: HistoryOptions = {\n delay: 1000,\n maxStack: 100,\n userOnly: false,\n };\n\n lastRecorded = 0;\n ignoreChange = false;\n stack: Stack = { undo: [], redo: [] };\n currentRange: Range | null = null;\n\n constructor(quill: Quill, options: Partial) {\n super(quill, options);\n this.quill.on(\n Quill.events.EDITOR_CHANGE,\n (eventName, value, oldValue, source) => {\n if (eventName === Quill.events.SELECTION_CHANGE) {\n if (value && source !== Quill.sources.SILENT) {\n this.currentRange = value;\n }\n } else if (eventName === Quill.events.TEXT_CHANGE) {\n if (!this.ignoreChange) {\n if (!this.options.userOnly || source === Quill.sources.USER) {\n this.record(value, oldValue);\n } else {\n this.transform(value);\n }\n }\n\n this.currentRange = transformRange(this.currentRange, value);\n }\n },\n );\n\n this.quill.keyboard.addBinding(\n { key: 'z', shortKey: true },\n this.undo.bind(this),\n );\n this.quill.keyboard.addBinding(\n { key: ['z', 'Z'], shortKey: true, shiftKey: true },\n this.redo.bind(this),\n );\n if (/Win/i.test(navigator.platform)) {\n this.quill.keyboard.addBinding(\n { key: 'y', shortKey: true },\n this.redo.bind(this),\n );\n }\n\n this.quill.root.addEventListener('beforeinput', (event) => {\n if (event.inputType === 'historyUndo') {\n this.undo();\n event.preventDefault();\n } else if (event.inputType === 'historyRedo') {\n this.redo();\n event.preventDefault();\n }\n });\n }\n\n change(source: 'undo' | 'redo', dest: 'redo' | 'undo') {\n if (this.stack[source].length === 0) return;\n const item = this.stack[source].pop();\n if (!item) return;\n const base = this.quill.getContents();\n const inverseDelta = item.delta.invert(base);\n this.stack[dest].push({\n delta: inverseDelta,\n range: transformRange(item.range, inverseDelta),\n });\n this.lastRecorded = 0;\n this.ignoreChange = true;\n this.quill.updateContents(item.delta, Quill.sources.USER);\n this.ignoreChange = false;\n\n this.restoreSelection(item);\n }\n\n clear() {\n this.stack = { undo: [], redo: [] };\n }\n\n cutoff() {\n this.lastRecorded = 0;\n }\n\n record(changeDelta: Delta, oldDelta: Delta) {\n if (changeDelta.ops.length === 0) return;\n this.stack.redo = [];\n let undoDelta = changeDelta.invert(oldDelta);\n let undoRange = this.currentRange;\n const timestamp = Date.now();\n if (\n // @ts-expect-error Fix me later\n this.lastRecorded + this.options.delay > timestamp &&\n this.stack.undo.length > 0\n ) {\n const item = this.stack.undo.pop();\n if (item) {\n undoDelta = undoDelta.compose(item.delta);\n undoRange = item.range;\n }\n } else {\n this.lastRecorded = timestamp;\n }\n if (undoDelta.length() === 0) return;\n this.stack.undo.push({ delta: undoDelta, range: undoRange });\n // @ts-expect-error Fix me later\n if (this.stack.undo.length > this.options.maxStack) {\n this.stack.undo.shift();\n }\n }\n\n redo() {\n this.change('redo', 'undo');\n }\n\n transform(delta: Delta) {\n transformStack(this.stack.undo, delta);\n transformStack(this.stack.redo, delta);\n }\n\n undo() {\n this.change('undo', 'redo');\n }\n\n protected restoreSelection(stackItem: StackItem) {\n if (stackItem.range) {\n this.quill.setSelection(stackItem.range, Quill.sources.USER);\n } else {\n const index = getLastChangeIndex(this.quill.scroll, stackItem.delta);\n this.quill.setSelection(index, Quill.sources.USER);\n }\n }\n}\n\nfunction transformStack(stack: StackItem[], delta: Delta) {\n let remoteDelta = delta;\n for (let i = stack.length - 1; i >= 0; i -= 1) {\n const oldItem = stack[i];\n stack[i] = {\n delta: remoteDelta.transform(oldItem.delta, true),\n range: oldItem.range && transformRange(oldItem.range, remoteDelta),\n };\n remoteDelta = oldItem.delta.transform(remoteDelta);\n if (stack[i].delta.length() === 0) {\n stack.splice(i, 1);\n }\n }\n}\n\nfunction endsWithNewlineChange(scroll: Scroll, delta: Delta) {\n const lastOp = delta.ops[delta.ops.length - 1];\n if (lastOp == null) return false;\n if (lastOp.insert != null) {\n return typeof lastOp.insert === 'string' && lastOp.insert.endsWith('\\n');\n }\n if (lastOp.attributes != null) {\n return Object.keys(lastOp.attributes).some((attr) => {\n return scroll.query(attr, Scope.BLOCK) != null;\n });\n }\n return false;\n}\n\nfunction getLastChangeIndex(scroll: Scroll, delta: Delta) {\n const deleteLength = delta.reduce((length, op) => {\n return length + (op.delete || 0);\n }, 0);\n let changeIndex = delta.length() - deleteLength;\n if (endsWithNewlineChange(scroll, delta)) {\n changeIndex -= 1;\n }\n return changeIndex;\n}\n\nfunction transformRange(range: Range | null, delta: Delta) {\n if (!range) return range;\n const start = delta.transformPosition(range.index);\n const end = delta.transformPosition(range.index + range.length);\n return { index: start, length: end - start };\n}\n\nexport { History as default, getLastChangeIndex };\n","import Delta from 'quill-delta';\nimport type Quill from '../core/quill.js';\nimport Emitter from '../core/emitter.js';\nimport Module from '../core/module.js';\nimport type { Range } from '../core/selection.js';\n\ninterface UploaderOptions {\n mimetypes: string[];\n handler: (this: { quill: Quill }, range: Range, files: File[]) => void;\n}\n\nclass Uploader extends Module {\n static DEFAULTS: UploaderOptions;\n\n constructor(quill: Quill, options: Partial) {\n super(quill, options);\n quill.root.addEventListener('drop', (e) => {\n e.preventDefault();\n let native: ReturnType | null = null;\n if (document.caretRangeFromPoint) {\n native = document.caretRangeFromPoint(e.clientX, e.clientY);\n // @ts-expect-error\n } else if (document.caretPositionFromPoint) {\n // @ts-expect-error\n const position = document.caretPositionFromPoint(e.clientX, e.clientY);\n native = document.createRange();\n native.setStart(position.offsetNode, position.offset);\n native.setEnd(position.offsetNode, position.offset);\n }\n\n const normalized = native && quill.selection.normalizeNative(native);\n if (normalized) {\n const range = quill.selection.normalizedToRange(normalized);\n if (e.dataTransfer?.files) {\n this.upload(range, e.dataTransfer.files);\n }\n }\n });\n }\n\n upload(range: Range, files: FileList | File[]) {\n const uploads: File[] = [];\n Array.from(files).forEach((file) => {\n if (file && this.options.mimetypes?.includes(file.type)) {\n uploads.push(file);\n }\n });\n if (uploads.length > 0) {\n // @ts-expect-error Fix me later\n this.options.handler.call(this, range, uploads);\n }\n }\n}\n\nUploader.DEFAULTS = {\n mimetypes: ['image/png', 'image/jpeg'],\n handler(range: Range, files: File[]) {\n if (!this.quill.scroll.query('image')) {\n return;\n }\n const promises = files.map>((file) => {\n return new Promise((resolve) => {\n const reader = new FileReader();\n reader.onload = () => {\n resolve(reader.result as string);\n };\n reader.readAsDataURL(file);\n });\n });\n Promise.all(promises).then((images) => {\n const update = images.reduce((delta: Delta, image) => {\n return delta.insert({ image });\n }, new Delta().retain(range.index).delete(range.length)) as Delta;\n this.quill.updateContents(update, Emitter.sources.USER);\n this.quill.setSelection(\n range.index + images.length,\n Emitter.sources.SILENT,\n );\n });\n },\n};\n\nexport default Uploader;\n","import Delta from 'quill-delta';\nimport Module from '../core/module.js';\nimport Quill from '../core/quill.js';\nimport type { Range } from '../core/selection.js';\nimport { deleteRange } from './keyboard.js';\n\nconst INSERT_TYPES = ['insertText', 'insertReplacementText'];\n\nclass Input extends Module {\n constructor(quill: Quill, options: Record) {\n super(quill, options);\n\n quill.root.addEventListener('beforeinput', (event) => {\n this.handleBeforeInput(event);\n });\n\n // Gboard with English input on Android triggers `compositionstart` sometimes even\n // users are not going to type anything.\n if (!/Android/i.test(navigator.userAgent)) {\n quill.on(Quill.events.COMPOSITION_BEFORE_START, () => {\n this.handleCompositionStart();\n });\n }\n }\n\n private deleteRange(range: Range) {\n deleteRange({ range, quill: this.quill });\n }\n\n private replaceText(range: Range, text = '') {\n if (range.length === 0) return false;\n\n if (text) {\n // Follow the native behavior that inherits the formats of the first character\n const formats = this.quill.getFormat(range.index, 1);\n this.deleteRange(range);\n this.quill.updateContents(\n new Delta().retain(range.index).insert(text, formats),\n Quill.sources.USER,\n );\n } else {\n this.deleteRange(range);\n }\n\n this.quill.setSelection(range.index + text.length, 0, Quill.sources.SILENT);\n return true;\n }\n\n private handleBeforeInput(event: InputEvent) {\n if (\n this.quill.composition.isComposing ||\n event.defaultPrevented ||\n !INSERT_TYPES.includes(event.inputType)\n ) {\n return;\n }\n\n const staticRange = event.getTargetRanges\n ? event.getTargetRanges()[0]\n : null;\n if (!staticRange || staticRange.collapsed === true) {\n return;\n }\n\n const text = getPlainTextFromInputEvent(event);\n if (text == null) {\n return;\n }\n const normalized = this.quill.selection.normalizeNative(staticRange);\n const range = normalized\n ? this.quill.selection.normalizedToRange(normalized)\n : null;\n if (range && this.replaceText(range, text)) {\n event.preventDefault();\n }\n }\n\n private handleCompositionStart() {\n const range = this.quill.getSelection();\n if (range) {\n this.replaceText(range);\n }\n }\n}\n\nfunction getPlainTextFromInputEvent(event: InputEvent) {\n // When `inputType` is \"insertText\":\n // - `event.data` should be string (Safari uses `event.dataTransfer`).\n // - `event.dataTransfer` should be null.\n // When `inputType` is \"insertReplacementText\":\n // - `event.data` should be null.\n // - `event.dataTransfer` should contain \"text/plain\" data.\n\n if (typeof event.data === 'string') {\n return event.data;\n }\n if (event.dataTransfer?.types.includes('text/plain')) {\n return event.dataTransfer.getData('text/plain');\n }\n return null;\n}\n\nexport default Input;\n","import { ParentBlot } from 'parchment';\nimport Module from '../core/module.js';\nimport Quill from '../core/quill.js';\n\nconst isMac = /Mac/i.test(navigator.platform);\n\n// Export for testing\nexport const TTL_FOR_VALID_SELECTION_CHANGE = 100;\n\n// A loose check to determine if the shortcut can move the caret before a UI node:\n// [CARET]
    [CONTENT]
    \nconst canMoveCaretBeforeUINode = (event: KeyboardEvent) => {\n if (\n event.key === 'ArrowLeft' ||\n event.key === 'ArrowRight' || // RTL scripts or moving from the end of the previous line\n event.key === 'ArrowUp' ||\n event.key === 'ArrowDown' ||\n event.key === 'Home'\n ) {\n return true;\n }\n\n if (isMac && event.key === 'a' && event.ctrlKey === true) {\n return true;\n }\n\n return false;\n};\n\nclass UINode extends Module {\n isListening = false;\n selectionChangeDeadline = 0;\n\n constructor(quill: Quill, options: Record) {\n super(quill, options);\n\n this.handleArrowKeys();\n this.handleNavigationShortcuts();\n }\n\n private handleArrowKeys() {\n this.quill.keyboard.addBinding({\n key: ['ArrowLeft', 'ArrowRight'],\n offset: 0,\n shiftKey: null,\n handler(range, { line, event }) {\n if (!(line instanceof ParentBlot) || !line.uiNode) {\n return true;\n }\n\n const isRTL = getComputedStyle(line.domNode)['direction'] === 'rtl';\n if (\n (isRTL && event.key !== 'ArrowRight') ||\n (!isRTL && event.key !== 'ArrowLeft')\n ) {\n return true;\n }\n\n this.quill.setSelection(\n range.index - 1,\n range.length + (event.shiftKey ? 1 : 0),\n Quill.sources.USER,\n );\n return false;\n },\n });\n }\n\n private handleNavigationShortcuts() {\n this.quill.root.addEventListener('keydown', (event) => {\n if (!event.defaultPrevented && canMoveCaretBeforeUINode(event)) {\n this.ensureListeningToSelectionChange();\n }\n });\n }\n\n /**\n * We only listen to the `selectionchange` event when\n * there is an intention of moving the caret to the beginning using shortcuts.\n * This is primarily implemented to prevent infinite loops, as we are changing\n * the selection within the handler of a `selectionchange` event.\n */\n private ensureListeningToSelectionChange() {\n this.selectionChangeDeadline = Date.now() + TTL_FOR_VALID_SELECTION_CHANGE;\n\n if (this.isListening) return;\n this.isListening = true;\n\n const listener = () => {\n this.isListening = false;\n\n if (Date.now() <= this.selectionChangeDeadline) {\n this.handleSelectionChange();\n }\n };\n\n document.addEventListener('selectionchange', listener, {\n once: true,\n });\n }\n\n private handleSelectionChange() {\n const selection = document.getSelection();\n if (!selection) return;\n const range = selection.getRangeAt(0);\n if (range.collapsed !== true || range.startOffset !== 0) return;\n\n const line = this.quill.scroll.find(range.startContainer);\n if (!(line instanceof ParentBlot) || !line.uiNode) return;\n\n const newRange = document.createRange();\n newRange.setStartAfter(line.uiNode);\n newRange.setEndAfter(line.uiNode);\n selection.removeAllRanges();\n selection.addRange(newRange);\n }\n}\n\nexport default UINode;\n","import Quill, { Parchment, Range } from './core/quill.js';\nimport type {\n Bounds,\n DebugLevel,\n EmitterSource,\n ExpandedQuillOptions,\n QuillOptions,\n} from './core/quill.js';\n\nimport Block, { BlockEmbed } from './blots/block.js';\nimport Break from './blots/break.js';\nimport Container from './blots/container.js';\nimport Cursor from './blots/cursor.js';\nimport Embed from './blots/embed.js';\nimport Inline from './blots/inline.js';\nimport Scroll from './blots/scroll.js';\nimport TextBlot from './blots/text.js';\n\nimport Clipboard from './modules/clipboard.js';\nimport History from './modules/history.js';\nimport Keyboard from './modules/keyboard.js';\nimport Uploader from './modules/uploader.js';\nimport Delta, { Op, OpIterator, AttributeMap } from 'quill-delta';\nimport Input from './modules/input.js';\nimport UINode from './modules/uiNode.js';\n\nexport { default as Module } from './core/module.js';\nexport { Delta, Op, OpIterator, AttributeMap, Parchment, Range };\nexport type {\n Bounds,\n DebugLevel,\n EmitterSource,\n ExpandedQuillOptions,\n QuillOptions,\n};\n\nQuill.register({\n 'blots/block': Block,\n 'blots/block/embed': BlockEmbed,\n 'blots/break': Break,\n 'blots/container': Container,\n 'blots/cursor': Cursor,\n 'blots/embed': Embed,\n 'blots/inline': Inline,\n 'blots/scroll': Scroll,\n 'blots/text': TextBlot,\n\n 'modules/clipboard': Clipboard,\n 'modules/history': History,\n 'modules/keyboard': Keyboard,\n 'modules/uploader': Uploader,\n 'modules/input': Input,\n 'modules/uiNode': UINode,\n});\n\nexport default Quill;\n","import { EventEmitter } from 'eventemitter3';\nimport instances from './instances.js';\nimport logger from './logger.js';\n\nconst debug = logger('quill:events');\nconst EVENTS = ['selectionchange', 'mousedown', 'mouseup', 'click'];\n\nEVENTS.forEach((eventName) => {\n document.addEventListener(eventName, (...args) => {\n Array.from(document.querySelectorAll('.ql-container')).forEach((node) => {\n const quill = instances.get(node);\n if (quill && quill.emitter) {\n quill.emitter.handleDOM(...args);\n }\n });\n });\n});\n\nclass Emitter extends EventEmitter {\n static events = {\n EDITOR_CHANGE: 'editor-change',\n SCROLL_BEFORE_UPDATE: 'scroll-before-update',\n SCROLL_BLOT_MOUNT: 'scroll-blot-mount',\n SCROLL_BLOT_UNMOUNT: 'scroll-blot-unmount',\n SCROLL_OPTIMIZE: 'scroll-optimize',\n SCROLL_UPDATE: 'scroll-update',\n SCROLL_EMBED_UPDATE: 'scroll-embed-update',\n SELECTION_CHANGE: 'selection-change',\n TEXT_CHANGE: 'text-change',\n COMPOSITION_BEFORE_START: 'composition-before-start',\n COMPOSITION_START: 'composition-start',\n COMPOSITION_BEFORE_END: 'composition-before-end',\n COMPOSITION_END: 'composition-end',\n } as const;\n\n static sources = {\n API: 'api',\n SILENT: 'silent',\n USER: 'user',\n } as const;\n\n protected domListeners: Record;\n\n constructor() {\n super();\n this.domListeners = {};\n this.on('error', debug.error);\n }\n\n emit(...args: unknown[]): boolean {\n debug.log.call(debug, ...args);\n // @ts-expect-error\n return super.emit(...args);\n }\n\n handleDOM(event: Event, ...args: unknown[]) {\n (this.domListeners[event.type] || []).forEach(({ node, handler }) => {\n if (event.target === node || node.contains(event.target as Node)) {\n handler(event, ...args);\n }\n });\n }\n\n listenDOM(eventName: string, node: Node, handler: EventListener) {\n if (!this.domListeners[eventName]) {\n this.domListeners[eventName] = [];\n }\n this.domListeners[eventName].push({ node, handler });\n }\n}\n\nexport type EmitterSource =\n (typeof Emitter.sources)[keyof typeof Emitter.sources];\n\nexport default Emitter;\n","import type Quill from '../core.js';\n\nexport default new WeakMap();\n","const levels = ['error', 'warn', 'log', 'info'] as const;\nexport type DebugLevel = (typeof levels)[number];\nlet level: DebugLevel | false = 'warn';\n\nfunction debug(method: DebugLevel, ...args: unknown[]) {\n if (level) {\n if (levels.indexOf(method) <= levels.indexOf(level)) {\n console[method](...args); // eslint-disable-line no-console\n }\n }\n}\n\nfunction namespace(\n ns: string,\n): Record void> {\n return levels.reduce(\n (logger, method) => {\n logger[method] = debug.bind(console, method, ns);\n return logger;\n },\n {} as Record void>,\n );\n}\n\nnamespace.level = (newLevel: DebugLevel | false) => {\n level = newLevel;\n};\ndebug.level = namespace.level;\n\nexport default namespace;\n","import type Quill from './quill.js';\n\nabstract class Module {\n static DEFAULTS = {};\n\n constructor(\n public quill: Quill,\n protected options: Partial = {},\n ) {}\n}\n\nexport default Module;\n","import { cloneDeep, isEqual, merge } from 'lodash-es';\nimport { LeafBlot, EmbedBlot, Scope, ParentBlot } from 'parchment';\nimport type { Blot } from 'parchment';\nimport Delta, { AttributeMap, Op } from 'quill-delta';\nimport Block, { BlockEmbed, bubbleFormats } from '../blots/block.js';\nimport Break from '../blots/break.js';\nimport CursorBlot from '../blots/cursor.js';\nimport type Scroll from '../blots/scroll.js';\nimport TextBlot, { escapeText } from '../blots/text.js';\nimport { Range } from './selection.js';\n\nconst ASCII = /^[ -~]*$/;\n\ntype SelectionInfo = {\n newRange: Range;\n oldRange: Range;\n};\n\nclass Editor {\n scroll: Scroll;\n delta: Delta;\n\n constructor(scroll: Scroll) {\n this.scroll = scroll;\n this.delta = this.getDelta();\n }\n\n applyDelta(delta: Delta): Delta {\n this.scroll.update();\n let scrollLength = this.scroll.length();\n this.scroll.batchStart();\n const normalizedDelta = normalizeDelta(delta);\n const deleteDelta = new Delta();\n const normalizedOps = splitOpLines(normalizedDelta.ops.slice());\n normalizedOps.reduce((index, op) => {\n const length = Op.length(op);\n let attributes = op.attributes || {};\n let isImplicitNewlinePrepended = false;\n let isImplicitNewlineAppended = false;\n if (op.insert != null) {\n deleteDelta.retain(length);\n if (typeof op.insert === 'string') {\n const text = op.insert;\n isImplicitNewlineAppended =\n !text.endsWith('\\n') &&\n (scrollLength <= index ||\n !!this.scroll.descendant(BlockEmbed, index)[0]);\n this.scroll.insertAt(index, text);\n const [line, offset] = this.scroll.line(index);\n let formats = merge({}, bubbleFormats(line));\n if (line instanceof Block) {\n const [leaf] = line.descendant(LeafBlot, offset);\n if (leaf) {\n formats = merge(formats, bubbleFormats(leaf));\n }\n }\n attributes = AttributeMap.diff(formats, attributes) || {};\n } else if (typeof op.insert === 'object') {\n const key = Object.keys(op.insert)[0]; // There should only be one key\n if (key == null) return index;\n const isInlineEmbed = this.scroll.query(key, Scope.INLINE) != null;\n if (isInlineEmbed) {\n if (\n scrollLength <= index ||\n !!this.scroll.descendant(BlockEmbed, index)[0]\n ) {\n isImplicitNewlineAppended = true;\n }\n } else if (index > 0) {\n const [leaf, offset] = this.scroll.descendant(LeafBlot, index - 1);\n if (leaf instanceof TextBlot) {\n const text = leaf.value();\n if (text[offset] !== '\\n') {\n isImplicitNewlinePrepended = true;\n }\n } else if (\n leaf instanceof EmbedBlot &&\n leaf.statics.scope === Scope.INLINE_BLOT\n ) {\n isImplicitNewlinePrepended = true;\n }\n }\n this.scroll.insertAt(index, key, op.insert[key]);\n\n if (isInlineEmbed) {\n const [leaf] = this.scroll.descendant(LeafBlot, index);\n if (leaf) {\n const formats = merge({}, bubbleFormats(leaf));\n attributes = AttributeMap.diff(formats, attributes) || {};\n }\n }\n }\n scrollLength += length;\n } else {\n deleteDelta.push(op);\n\n if (op.retain !== null && typeof op.retain === 'object') {\n const key = Object.keys(op.retain)[0];\n if (key == null) return index;\n this.scroll.updateEmbedAt(index, key, op.retain[key]);\n }\n }\n Object.keys(attributes).forEach((name) => {\n this.scroll.formatAt(index, length, name, attributes[name]);\n });\n const prependedLength = isImplicitNewlinePrepended ? 1 : 0;\n const addedLength = isImplicitNewlineAppended ? 1 : 0;\n scrollLength += prependedLength + addedLength;\n deleteDelta.retain(prependedLength);\n deleteDelta.delete(addedLength);\n return index + length + prependedLength + addedLength;\n }, 0);\n deleteDelta.reduce((index, op) => {\n if (typeof op.delete === 'number') {\n this.scroll.deleteAt(index, op.delete);\n return index;\n }\n return index + Op.length(op);\n }, 0);\n this.scroll.batchEnd();\n this.scroll.optimize();\n return this.update(normalizedDelta);\n }\n\n deleteText(index: number, length: number): Delta {\n this.scroll.deleteAt(index, length);\n return this.update(new Delta().retain(index).delete(length));\n }\n\n formatLine(\n index: number,\n length: number,\n formats: Record = {},\n ): Delta {\n this.scroll.update();\n Object.keys(formats).forEach((format) => {\n this.scroll.lines(index, Math.max(length, 1)).forEach((line) => {\n line.format(format, formats[format]);\n });\n });\n this.scroll.optimize();\n const delta = new Delta().retain(index).retain(length, cloneDeep(formats));\n return this.update(delta);\n }\n\n formatText(\n index: number,\n length: number,\n formats: Record = {},\n ): Delta {\n Object.keys(formats).forEach((format) => {\n this.scroll.formatAt(index, length, format, formats[format]);\n });\n const delta = new Delta().retain(index).retain(length, cloneDeep(formats));\n return this.update(delta);\n }\n\n getContents(index: number, length: number): Delta {\n return this.delta.slice(index, index + length);\n }\n\n getDelta(): Delta {\n return this.scroll.lines().reduce((delta, line) => {\n return delta.concat(line.delta());\n }, new Delta());\n }\n\n getFormat(index: number, length = 0): Record {\n let lines: (Block | BlockEmbed)[] = [];\n let leaves: LeafBlot[] = [];\n if (length === 0) {\n this.scroll.path(index).forEach((path) => {\n const [blot] = path;\n if (blot instanceof Block) {\n lines.push(blot);\n } else if (blot instanceof LeafBlot) {\n leaves.push(blot);\n }\n });\n } else {\n lines = this.scroll.lines(index, length);\n leaves = this.scroll.descendants(LeafBlot, index, length);\n }\n const [lineFormats, leafFormats] = [lines, leaves].map((blots) => {\n const blot = blots.shift();\n if (blot == null) return {};\n let formats = bubbleFormats(blot);\n while (Object.keys(formats).length > 0) {\n const blot = blots.shift();\n if (blot == null) return formats;\n formats = combineFormats(bubbleFormats(blot), formats);\n }\n return formats;\n });\n return { ...lineFormats, ...leafFormats };\n }\n\n getHTML(index: number, length: number): string {\n const [line, lineOffset] = this.scroll.line(index);\n if (line) {\n const lineLength = line.length();\n const isWithinLine = line.length() >= lineOffset + length;\n if (isWithinLine && !(lineOffset === 0 && length === lineLength)) {\n return convertHTML(line, lineOffset, length, true);\n }\n return convertHTML(this.scroll, index, length, true);\n }\n return '';\n }\n\n getText(index: number, length: number): string {\n return this.getContents(index, length)\n .filter((op) => typeof op.insert === 'string')\n .map((op) => op.insert)\n .join('');\n }\n\n insertContents(index: number, contents: Delta): Delta {\n const normalizedDelta = normalizeDelta(contents);\n const change = new Delta().retain(index).concat(normalizedDelta);\n this.scroll.insertContents(index, normalizedDelta);\n return this.update(change);\n }\n\n insertEmbed(index: number, embed: string, value: unknown): Delta {\n this.scroll.insertAt(index, embed, value);\n return this.update(new Delta().retain(index).insert({ [embed]: value }));\n }\n\n insertText(\n index: number,\n text: string,\n formats: Record = {},\n ): Delta {\n text = text.replace(/\\r\\n/g, '\\n').replace(/\\r/g, '\\n');\n this.scroll.insertAt(index, text);\n Object.keys(formats).forEach((format) => {\n this.scroll.formatAt(index, text.length, format, formats[format]);\n });\n return this.update(\n new Delta().retain(index).insert(text, cloneDeep(formats)),\n );\n }\n\n isBlank(): boolean {\n if (this.scroll.children.length === 0) return true;\n if (this.scroll.children.length > 1) return false;\n const blot = this.scroll.children.head;\n if (blot?.statics.blotName !== Block.blotName) return false;\n const block = blot as Block;\n if (block.children.length > 1) return false;\n return block.children.head instanceof Break;\n }\n\n removeFormat(index: number, length: number): Delta {\n const text = this.getText(index, length);\n const [line, offset] = this.scroll.line(index + length);\n let suffixLength = 0;\n let suffix = new Delta();\n if (line != null) {\n suffixLength = line.length() - offset;\n suffix = line\n .delta()\n .slice(offset, offset + suffixLength - 1)\n .insert('\\n');\n }\n const contents = this.getContents(index, length + suffixLength);\n const diff = contents.diff(new Delta().insert(text).concat(suffix));\n const delta = new Delta().retain(index).concat(diff);\n return this.applyDelta(delta);\n }\n\n update(\n change: Delta | null,\n mutations: MutationRecord[] = [],\n selectionInfo: SelectionInfo | undefined = undefined,\n ): Delta {\n const oldDelta = this.delta;\n if (\n mutations.length === 1 &&\n mutations[0].type === 'characterData' &&\n // @ts-expect-error Fix me later\n mutations[0].target.data.match(ASCII) &&\n this.scroll.find(mutations[0].target)\n ) {\n // Optimization for character changes\n const textBlot = this.scroll.find(mutations[0].target) as Blot;\n const formats = bubbleFormats(textBlot);\n const index = textBlot.offset(this.scroll);\n // @ts-expect-error Fix me later\n const oldValue = mutations[0].oldValue.replace(CursorBlot.CONTENTS, '');\n const oldText = new Delta().insert(oldValue);\n // @ts-expect-error\n const newText = new Delta().insert(textBlot.value());\n const relativeSelectionInfo = selectionInfo && {\n oldRange: shiftRange(selectionInfo.oldRange, -index),\n newRange: shiftRange(selectionInfo.newRange, -index),\n };\n const diffDelta = new Delta()\n .retain(index)\n .concat(oldText.diff(newText, relativeSelectionInfo));\n change = diffDelta.reduce((delta, op) => {\n if (op.insert) {\n return delta.insert(op.insert, formats);\n }\n return delta.push(op);\n }, new Delta());\n this.delta = oldDelta.compose(change);\n } else {\n this.delta = this.getDelta();\n if (!change || !isEqual(oldDelta.compose(change), this.delta)) {\n change = oldDelta.diff(this.delta, selectionInfo);\n }\n }\n return change;\n }\n}\n\ninterface ListItem {\n child: Blot;\n offset: number;\n length: number;\n indent: number;\n type: string;\n}\nfunction convertListHTML(\n items: ListItem[],\n lastIndent: number,\n types: string[],\n): string {\n if (items.length === 0) {\n const [endTag] = getListType(types.pop());\n if (lastIndent <= 0) {\n return ``;\n }\n return `${convertListHTML([], lastIndent - 1, types)}`;\n }\n const [{ child, offset, length, indent, type }, ...rest] = items;\n const [tag, attribute] = getListType(type);\n if (indent > lastIndent) {\n types.push(type);\n if (indent === lastIndent + 1) {\n return `<${tag}>${convertHTML(\n child,\n offset,\n length,\n )}${convertListHTML(rest, indent, types)}`;\n }\n return `<${tag}>
  • ${convertListHTML(items, lastIndent + 1, types)}`;\n }\n const previousType = types[types.length - 1];\n if (indent === lastIndent && type === previousType) {\n return `
  • ${convertHTML(\n child,\n offset,\n length,\n )}${convertListHTML(rest, indent, types)}`;\n }\n const [endTag] = getListType(types.pop());\n return `${convertListHTML(items, lastIndent - 1, types)}`;\n}\n\nfunction convertHTML(\n blot: Blot,\n index: number,\n length: number,\n isRoot = false,\n): string {\n if ('html' in blot && typeof blot.html === 'function') {\n return blot.html(index, length);\n }\n if (blot instanceof TextBlot) {\n const escapedText = escapeText(blot.value().slice(index, index + length));\n return escapedText.replaceAll(' ', ' ');\n }\n if (blot instanceof ParentBlot) {\n // TODO fix API\n if (blot.statics.blotName === 'list-container') {\n const items: any[] = [];\n blot.children.forEachAt(index, length, (child, offset, childLength) => {\n const formats =\n 'formats' in child && typeof child.formats === 'function'\n ? child.formats()\n : {};\n items.push({\n child,\n offset,\n length: childLength,\n indent: formats.indent || 0,\n type: formats.list,\n });\n });\n return convertListHTML(items, -1, []);\n }\n const parts: string[] = [];\n blot.children.forEachAt(index, length, (child, offset, childLength) => {\n parts.push(convertHTML(child, offset, childLength));\n });\n if (isRoot || blot.statics.blotName === 'list') {\n return parts.join('');\n }\n const { outerHTML, innerHTML } = blot.domNode as Element;\n const [start, end] = outerHTML.split(`>${innerHTML}<`);\n // TODO cleanup\n if (start === '${parts.join('')}<${end}`;\n }\n return `${start}>${parts.join('')}<${end}`;\n }\n return blot.domNode instanceof Element ? blot.domNode.outerHTML : '';\n}\n\nfunction combineFormats(\n formats: Record,\n combined: Record,\n): Record {\n return Object.keys(combined).reduce(\n (merged, name) => {\n if (formats[name] == null) return merged;\n const combinedValue = combined[name];\n if (combinedValue === formats[name]) {\n merged[name] = combinedValue;\n } else if (Array.isArray(combinedValue)) {\n if (combinedValue.indexOf(formats[name]) < 0) {\n merged[name] = combinedValue.concat([formats[name]]);\n } else {\n // If style already exists, don't add to an array, but don't lose other styles\n merged[name] = combinedValue;\n }\n } else {\n merged[name] = [combinedValue, formats[name]];\n }\n return merged;\n },\n {} as Record,\n );\n}\n\nfunction getListType(type: string | undefined) {\n const tag = type === 'ordered' ? 'ol' : 'ul';\n switch (type) {\n case 'checked':\n return [tag, ' data-list=\"checked\"'];\n case 'unchecked':\n return [tag, ' data-list=\"unchecked\"'];\n default:\n return [tag, ''];\n }\n}\n\nfunction normalizeDelta(delta: Delta) {\n return delta.reduce((normalizedDelta, op) => {\n if (typeof op.insert === 'string') {\n const text = op.insert.replace(/\\r\\n/g, '\\n').replace(/\\r/g, '\\n');\n return normalizedDelta.insert(text, op.attributes);\n }\n return normalizedDelta.push(op);\n }, new Delta());\n}\n\nfunction shiftRange({ index, length }: Range, amount: number) {\n return new Range(index + amount, length);\n}\n\nfunction splitOpLines(ops: Op[]) {\n const split: Op[] = [];\n ops.forEach((op) => {\n if (typeof op.insert === 'string') {\n const lines = op.insert.split('\\n');\n lines.forEach((line, index) => {\n if (index) split.push({ insert: '\\n', attributes: op.attributes });\n if (line) split.push({ insert: line, attributes: op.attributes });\n });\n } else {\n split.push(op);\n }\n });\n\n return split;\n}\n\nexport default Editor;\n","import Embed from '../blots/embed.js';\nimport type Scroll from '../blots/scroll.js';\nimport Emitter from './emitter.js';\n\nclass Composition {\n isComposing = false;\n\n constructor(\n private scroll: Scroll,\n private emitter: Emitter,\n ) {\n this.setupListeners();\n }\n\n private setupListeners() {\n this.scroll.domNode.addEventListener('compositionstart', (event) => {\n if (!this.isComposing) {\n this.handleCompositionStart(event);\n }\n });\n\n this.scroll.domNode.addEventListener('compositionend', (event) => {\n if (this.isComposing) {\n // Webkit makes DOM changes after compositionend, so we use microtask to\n // ensure the order.\n // https://bugs.webkit.org/show_bug.cgi?id=31902\n queueMicrotask(() => {\n this.handleCompositionEnd(event);\n });\n }\n });\n }\n\n private handleCompositionStart(event: CompositionEvent) {\n const blot =\n event.target instanceof Node\n ? this.scroll.find(event.target, true)\n : null;\n\n if (blot && !(blot instanceof Embed)) {\n this.emitter.emit(Emitter.events.COMPOSITION_BEFORE_START, event);\n this.scroll.batchStart();\n this.emitter.emit(Emitter.events.COMPOSITION_START, event);\n this.isComposing = true;\n }\n }\n\n private handleCompositionEnd(event: CompositionEvent) {\n this.emitter.emit(Emitter.events.COMPOSITION_BEFORE_END, event);\n this.scroll.batchEnd();\n this.emitter.emit(Emitter.events.COMPOSITION_END, event);\n this.isComposing = false;\n }\n}\n\nexport default Composition;\n","export type Rect = {\n top: number;\n right: number;\n bottom: number;\n left: number;\n};\n\nconst getParentElement = (element: Node): Element | null =>\n element.parentElement || (element.getRootNode() as ShadowRoot).host || null;\n\nconst getElementRect = (element: Element): Rect => {\n const rect = element.getBoundingClientRect();\n const scaleX =\n ('offsetWidth' in element &&\n Math.abs(rect.width) / (element as HTMLElement).offsetWidth) ||\n 1;\n const scaleY =\n ('offsetHeight' in element &&\n Math.abs(rect.height) / (element as HTMLElement).offsetHeight) ||\n 1;\n return {\n top: rect.top,\n right: rect.left + element.clientWidth * scaleX,\n bottom: rect.top + element.clientHeight * scaleY,\n left: rect.left,\n };\n};\n\nconst paddingValueToInt = (value: string) => {\n const number = parseInt(value, 10);\n return Number.isNaN(number) ? 0 : number;\n};\n\n// Follow the steps described in https://www.w3.org/TR/cssom-view-1/#element-scrolling-members,\n// assuming that the scroll option is set to 'nearest'.\nconst getScrollDistance = (\n targetStart: number,\n targetEnd: number,\n scrollStart: number,\n scrollEnd: number,\n scrollPaddingStart: number,\n scrollPaddingEnd: number,\n) => {\n if (targetStart < scrollStart && targetEnd > scrollEnd) {\n return 0;\n }\n\n if (targetStart < scrollStart) {\n return -(scrollStart - targetStart + scrollPaddingStart);\n }\n\n if (targetEnd > scrollEnd) {\n return targetEnd - targetStart > scrollEnd - scrollStart\n ? targetStart + scrollPaddingStart - scrollStart\n : targetEnd - scrollEnd + scrollPaddingEnd;\n }\n return 0;\n};\n\nconst scrollRectIntoView = (root: HTMLElement, targetRect: Rect) => {\n const document = root.ownerDocument;\n\n let rect = targetRect;\n\n let current: Element | null = root;\n while (current) {\n const isDocumentBody: boolean = current === document.body;\n const bounding = isDocumentBody\n ? {\n top: 0,\n right:\n window.visualViewport?.width ??\n document.documentElement.clientWidth,\n bottom:\n window.visualViewport?.height ??\n document.documentElement.clientHeight,\n left: 0,\n }\n : getElementRect(current);\n\n const style = getComputedStyle(current);\n const scrollDistanceX = getScrollDistance(\n rect.left,\n rect.right,\n bounding.left,\n bounding.right,\n paddingValueToInt(style.scrollPaddingLeft),\n paddingValueToInt(style.scrollPaddingRight),\n );\n const scrollDistanceY = getScrollDistance(\n rect.top,\n rect.bottom,\n bounding.top,\n bounding.bottom,\n paddingValueToInt(style.scrollPaddingTop),\n paddingValueToInt(style.scrollPaddingBottom),\n );\n if (scrollDistanceX || scrollDistanceY) {\n if (isDocumentBody) {\n document.defaultView?.scrollBy(scrollDistanceX, scrollDistanceY);\n } else {\n const { scrollLeft, scrollTop } = current;\n if (scrollDistanceY) {\n current.scrollTop += scrollDistanceY;\n }\n if (scrollDistanceX) {\n current.scrollLeft += scrollDistanceX;\n }\n const scrolledLeft = current.scrollLeft - scrollLeft;\n const scrolledTop = current.scrollTop - scrollTop;\n rect = {\n left: rect.left - scrolledLeft,\n top: rect.top - scrolledTop,\n right: rect.right - scrolledLeft,\n bottom: rect.bottom - scrolledTop,\n };\n }\n }\n\n current =\n isDocumentBody || style.position === 'fixed'\n ? null\n : getParentElement(current);\n }\n};\n\nexport default scrollRectIntoView;\n","import { Registry } from 'parchment';\n\nconst MAX_REGISTER_ITERATIONS = 100;\nconst CORE_FORMATS = ['block', 'break', 'cursor', 'inline', 'scroll', 'text'];\n\nconst createRegistryWithFormats = (\n formats: string[],\n sourceRegistry: Registry,\n debug: { error: (errorMessage: string) => void },\n) => {\n const registry = new Registry();\n CORE_FORMATS.forEach((name) => {\n const coreBlot = sourceRegistry.query(name);\n if (coreBlot) registry.register(coreBlot);\n });\n\n formats.forEach((name) => {\n let format = sourceRegistry.query(name);\n if (!format) {\n debug.error(\n `Cannot register \"${name}\" specified in \"formats\" config. Are you sure it was registered?`,\n );\n }\n let iterations = 0;\n while (format) {\n registry.register(format);\n format = 'blotName' in format ? format.requiredContainer ?? null : null;\n\n iterations += 1;\n if (iterations > MAX_REGISTER_ITERATIONS) {\n debug.error(\n `Cycle detected in registering blot requiredContainer: \"${name}\"`,\n );\n break;\n }\n }\n });\n\n return registry;\n};\n\nexport default createRegistryWithFormats;\n","import { merge } from 'lodash-es';\nimport * as Parchment from 'parchment';\nimport type { Op } from 'quill-delta';\nimport Delta from 'quill-delta';\nimport type { BlockEmbed } from '../blots/block.js';\nimport type Block from '../blots/block.js';\nimport type Scroll from '../blots/scroll.js';\nimport type Clipboard from '../modules/clipboard.js';\nimport type History from '../modules/history.js';\nimport type Keyboard from '../modules/keyboard.js';\nimport type Uploader from '../modules/uploader.js';\nimport Editor from './editor.js';\nimport Emitter from './emitter.js';\nimport type { EmitterSource } from './emitter.js';\nimport instances from './instances.js';\nimport logger from './logger.js';\nimport type { DebugLevel } from './logger.js';\nimport Module from './module.js';\nimport Selection, { Range } from './selection.js';\nimport type { Bounds } from './selection.js';\nimport Composition from './composition.js';\nimport Theme from './theme.js';\nimport type { ThemeConstructor } from './theme.js';\nimport scrollRectIntoView from './utils/scrollRectIntoView.js';\nimport type { Rect } from './utils/scrollRectIntoView.js';\nimport createRegistryWithFormats from './utils/createRegistryWithFormats.js';\n\nconst debug = logger('quill');\n\nconst globalRegistry = new Parchment.Registry();\nParchment.ParentBlot.uiClass = 'ql-ui';\n\n/**\n * Options for initializing a Quill instance\n */\nexport interface QuillOptions {\n theme?: string;\n debug?: DebugLevel | boolean;\n registry?: Parchment.Registry;\n /**\n * Whether to disable the editing\n * @default false\n */\n readOnly?: boolean;\n\n /**\n * Placeholder text to display when the editor is empty\n * @default \"\"\n */\n placeholder?: string;\n bounds?: HTMLElement | string | null;\n modules?: Record;\n\n /**\n * A list of formats that are recognized and can exist within the editor contents.\n * `null` means all formats are allowed.\n * @default null\n */\n formats?: string[] | null;\n}\n\n/**\n * Similar to QuillOptions, but with all properties expanded to their default values,\n * and all selectors resolved to HTMLElements.\n */\nexport interface ExpandedQuillOptions\n extends Omit {\n theme: ThemeConstructor;\n registry: Parchment.Registry;\n container: HTMLElement;\n modules: Record;\n bounds?: HTMLElement | null;\n readOnly: boolean;\n}\n\nclass Quill {\n static DEFAULTS = {\n bounds: null,\n modules: {\n clipboard: true,\n keyboard: true,\n history: true,\n uploader: true,\n },\n placeholder: '',\n readOnly: false,\n registry: globalRegistry,\n theme: 'default',\n } satisfies Partial;\n static events = Emitter.events;\n static sources = Emitter.sources;\n static version = typeof QUILL_VERSION === 'undefined' ? 'dev' : QUILL_VERSION;\n\n static imports: Record = {\n delta: Delta,\n parchment: Parchment,\n 'core/module': Module,\n 'core/theme': Theme,\n };\n\n static debug(limit: DebugLevel | boolean) {\n if (limit === true) {\n limit = 'log';\n }\n logger.level(limit);\n }\n\n static find(node: Node, bubble = false) {\n return instances.get(node) || globalRegistry.find(node, bubble);\n }\n\n static import(name: 'core/module'): typeof Module;\n static import(name: `themes/${string}`): typeof Theme;\n static import(name: 'parchment'): typeof Parchment;\n static import(name: 'delta'): typeof Delta;\n static import(name: string): unknown;\n static import(name: string) {\n if (this.imports[name] == null) {\n debug.error(`Cannot import ${name}. Are you sure it was registered?`);\n }\n return this.imports[name];\n }\n\n static register(\n targets: Record<\n string,\n | Parchment.RegistryDefinition\n | Record // any objects\n | Theme\n | Module\n | Function // ES5 constructors\n >,\n overwrite?: boolean,\n ): void;\n static register(\n target: Parchment.RegistryDefinition,\n overwrite?: boolean,\n ): void;\n static register(path: string, target: any, overwrite?: boolean): void;\n static register(...args: any[]): void {\n if (typeof args[0] !== 'string') {\n const target = args[0];\n const overwrite = !!args[1];\n\n const name = 'attrName' in target ? target.attrName : target.blotName;\n if (typeof name === 'string') {\n // Shortcut for formats:\n // register(Blot | Attributor, overwrite)\n this.register(`formats/${name}`, target, overwrite);\n } else {\n Object.keys(target).forEach((key) => {\n this.register(key, target[key], overwrite);\n });\n }\n } else {\n const path = args[0];\n const target = args[1];\n const overwrite = !!args[2];\n\n if (this.imports[path] != null && !overwrite) {\n debug.warn(`Overwriting ${path} with`, target);\n }\n this.imports[path] = target;\n if (\n (path.startsWith('blots/') || path.startsWith('formats/')) &&\n target &&\n typeof target !== 'boolean' &&\n target.blotName !== 'abstract'\n ) {\n globalRegistry.register(target);\n }\n if (typeof target.register === 'function') {\n target.register(globalRegistry);\n }\n }\n }\n\n container: HTMLElement;\n root: HTMLDivElement;\n scroll: Scroll;\n emitter: Emitter;\n protected allowReadOnlyEdits: boolean;\n editor: Editor;\n composition: Composition;\n selection: Selection;\n\n theme: Theme;\n keyboard: Keyboard;\n clipboard: Clipboard;\n history: History;\n uploader: Uploader;\n\n options: ExpandedQuillOptions;\n\n constructor(container: HTMLElement | string, options: QuillOptions = {}) {\n this.options = expandConfig(container, options);\n this.container = this.options.container;\n if (this.container == null) {\n debug.error('Invalid Quill container', container);\n return;\n }\n if (this.options.debug) {\n Quill.debug(this.options.debug);\n }\n const html = this.container.innerHTML.trim();\n this.container.classList.add('ql-container');\n this.container.innerHTML = '';\n instances.set(this.container, this);\n this.root = this.addContainer('ql-editor');\n this.root.classList.add('ql-blank');\n this.emitter = new Emitter();\n const scrollBlotName = Parchment.ScrollBlot.blotName;\n const ScrollBlot = this.options.registry.query(scrollBlotName);\n if (!ScrollBlot || !('blotName' in ScrollBlot)) {\n throw new Error(\n `Cannot initialize Quill without \"${scrollBlotName}\" blot`,\n );\n }\n this.scroll = new ScrollBlot(this.options.registry, this.root, {\n emitter: this.emitter,\n }) as Scroll;\n this.editor = new Editor(this.scroll);\n this.selection = new Selection(this.scroll, this.emitter);\n this.composition = new Composition(this.scroll, this.emitter);\n this.theme = new this.options.theme(this, this.options); // eslint-disable-line new-cap\n this.keyboard = this.theme.addModule('keyboard');\n this.clipboard = this.theme.addModule('clipboard');\n this.history = this.theme.addModule('history');\n this.uploader = this.theme.addModule('uploader');\n this.theme.addModule('input');\n this.theme.addModule('uiNode');\n this.theme.init();\n this.emitter.on(Emitter.events.EDITOR_CHANGE, (type) => {\n if (type === Emitter.events.TEXT_CHANGE) {\n this.root.classList.toggle('ql-blank', this.editor.isBlank());\n }\n });\n this.emitter.on(Emitter.events.SCROLL_UPDATE, (source, mutations) => {\n const oldRange = this.selection.lastRange;\n const [newRange] = this.selection.getRange();\n const selectionInfo =\n oldRange && newRange ? { oldRange, newRange } : undefined;\n modify.call(\n this,\n () => this.editor.update(null, mutations, selectionInfo),\n source,\n );\n });\n this.emitter.on(Emitter.events.SCROLL_EMBED_UPDATE, (blot, delta) => {\n const oldRange = this.selection.lastRange;\n const [newRange] = this.selection.getRange();\n const selectionInfo =\n oldRange && newRange ? { oldRange, newRange } : undefined;\n modify.call(\n this,\n () => {\n const change = new Delta()\n .retain(blot.offset(this))\n .retain({ [blot.statics.blotName]: delta });\n return this.editor.update(change, [], selectionInfo);\n },\n Quill.sources.USER,\n );\n });\n if (html) {\n const contents = this.clipboard.convert({\n html: `${html}


    `,\n text: '\\n',\n });\n this.setContents(contents);\n }\n this.history.clear();\n if (this.options.placeholder) {\n this.root.setAttribute('data-placeholder', this.options.placeholder);\n }\n if (this.options.readOnly) {\n this.disable();\n }\n this.allowReadOnlyEdits = false;\n }\n\n addContainer(container: string, refNode?: Node | null): HTMLDivElement;\n addContainer(container: HTMLElement, refNode?: Node | null): HTMLElement;\n addContainer(\n container: string | HTMLElement,\n refNode: Node | null = null,\n ): HTMLDivElement | HTMLElement {\n if (typeof container === 'string') {\n const className = container;\n container = document.createElement('div');\n container.classList.add(className);\n }\n this.container.insertBefore(container, refNode);\n return container;\n }\n\n blur() {\n this.selection.setRange(null);\n }\n\n deleteText(range: Range, source?: EmitterSource): Delta;\n deleteText(index: number, length: number, source?: EmitterSource): Delta;\n deleteText(\n index: number | Range,\n length?: number | EmitterSource,\n source?: EmitterSource,\n ): Delta {\n // @ts-expect-error\n [index, length, , source] = overload(index, length, source);\n return modify.call(\n this,\n () => {\n return this.editor.deleteText(index, length);\n },\n source,\n index,\n -1 * length,\n );\n }\n\n disable() {\n this.enable(false);\n }\n\n editReadOnly(modifier: () => T): T {\n this.allowReadOnlyEdits = true;\n const value = modifier();\n this.allowReadOnlyEdits = false;\n return value;\n }\n\n enable(enabled = true) {\n this.scroll.enable(enabled);\n this.container.classList.toggle('ql-disabled', !enabled);\n }\n\n focus(options: { preventScroll?: boolean } = {}) {\n this.selection.focus();\n if (!options.preventScroll) {\n this.scrollSelectionIntoView();\n }\n }\n\n format(\n name: string,\n value: unknown,\n source: EmitterSource = Emitter.sources.API,\n ): Delta {\n return modify.call(\n this,\n () => {\n const range = this.getSelection(true);\n let change = new Delta();\n if (range == null) return change;\n if (this.scroll.query(name, Parchment.Scope.BLOCK)) {\n change = this.editor.formatLine(range.index, range.length, {\n [name]: value,\n });\n } else if (range.length === 0) {\n this.selection.format(name, value);\n return change;\n } else {\n change = this.editor.formatText(range.index, range.length, {\n [name]: value,\n });\n }\n this.setSelection(range, Emitter.sources.SILENT);\n return change;\n },\n source,\n );\n }\n\n formatLine(\n index: number,\n length: number,\n formats: Record,\n source?: EmitterSource,\n ): Delta;\n formatLine(\n index: number,\n length: number,\n name: string,\n value?: unknown,\n source?: EmitterSource,\n ): Delta;\n formatLine(\n index: number,\n length: number,\n name: string | Record,\n value?: unknown | EmitterSource,\n source?: EmitterSource,\n ): Delta {\n let formats: Record;\n // eslint-disable-next-line prefer-const\n [index, length, formats, source] = overload(\n index,\n length,\n // @ts-expect-error\n name,\n value,\n source,\n );\n return modify.call(\n this,\n () => {\n return this.editor.formatLine(index, length, formats);\n },\n source,\n index,\n 0,\n );\n }\n\n formatText(\n range: Range,\n name: string,\n value: unknown,\n source?: EmitterSource,\n ): Delta;\n formatText(\n index: number,\n length: number,\n name: string,\n value: unknown,\n source?: EmitterSource,\n ): Delta;\n formatText(\n index: number,\n length: number,\n formats: Record,\n source?: EmitterSource,\n ): Delta;\n formatText(\n index: number | Range,\n length: number | string,\n name: string | unknown,\n value?: unknown | EmitterSource,\n source?: EmitterSource,\n ): Delta {\n let formats: Record;\n // eslint-disable-next-line prefer-const\n [index, length, formats, source] = overload(\n // @ts-expect-error\n index,\n length,\n name,\n value,\n source,\n );\n return modify.call(\n this,\n () => {\n return this.editor.formatText(index, length, formats);\n },\n source,\n index,\n 0,\n );\n }\n\n getBounds(index: number | Range, length = 0): Bounds | null {\n let bounds: Bounds | null = null;\n if (typeof index === 'number') {\n bounds = this.selection.getBounds(index, length);\n } else {\n bounds = this.selection.getBounds(index.index, index.length);\n }\n if (!bounds) return null;\n const containerBounds = this.container.getBoundingClientRect();\n return {\n bottom: bounds.bottom - containerBounds.top,\n height: bounds.height,\n left: bounds.left - containerBounds.left,\n right: bounds.right - containerBounds.left,\n top: bounds.top - containerBounds.top,\n width: bounds.width,\n };\n }\n\n getContents(index = 0, length = this.getLength() - index) {\n [index, length] = overload(index, length);\n return this.editor.getContents(index, length);\n }\n\n getFormat(index?: number, length?: number): { [format: string]: unknown };\n getFormat(range?: Range): {\n [format: string]: unknown;\n };\n getFormat(\n index: Range | number = this.getSelection(true),\n length = 0,\n ): { [format: string]: unknown } {\n if (typeof index === 'number') {\n return this.editor.getFormat(index, length);\n }\n return this.editor.getFormat(index.index, index.length);\n }\n\n getIndex(blot: Parchment.Blot) {\n return blot.offset(this.scroll);\n }\n\n getLength() {\n return this.scroll.length();\n }\n\n getLeaf(index: number) {\n return this.scroll.leaf(index);\n }\n\n getLine(index: number) {\n return this.scroll.line(index);\n }\n\n getLines(range: Range): (Block | BlockEmbed)[];\n getLines(index?: number, length?: number): (Block | BlockEmbed)[];\n getLines(\n index: Range | number = 0,\n length = Number.MAX_VALUE,\n ): (Block | BlockEmbed)[] {\n if (typeof index !== 'number') {\n return this.scroll.lines(index.index, index.length);\n }\n return this.scroll.lines(index, length);\n }\n\n getModule(name: string) {\n return this.theme.modules[name];\n }\n\n getSelection(focus: true): Range;\n getSelection(focus?: boolean): Range | null;\n getSelection(focus = false): Range | null {\n if (focus) this.focus();\n this.update(); // Make sure we access getRange with editor in consistent state\n return this.selection.getRange()[0];\n }\n\n getSemanticHTML(range: Range): string;\n getSemanticHTML(index?: number, length?: number): string;\n getSemanticHTML(index: Range | number = 0, length?: number) {\n if (typeof index === 'number') {\n length = length ?? this.getLength() - index;\n }\n // @ts-expect-error\n [index, length] = overload(index, length);\n return this.editor.getHTML(index, length);\n }\n\n getText(range?: Range): string;\n getText(index?: number, length?: number): string;\n getText(index: Range | number = 0, length?: number): string {\n if (typeof index === 'number') {\n length = length ?? this.getLength() - index;\n }\n // @ts-expect-error\n [index, length] = overload(index, length);\n return this.editor.getText(index, length);\n }\n\n hasFocus() {\n return this.selection.hasFocus();\n }\n\n insertEmbed(\n index: number,\n embed: string,\n value: unknown,\n source: EmitterSource = Quill.sources.API,\n ): Delta {\n return modify.call(\n this,\n () => {\n return this.editor.insertEmbed(index, embed, value);\n },\n source,\n index,\n );\n }\n\n insertText(index: number, text: string, source?: EmitterSource): Delta;\n insertText(\n index: number,\n text: string,\n formats: Record,\n source?: EmitterSource,\n ): Delta;\n insertText(\n index: number,\n text: string,\n name: string,\n value: unknown,\n source?: EmitterSource,\n ): Delta;\n insertText(\n index: number,\n text: string,\n name?: string | Record | EmitterSource,\n value?: unknown,\n source?: EmitterSource,\n ): Delta {\n let formats: Record;\n // eslint-disable-next-line prefer-const\n // @ts-expect-error\n [index, , formats, source] = overload(index, 0, name, value, source);\n return modify.call(\n this,\n () => {\n return this.editor.insertText(index, text, formats);\n },\n source,\n index,\n text.length,\n );\n }\n\n isEnabled() {\n return this.scroll.isEnabled();\n }\n\n off(...args: Parameters<(typeof Emitter)['prototype']['off']>) {\n return this.emitter.off(...args);\n }\n\n on(\n event: (typeof Emitter)['events']['TEXT_CHANGE'],\n handler: (delta: Delta, oldContent: Delta, source: EmitterSource) => void,\n ): Emitter;\n on(\n event: (typeof Emitter)['events']['SELECTION_CHANGE'],\n handler: (range: Range, oldRange: Range, source: EmitterSource) => void,\n ): Emitter;\n on(\n event: (typeof Emitter)['events']['EDITOR_CHANGE'],\n handler: (\n ...args:\n | [\n (typeof Emitter)['events']['TEXT_CHANGE'],\n Delta,\n Delta,\n EmitterSource,\n ]\n | [\n (typeof Emitter)['events']['SELECTION_CHANGE'],\n Range,\n Range,\n EmitterSource,\n ]\n ) => void,\n ): Emitter;\n on(event: string, ...args: unknown[]): Emitter;\n on(...args: Parameters<(typeof Emitter)['prototype']['on']>): Emitter {\n return this.emitter.on(...args);\n }\n\n once(...args: Parameters<(typeof Emitter)['prototype']['once']>) {\n return this.emitter.once(...args);\n }\n\n removeFormat(index: number, length: number, source?: EmitterSource): Delta {\n [index, length, , source] = overload(index, length, source);\n return modify.call(\n this,\n () => {\n return this.editor.removeFormat(index, length);\n },\n source,\n index,\n );\n }\n\n scrollRectIntoView(rect: Rect) {\n scrollRectIntoView(this.root, rect);\n }\n\n /**\n * @deprecated Use Quill#scrollSelectionIntoView() instead.\n */\n scrollIntoView() {\n console.warn(\n 'Quill#scrollIntoView() has been deprecated and will be removed in the near future. Please use Quill#scrollSelectionIntoView() instead.',\n );\n this.scrollSelectionIntoView();\n }\n\n /**\n * Scroll the current selection into the visible area.\n * If the selection is already visible, no scrolling will occur.\n */\n scrollSelectionIntoView() {\n const range = this.selection.lastRange;\n const bounds = range && this.selection.getBounds(range.index, range.length);\n if (bounds) {\n this.scrollRectIntoView(bounds);\n }\n }\n\n setContents(\n delta: Delta | Op[],\n source: EmitterSource = Emitter.sources.API,\n ): Delta {\n return modify.call(\n this,\n () => {\n delta = new Delta(delta);\n const length = this.getLength();\n // Quill will set empty editor to \\n\n const delete1 = this.editor.deleteText(0, length);\n const applied = this.editor.insertContents(0, delta);\n // Remove extra \\n from empty editor initialization\n const delete2 = this.editor.deleteText(this.getLength() - 1, 1);\n return delete1.compose(applied).compose(delete2);\n },\n source,\n );\n }\n setSelection(range: Range | null, source?: EmitterSource): void;\n setSelection(index: number, source?: EmitterSource): void;\n setSelection(index: number, length?: number, source?: EmitterSource): void;\n setSelection(index: number, source?: EmitterSource): void;\n setSelection(\n index: Range | null | number,\n length?: EmitterSource | number,\n source?: EmitterSource,\n ): void {\n if (index == null) {\n // @ts-expect-error https://github.com/microsoft/TypeScript/issues/22609\n this.selection.setRange(null, length || Quill.sources.API);\n } else {\n // @ts-expect-error\n [index, length, , source] = overload(index, length, source);\n this.selection.setRange(new Range(Math.max(0, index), length), source);\n if (source !== Emitter.sources.SILENT) {\n this.scrollSelectionIntoView();\n }\n }\n }\n\n setText(text: string, source: EmitterSource = Emitter.sources.API) {\n const delta = new Delta().insert(text);\n return this.setContents(delta, source);\n }\n\n update(source: EmitterSource = Emitter.sources.USER) {\n const change = this.scroll.update(source); // Will update selection before selection.update() does if text changes\n this.selection.update(source);\n // TODO this is usually undefined\n return change;\n }\n\n updateContents(\n delta: Delta | Op[],\n source: EmitterSource = Emitter.sources.API,\n ): Delta {\n return modify.call(\n this,\n () => {\n delta = new Delta(delta);\n return this.editor.applyDelta(delta);\n },\n source,\n true,\n );\n }\n}\n\nfunction resolveSelector(selector: string | HTMLElement | null | undefined) {\n return typeof selector === 'string'\n ? document.querySelector(selector)\n : selector;\n}\n\nfunction expandModuleConfig(config: Record | undefined) {\n return Object.entries(config ?? {}).reduce(\n (expanded, [key, value]) => ({\n ...expanded,\n [key]: value === true ? {} : value,\n }),\n {} as Record,\n );\n}\n\nfunction omitUndefinedValuesFromOptions(obj: QuillOptions) {\n return Object.fromEntries(\n Object.entries(obj).filter((entry) => entry[1] !== undefined),\n );\n}\n\nfunction expandConfig(\n containerOrSelector: HTMLElement | string,\n options: QuillOptions,\n): ExpandedQuillOptions {\n const container = resolveSelector(containerOrSelector);\n if (!container) {\n throw new Error('Invalid Quill container');\n }\n\n const shouldUseDefaultTheme =\n !options.theme || options.theme === Quill.DEFAULTS.theme;\n const theme = shouldUseDefaultTheme\n ? Theme\n : Quill.import(`themes/${options.theme}`);\n if (!theme) {\n throw new Error(`Invalid theme ${options.theme}. Did you register it?`);\n }\n\n const { modules: quillModuleDefaults, ...quillDefaults } = Quill.DEFAULTS;\n const { modules: themeModuleDefaults, ...themeDefaults } = theme.DEFAULTS;\n\n let userModuleOptions = expandModuleConfig(options.modules);\n // Special case toolbar shorthand\n if (\n userModuleOptions != null &&\n userModuleOptions.toolbar &&\n userModuleOptions.toolbar.constructor !== Object\n ) {\n userModuleOptions = {\n ...userModuleOptions,\n toolbar: { container: userModuleOptions.toolbar },\n };\n }\n\n const modules: ExpandedQuillOptions['modules'] = merge(\n {},\n expandModuleConfig(quillModuleDefaults),\n expandModuleConfig(themeModuleDefaults),\n userModuleOptions,\n );\n\n const config = {\n ...quillDefaults,\n ...omitUndefinedValuesFromOptions(themeDefaults),\n ...omitUndefinedValuesFromOptions(options),\n };\n\n let registry = options.registry;\n if (registry) {\n if (options.formats) {\n debug.warn('Ignoring \"formats\" option because \"registry\" is specified');\n }\n } else {\n registry = options.formats\n ? createRegistryWithFormats(options.formats, config.registry, debug)\n : config.registry;\n }\n\n return {\n ...config,\n registry,\n container,\n theme,\n modules: Object.entries(modules).reduce(\n (modulesWithDefaults, [name, value]) => {\n if (!value) return modulesWithDefaults;\n\n const moduleClass = Quill.import(`modules/${name}`);\n if (moduleClass == null) {\n debug.error(\n `Cannot load ${name} module. Are you sure you registered it?`,\n );\n return modulesWithDefaults;\n }\n return {\n ...modulesWithDefaults,\n // @ts-expect-error\n [name]: merge({}, moduleClass.DEFAULTS || {}, value),\n };\n },\n {},\n ),\n bounds: resolveSelector(config.bounds),\n };\n}\n\n// Handle selection preservation and TEXT_CHANGE emission\n// common to modification APIs\nfunction modify(\n modifier: () => Delta,\n source: EmitterSource,\n index: number | boolean,\n shift: number | null,\n) {\n if (\n !this.isEnabled() &&\n source === Emitter.sources.USER &&\n !this.allowReadOnlyEdits\n ) {\n return new Delta();\n }\n let range = index == null ? null : this.getSelection();\n const oldDelta = this.editor.delta;\n const change = modifier();\n if (range != null) {\n if (index === true) {\n index = range.index; // eslint-disable-line prefer-destructuring\n }\n if (shift == null) {\n range = shiftRange(range, change, source);\n } else if (shift !== 0) {\n // @ts-expect-error index should always be number\n range = shiftRange(range, index, shift, source);\n }\n this.setSelection(range, Emitter.sources.SILENT);\n }\n if (change.length() > 0) {\n const args = [Emitter.events.TEXT_CHANGE, change, oldDelta, source];\n this.emitter.emit(Emitter.events.EDITOR_CHANGE, ...args);\n if (source !== Emitter.sources.SILENT) {\n this.emitter.emit(...args);\n }\n }\n return change;\n}\n\ntype NormalizedIndexLength = [\n number,\n number,\n Record,\n EmitterSource,\n];\nfunction overload(index: number, source?: EmitterSource): NormalizedIndexLength;\nfunction overload(\n index: number,\n length: number,\n source?: EmitterSource,\n): NormalizedIndexLength;\nfunction overload(\n index: number,\n length: number,\n format: string,\n value: unknown,\n source?: EmitterSource,\n): NormalizedIndexLength;\nfunction overload(\n index: number,\n length: number,\n format: Record,\n source?: EmitterSource,\n): NormalizedIndexLength;\nfunction overload(range: Range, source?: EmitterSource): NormalizedIndexLength;\nfunction overload(\n range: Range,\n format: string,\n value: unknown,\n source?: EmitterSource,\n): NormalizedIndexLength;\nfunction overload(\n range: Range,\n format: Record,\n source?: EmitterSource,\n): NormalizedIndexLength;\nfunction overload(\n index: Range | number,\n length?: number | string | Record | EmitterSource,\n name?: string | unknown | Record | EmitterSource,\n value?: unknown | EmitterSource,\n source?: EmitterSource,\n): NormalizedIndexLength {\n let formats: Record = {};\n // @ts-expect-error\n if (typeof index.index === 'number' && typeof index.length === 'number') {\n // Allow for throwaway end (used by insertText/insertEmbed)\n if (typeof length !== 'number') {\n // @ts-expect-error\n source = value;\n value = name;\n name = length;\n // @ts-expect-error\n length = index.length; // eslint-disable-line prefer-destructuring\n // @ts-expect-error\n index = index.index; // eslint-disable-line prefer-destructuring\n } else {\n // @ts-expect-error\n length = index.length; // eslint-disable-line prefer-destructuring\n // @ts-expect-error\n index = index.index; // eslint-disable-line prefer-destructuring\n }\n } else if (typeof length !== 'number') {\n // @ts-expect-error\n source = value;\n value = name;\n name = length;\n length = 0;\n }\n // Handle format being object, two format name/value strings or excluded\n if (typeof name === 'object') {\n // @ts-expect-error Fix me later\n formats = name;\n // @ts-expect-error\n source = value;\n } else if (typeof name === 'string') {\n if (value != null) {\n formats[name] = value;\n } else {\n // @ts-expect-error\n source = name;\n }\n }\n // Handle optional source\n source = source || Emitter.sources.API;\n // @ts-expect-error\n return [index, length, formats, source];\n}\n\nfunction shiftRange(range: Range, change: Delta, source?: EmitterSource): Range;\nfunction shiftRange(\n range: Range,\n index: number,\n length?: number,\n source?: EmitterSource,\n): Range;\nfunction shiftRange(\n range: Range,\n index: number | Delta,\n lengthOrSource?: number | EmitterSource,\n source?: EmitterSource,\n) {\n const length = typeof lengthOrSource === 'number' ? lengthOrSource : 0;\n if (range == null) return null;\n let start;\n let end;\n // @ts-expect-error -- TODO: add a better type guard around `index`\n if (index && typeof index.transformPosition === 'function') {\n [start, end] = [range.index, range.index + range.length].map((pos) =>\n // @ts-expect-error -- TODO: add a better type guard around `index`\n index.transformPosition(pos, source !== Emitter.sources.USER),\n );\n } else {\n [start, end] = [range.index, range.index + range.length].map((pos) => {\n // @ts-expect-error -- TODO: add a better type guard around `index`\n if (pos < index || (pos === index && source === Emitter.sources.USER))\n return pos;\n if (length >= 0) {\n return pos + length;\n }\n // @ts-expect-error -- TODO: add a better type guard around `index`\n return Math.max(index, pos + length);\n });\n }\n return new Range(start, end - start);\n}\n\nexport type { Bounds, DebugLevel, EmitterSource };\nexport { Parchment, Range };\n\nexport { globalRegistry, expandConfig, overload, Quill as default };\n","import { LeafBlot, Scope } from 'parchment';\nimport { cloneDeep, isEqual } from 'lodash-es';\nimport Emitter from './emitter.js';\nimport type { EmitterSource } from './emitter.js';\nimport logger from './logger.js';\nimport type Cursor from '../blots/cursor.js';\nimport type Scroll from '../blots/scroll.js';\n\nconst debug = logger('quill:selection');\n\ntype NativeRange = AbstractRange;\n\ninterface NormalizedRange {\n start: {\n node: NativeRange['startContainer'];\n offset: NativeRange['startOffset'];\n };\n end: { node: NativeRange['endContainer']; offset: NativeRange['endOffset'] };\n native: NativeRange;\n}\n\nexport interface Bounds {\n bottom: number;\n height: number;\n left: number;\n right: number;\n top: number;\n width: number;\n}\n\nexport class Range {\n constructor(\n public index: number,\n public length = 0,\n ) {}\n}\n\nclass Selection {\n scroll: Scroll;\n emitter: Emitter;\n composing: boolean;\n mouseDown: boolean;\n\n root: HTMLElement;\n cursor: Cursor;\n savedRange: Range;\n lastRange: Range | null;\n lastNative: NormalizedRange | null;\n\n constructor(scroll: Scroll, emitter: Emitter) {\n this.emitter = emitter;\n this.scroll = scroll;\n this.composing = false;\n this.mouseDown = false;\n this.root = this.scroll.domNode;\n // @ts-expect-error\n this.cursor = this.scroll.create('cursor', this);\n // savedRange is last non-null range\n this.savedRange = new Range(0, 0);\n this.lastRange = this.savedRange;\n this.lastNative = null;\n this.handleComposition();\n this.handleDragging();\n this.emitter.listenDOM('selectionchange', document, () => {\n if (!this.mouseDown && !this.composing) {\n setTimeout(this.update.bind(this, Emitter.sources.USER), 1);\n }\n });\n this.emitter.on(Emitter.events.SCROLL_BEFORE_UPDATE, () => {\n if (!this.hasFocus()) return;\n const native = this.getNativeRange();\n if (native == null) return;\n if (native.start.node === this.cursor.textNode) return; // cursor.restore() will handle\n this.emitter.once(\n Emitter.events.SCROLL_UPDATE,\n (source, mutations: MutationRecord[]) => {\n try {\n if (\n this.root.contains(native.start.node) &&\n this.root.contains(native.end.node)\n ) {\n this.setNativeRange(\n native.start.node,\n native.start.offset,\n native.end.node,\n native.end.offset,\n );\n }\n const triggeredByTyping = mutations.some(\n (mutation) =>\n mutation.type === 'characterData' ||\n mutation.type === 'childList' ||\n (mutation.type === 'attributes' &&\n mutation.target === this.root),\n );\n this.update(triggeredByTyping ? Emitter.sources.SILENT : source);\n } catch (ignored) {\n // ignore\n }\n },\n );\n });\n this.emitter.on(Emitter.events.SCROLL_OPTIMIZE, (mutations, context) => {\n if (context.range) {\n const { startNode, startOffset, endNode, endOffset } = context.range;\n this.setNativeRange(startNode, startOffset, endNode, endOffset);\n this.update(Emitter.sources.SILENT);\n }\n });\n this.update(Emitter.sources.SILENT);\n }\n\n handleComposition() {\n this.emitter.on(Emitter.events.COMPOSITION_BEFORE_START, () => {\n this.composing = true;\n });\n this.emitter.on(Emitter.events.COMPOSITION_END, () => {\n this.composing = false;\n if (this.cursor.parent) {\n const range = this.cursor.restore();\n if (!range) return;\n setTimeout(() => {\n this.setNativeRange(\n range.startNode,\n range.startOffset,\n range.endNode,\n range.endOffset,\n );\n }, 1);\n }\n });\n }\n\n handleDragging() {\n this.emitter.listenDOM('mousedown', document.body, () => {\n this.mouseDown = true;\n });\n this.emitter.listenDOM('mouseup', document.body, () => {\n this.mouseDown = false;\n this.update(Emitter.sources.USER);\n });\n }\n\n focus() {\n if (this.hasFocus()) return;\n this.root.focus({ preventScroll: true });\n this.setRange(this.savedRange);\n }\n\n format(format: string, value: unknown) {\n this.scroll.update();\n const nativeRange = this.getNativeRange();\n if (\n nativeRange == null ||\n !nativeRange.native.collapsed ||\n this.scroll.query(format, Scope.BLOCK)\n )\n return;\n if (nativeRange.start.node !== this.cursor.textNode) {\n const blot = this.scroll.find(nativeRange.start.node, false);\n if (blot == null) return;\n // TODO Give blot ability to not split\n if (blot instanceof LeafBlot) {\n const after = blot.split(nativeRange.start.offset);\n blot.parent.insertBefore(this.cursor, after);\n } else {\n // @ts-expect-error TODO: nativeRange.start.node doesn't seem to match function signature\n blot.insertBefore(this.cursor, nativeRange.start.node); // Should never happen\n }\n this.cursor.attach();\n }\n this.cursor.format(format, value);\n this.scroll.optimize();\n this.setNativeRange(this.cursor.textNode, this.cursor.textNode.data.length);\n this.update();\n }\n\n getBounds(index: number, length = 0) {\n const scrollLength = this.scroll.length();\n index = Math.min(index, scrollLength - 1);\n length = Math.min(index + length, scrollLength - 1) - index;\n let node: Node;\n let [leaf, offset] = this.scroll.leaf(index);\n if (leaf == null) return null;\n if (length > 0 && offset === leaf.length()) {\n const [next] = this.scroll.leaf(index + 1);\n if (next) {\n const [line] = this.scroll.line(index);\n const [nextLine] = this.scroll.line(index + 1);\n if (line === nextLine) {\n leaf = next;\n offset = 0;\n }\n }\n }\n [node, offset] = leaf.position(offset, true);\n const range = document.createRange();\n if (length > 0) {\n range.setStart(node, offset);\n [leaf, offset] = this.scroll.leaf(index + length);\n if (leaf == null) return null;\n [node, offset] = leaf.position(offset, true);\n range.setEnd(node, offset);\n return range.getBoundingClientRect();\n }\n let side: 'left' | 'right' = 'left';\n let rect: DOMRect;\n if (node instanceof Text) {\n // Return null if the text node is empty because it is\n // not able to get a useful client rect:\n // https://github.com/w3c/csswg-drafts/issues/2514.\n // Empty text nodes are most likely caused by TextBlot#optimize()\n // not getting called when editor content changes.\n if (!node.data.length) {\n return null;\n }\n if (offset < node.data.length) {\n range.setStart(node, offset);\n range.setEnd(node, offset + 1);\n } else {\n range.setStart(node, offset - 1);\n range.setEnd(node, offset);\n side = 'right';\n }\n rect = range.getBoundingClientRect();\n } else {\n if (!(leaf.domNode instanceof Element)) return null;\n rect = leaf.domNode.getBoundingClientRect();\n if (offset > 0) side = 'right';\n }\n return {\n bottom: rect.top + rect.height,\n height: rect.height,\n left: rect[side],\n right: rect[side],\n top: rect.top,\n width: 0,\n };\n }\n\n getNativeRange(): NormalizedRange | null {\n const selection = document.getSelection();\n if (selection == null || selection.rangeCount <= 0) return null;\n const nativeRange = selection.getRangeAt(0);\n if (nativeRange == null) return null;\n const range = this.normalizeNative(nativeRange);\n debug.info('getNativeRange', range);\n return range;\n }\n\n getRange(): [Range, NormalizedRange] | [null, null] {\n const root = this.scroll.domNode;\n if ('isConnected' in root && !root.isConnected) {\n // document.getSelection() forces layout on Blink, so we trend to\n // not calling it.\n return [null, null];\n }\n const normalized = this.getNativeRange();\n if (normalized == null) return [null, null];\n const range = this.normalizedToRange(normalized);\n return [range, normalized];\n }\n\n hasFocus(): boolean {\n return (\n document.activeElement === this.root ||\n (document.activeElement != null &&\n contains(this.root, document.activeElement))\n );\n }\n\n normalizedToRange(range: NormalizedRange) {\n const positions: [Node, number][] = [\n [range.start.node, range.start.offset],\n ];\n if (!range.native.collapsed) {\n positions.push([range.end.node, range.end.offset]);\n }\n const indexes = positions.map((position) => {\n const [node, offset] = position;\n const blot = this.scroll.find(node, true);\n // @ts-expect-error Fix me later\n const index = blot.offset(this.scroll);\n if (offset === 0) {\n return index;\n }\n if (blot instanceof LeafBlot) {\n return index + blot.index(node, offset);\n }\n // @ts-expect-error Fix me later\n return index + blot.length();\n });\n const end = Math.min(Math.max(...indexes), this.scroll.length() - 1);\n const start = Math.min(end, ...indexes);\n return new Range(start, end - start);\n }\n\n normalizeNative(nativeRange: NativeRange) {\n if (\n !contains(this.root, nativeRange.startContainer) ||\n (!nativeRange.collapsed && !contains(this.root, nativeRange.endContainer))\n ) {\n return null;\n }\n const range = {\n start: {\n node: nativeRange.startContainer,\n offset: nativeRange.startOffset,\n },\n end: { node: nativeRange.endContainer, offset: nativeRange.endOffset },\n native: nativeRange,\n };\n [range.start, range.end].forEach((position) => {\n let { node, offset } = position;\n while (!(node instanceof Text) && node.childNodes.length > 0) {\n if (node.childNodes.length > offset) {\n node = node.childNodes[offset];\n offset = 0;\n } else if (node.childNodes.length === offset) {\n // @ts-expect-error Fix me later\n node = node.lastChild;\n if (node instanceof Text) {\n offset = node.data.length;\n } else if (node.childNodes.length > 0) {\n // Container case\n offset = node.childNodes.length;\n } else {\n // Embed case\n offset = node.childNodes.length + 1;\n }\n } else {\n break;\n }\n }\n position.node = node;\n position.offset = offset;\n });\n return range;\n }\n\n rangeToNative(range: Range): [Node | null, number, Node | null, number] {\n const scrollLength = this.scroll.length();\n\n const getPosition = (\n index: number,\n inclusive: boolean,\n ): [Node | null, number] => {\n index = Math.min(scrollLength - 1, index);\n const [leaf, leafOffset] = this.scroll.leaf(index);\n return leaf ? leaf.position(leafOffset, inclusive) : [null, -1];\n };\n return [\n ...getPosition(range.index, false),\n ...getPosition(range.index + range.length, true),\n ];\n }\n\n setNativeRange(\n startNode: Node | null,\n startOffset?: number,\n endNode = startNode,\n endOffset = startOffset,\n force = false,\n ) {\n debug.info('setNativeRange', startNode, startOffset, endNode, endOffset);\n if (\n startNode != null &&\n (this.root.parentNode == null ||\n startNode.parentNode == null ||\n // @ts-expect-error Fix me later\n endNode.parentNode == null)\n ) {\n return;\n }\n const selection = document.getSelection();\n if (selection == null) return;\n if (startNode != null) {\n if (!this.hasFocus()) this.root.focus({ preventScroll: true });\n const { native } = this.getNativeRange() || {};\n if (\n native == null ||\n force ||\n startNode !== native.startContainer ||\n startOffset !== native.startOffset ||\n endNode !== native.endContainer ||\n endOffset !== native.endOffset\n ) {\n if (startNode instanceof Element && startNode.tagName === 'BR') {\n // @ts-expect-error Fix me later\n startOffset = Array.from(startNode.parentNode.childNodes).indexOf(\n startNode,\n );\n startNode = startNode.parentNode;\n }\n if (endNode instanceof Element && endNode.tagName === 'BR') {\n // @ts-expect-error Fix me later\n endOffset = Array.from(endNode.parentNode.childNodes).indexOf(\n endNode,\n );\n endNode = endNode.parentNode;\n }\n const range = document.createRange();\n // @ts-expect-error Fix me later\n range.setStart(startNode, startOffset);\n // @ts-expect-error Fix me later\n range.setEnd(endNode, endOffset);\n selection.removeAllRanges();\n selection.addRange(range);\n }\n } else {\n selection.removeAllRanges();\n this.root.blur();\n }\n }\n\n setRange(range: Range | null, force: boolean, source?: EmitterSource): void;\n setRange(range: Range | null, source?: EmitterSource): void;\n setRange(\n range: Range | null,\n force: boolean | EmitterSource = false,\n source: EmitterSource = Emitter.sources.API,\n ): void {\n if (typeof force === 'string') {\n source = force;\n force = false;\n }\n debug.info('setRange', range);\n if (range != null) {\n const args = this.rangeToNative(range);\n this.setNativeRange(...args, force);\n } else {\n this.setNativeRange(null);\n }\n this.update(source);\n }\n\n update(source: EmitterSource = Emitter.sources.USER) {\n const oldRange = this.lastRange;\n const [lastRange, nativeRange] = this.getRange();\n this.lastRange = lastRange;\n this.lastNative = nativeRange;\n if (this.lastRange != null) {\n this.savedRange = this.lastRange;\n }\n if (!isEqual(oldRange, this.lastRange)) {\n if (\n !this.composing &&\n nativeRange != null &&\n nativeRange.native.collapsed &&\n nativeRange.start.node !== this.cursor.textNode\n ) {\n const range = this.cursor.restore();\n if (range) {\n this.setNativeRange(\n range.startNode,\n range.startOffset,\n range.endNode,\n range.endOffset,\n );\n }\n }\n const args = [\n Emitter.events.SELECTION_CHANGE,\n cloneDeep(this.lastRange),\n cloneDeep(oldRange),\n source,\n ];\n this.emitter.emit(Emitter.events.EDITOR_CHANGE, ...args);\n if (source !== Emitter.sources.SILENT) {\n this.emitter.emit(...args);\n }\n }\n }\n}\n\nfunction contains(parent: Node, descendant: Node) {\n try {\n // Firefox inserts inaccessible nodes around video elements\n descendant.parentNode; // eslint-disable-line @typescript-eslint/no-unused-expressions\n } catch (e) {\n return false;\n }\n return parent.contains(descendant);\n}\n\nexport default Selection;\n","import type Quill from '../core.js';\nimport type Clipboard from '../modules/clipboard.js';\nimport type History from '../modules/history.js';\nimport type Keyboard from '../modules/keyboard.js';\nimport type { ToolbarProps } from '../modules/toolbar.js';\nimport type Uploader from '../modules/uploader.js';\n\nexport interface ThemeOptions {\n modules: Record & {\n toolbar?: null | ToolbarProps;\n };\n}\n\nclass Theme {\n static DEFAULTS: ThemeOptions = {\n modules: {},\n };\n\n static themes = {\n default: Theme,\n };\n\n modules: ThemeOptions['modules'] = {};\n\n constructor(\n protected quill: Quill,\n protected options: ThemeOptions,\n ) {}\n\n init() {\n Object.keys(this.options.modules).forEach((name) => {\n if (this.modules[name] == null) {\n this.addModule(name);\n }\n });\n }\n\n addModule(name: 'clipboard'): Clipboard;\n addModule(name: 'keyboard'): Keyboard;\n addModule(name: 'uploader'): Uploader;\n addModule(name: 'history'): History;\n addModule(name: string): unknown;\n addModule(name: string) {\n // @ts-expect-error\n const ModuleClass = this.quill.constructor.import(`modules/${name}`);\n this.modules[name] = new ModuleClass(\n this.quill,\n this.options.modules[name] || {},\n );\n return this.modules[name];\n }\n}\n\nexport interface ThemeConstructor {\n new (quill: Quill, options: unknown): Theme;\n DEFAULTS: ThemeOptions;\n}\n\nexport default Theme;\n","import { Attributor, ClassAttributor, Scope, StyleAttributor } from 'parchment';\n\nconst config = {\n scope: Scope.BLOCK,\n whitelist: ['right', 'center', 'justify'],\n};\n\nconst AlignAttribute = new Attributor('align', 'align', config);\nconst AlignClass = new ClassAttributor('align', 'ql-align', config);\nconst AlignStyle = new StyleAttributor('align', 'text-align', config);\n\nexport { AlignAttribute, AlignClass, AlignStyle };\n","import { ClassAttributor, Scope } from 'parchment';\nimport { ColorAttributor } from './color.js';\n\nconst BackgroundClass = new ClassAttributor('background', 'ql-bg', {\n scope: Scope.INLINE,\n});\nconst BackgroundStyle = new ColorAttributor('background', 'background-color', {\n scope: Scope.INLINE,\n});\n\nexport { BackgroundClass, BackgroundStyle };\n","import Block from '../blots/block.js';\nimport Break from '../blots/break.js';\nimport Cursor from '../blots/cursor.js';\nimport Inline from '../blots/inline.js';\nimport TextBlot, { escapeText } from '../blots/text.js';\nimport Container from '../blots/container.js';\nimport Quill from '../core/quill.js';\n\nclass CodeBlockContainer extends Container {\n static create(value: string) {\n const domNode = super.create(value) as Element;\n domNode.setAttribute('spellcheck', 'false');\n return domNode;\n }\n\n code(index: number, length: number) {\n return (\n this.children\n // @ts-expect-error\n .map((child) => (child.length() <= 1 ? '' : child.domNode.innerText))\n .join('\\n')\n .slice(index, index + length)\n );\n }\n\n html(index: number, length: number) {\n // `\\n`s are needed in order to support empty lines at the beginning and the end.\n // https://html.spec.whatwg.org/multipage/syntax.html#element-restrictions\n return `
    \\n${escapeText(this.code(index, length))}\\n
    `;\n }\n}\n\nclass CodeBlock extends Block {\n static TAB = ' ';\n\n static register() {\n Quill.register(CodeBlockContainer);\n }\n}\n\nclass Code extends Inline {}\nCode.blotName = 'code';\nCode.tagName = 'CODE';\n\nCodeBlock.blotName = 'code-block';\nCodeBlock.className = 'ql-code-block';\nCodeBlock.tagName = 'DIV';\nCodeBlockContainer.blotName = 'code-block-container';\nCodeBlockContainer.className = 'ql-code-block-container';\nCodeBlockContainer.tagName = 'DIV';\n\nCodeBlockContainer.allowedChildren = [CodeBlock];\n\nCodeBlock.allowedChildren = [TextBlot, Break, Cursor];\nCodeBlock.requiredContainer = CodeBlockContainer;\n\nexport { Code, CodeBlockContainer, CodeBlock as default };\n","import { ClassAttributor, Scope, StyleAttributor } from 'parchment';\n\nclass ColorAttributor extends StyleAttributor {\n value(domNode: HTMLElement) {\n let value = super.value(domNode) as string;\n if (!value.startsWith('rgb(')) return value;\n value = value.replace(/^[^\\d]+/, '').replace(/[^\\d]+$/, '');\n const hex = value\n .split(',')\n .map((component) => `00${parseInt(component, 10).toString(16)}`.slice(-2))\n .join('');\n return `#${hex}`;\n }\n}\n\nconst ColorClass = new ClassAttributor('color', 'ql-color', {\n scope: Scope.INLINE,\n});\nconst ColorStyle = new ColorAttributor('color', 'color', {\n scope: Scope.INLINE,\n});\n\nexport { ColorAttributor, ColorClass, ColorStyle };\n","import { Attributor, ClassAttributor, Scope, StyleAttributor } from 'parchment';\n\nconst config = {\n scope: Scope.BLOCK,\n whitelist: ['rtl'],\n};\n\nconst DirectionAttribute = new Attributor('direction', 'dir', config);\nconst DirectionClass = new ClassAttributor('direction', 'ql-direction', config);\nconst DirectionStyle = new StyleAttributor('direction', 'direction', config);\n\nexport { DirectionAttribute, DirectionClass, DirectionStyle };\n","import { ClassAttributor, Scope, StyleAttributor } from 'parchment';\n\nconst config = {\n scope: Scope.INLINE,\n whitelist: ['serif', 'monospace'],\n};\n\nconst FontClass = new ClassAttributor('font', 'ql-font', config);\n\nclass FontStyleAttributor extends StyleAttributor {\n value(node: HTMLElement) {\n return super.value(node).replace(/[\"']/g, '');\n }\n}\n\nconst FontStyle = new FontStyleAttributor('font', 'font-family', config);\n\nexport { FontStyle, FontClass };\n","import { ClassAttributor, Scope, StyleAttributor } from 'parchment';\n\nconst SizeClass = new ClassAttributor('size', 'ql-size', {\n scope: Scope.INLINE,\n whitelist: ['small', 'large', 'huge'],\n});\nconst SizeStyle = new StyleAttributor('size', 'font-size', {\n scope: Scope.INLINE,\n whitelist: ['10px', '18px', '32px'],\n});\n\nexport { SizeClass, SizeStyle };\n","const normalWeightRegexp = /font-weight:\\s*normal/;\nconst blockTagNames = ['P', 'OL', 'UL'];\n\nconst isBlockElement = (element: Element | null) => {\n return element && blockTagNames.includes(element.tagName);\n};\n\nconst normalizeEmptyLines = (doc: Document) => {\n Array.from(doc.querySelectorAll('br'))\n .filter(\n (br) =>\n isBlockElement(br.previousElementSibling) &&\n isBlockElement(br.nextElementSibling),\n )\n .forEach((br) => {\n br.parentNode?.removeChild(br);\n });\n};\n\nconst normalizeFontWeight = (doc: Document) => {\n Array.from(doc.querySelectorAll('b[style*=\"font-weight\"]'))\n .filter((node) => node.getAttribute('style')?.match(normalWeightRegexp))\n .forEach((node) => {\n const fragment = doc.createDocumentFragment();\n fragment.append(...node.childNodes);\n node.parentNode?.replaceChild(fragment, node);\n });\n};\n\nexport default function normalize(doc: Document) {\n if (doc.querySelector('[id^=\"docs-internal-guid-\"]')) {\n normalizeFontWeight(doc);\n normalizeEmptyLines(doc);\n }\n}\n","const ignoreRegexp = /\\bmso-list:[^;]*ignore/i;\nconst idRegexp = /\\bmso-list:[^;]*\\bl(\\d+)/i;\nconst indentRegexp = /\\bmso-list:[^;]*\\blevel(\\d+)/i;\n\nconst parseListItem = (element: Element, html: string) => {\n const style = element.getAttribute('style');\n const idMatch = style?.match(idRegexp);\n if (!idMatch) {\n return null;\n }\n const id = Number(idMatch[1]);\n\n const indentMatch = style?.match(indentRegexp);\n const indent = indentMatch ? Number(indentMatch[1]) : 1;\n\n const typeRegexp = new RegExp(\n `@list l${id}:level${indent}\\\\s*\\\\{[^\\\\}]*mso-level-number-format:\\\\s*([\\\\w-]+)`,\n 'i',\n );\n const typeMatch = html.match(typeRegexp);\n const type = typeMatch && typeMatch[1] === 'bullet' ? 'bullet' : 'ordered';\n\n return { id, indent, type, element };\n};\n\n// list items are represented as `p` tags with styles like `mso-list: l0 level1` where:\n// 1. \"0\" in \"l0\" means the list item id;\n// 2. \"1\" in \"level1\" means the indent level, starting from 1.\nconst normalizeListItem = (doc: Document) => {\n const msoList = Array.from(doc.querySelectorAll('[style*=mso-list]'));\n const ignored: Element[] = [];\n const others: Element[] = [];\n msoList.forEach((node) => {\n const shouldIgnore = (node.getAttribute('style') || '').match(ignoreRegexp);\n if (shouldIgnore) {\n ignored.push(node);\n } else {\n others.push(node);\n }\n });\n\n // Each list item contains a marker wrapped with \"mso-list: Ignore\".\n ignored.forEach((node) => node.parentNode?.removeChild(node));\n\n // The list stype is not defined inline with the tag, instead, it's in the\n // style tag so we need to pass the html as a string.\n const html = doc.documentElement.innerHTML;\n const listItems = others\n .map((element) => parseListItem(element, html))\n .filter((parsed) => parsed);\n\n while (listItems.length) {\n const childListItems = [];\n\n let current = listItems.shift();\n // Group continuous items into the same group (aka \"ul\")\n while (current) {\n childListItems.push(current);\n current =\n listItems.length &&\n listItems[0]?.element === current.element.nextElementSibling &&\n // Different id means the next item doesn't belong to this group.\n listItems[0].id === current.id\n ? listItems.shift()\n : null;\n }\n\n const ul = document.createElement('ul');\n childListItems.forEach((listItem) => {\n const li = document.createElement('li');\n li.setAttribute('data-list', listItem.type);\n if (listItem.indent > 1) {\n li.setAttribute('class', `ql-indent-${listItem.indent - 1}`);\n }\n li.innerHTML = listItem.element.innerHTML;\n ul.appendChild(li);\n });\n\n const element = childListItems[0]?.element;\n const { parentNode } = element ?? {};\n if (element) {\n parentNode?.replaceChild(ul, element);\n }\n childListItems.slice(1).forEach(({ element: e }) => {\n parentNode?.removeChild(e);\n });\n }\n};\n\nexport default function normalize(doc: Document) {\n if (\n doc.documentElement.getAttribute('xmlns:w') ===\n 'urn:schemas-microsoft-com:office:word'\n ) {\n normalizeListItem(doc);\n }\n}\n","import googleDocs from './normalizers/googleDocs.js';\nimport msWord from './normalizers/msWord.js';\n\nconst NORMALIZERS = [msWord, googleDocs];\n\nconst normalizeExternalHTML = (doc: Document) => {\n if (doc.documentElement) {\n NORMALIZERS.forEach((normalize) => {\n normalize(doc);\n });\n }\n};\n\nexport default normalizeExternalHTML;\n","import type { ScrollBlot } from 'parchment';\nimport {\n Attributor,\n BlockBlot,\n ClassAttributor,\n EmbedBlot,\n Scope,\n StyleAttributor,\n} from 'parchment';\nimport Delta from 'quill-delta';\nimport { BlockEmbed } from '../blots/block.js';\nimport type { EmitterSource } from '../core/emitter.js';\nimport logger from '../core/logger.js';\nimport Module from '../core/module.js';\nimport Quill from '../core/quill.js';\nimport type { Range } from '../core/selection.js';\nimport { AlignAttribute, AlignStyle } from '../formats/align.js';\nimport { BackgroundStyle } from '../formats/background.js';\nimport CodeBlock from '../formats/code.js';\nimport { ColorStyle } from '../formats/color.js';\nimport { DirectionAttribute, DirectionStyle } from '../formats/direction.js';\nimport { FontStyle } from '../formats/font.js';\nimport { SizeStyle } from '../formats/size.js';\nimport { deleteRange } from './keyboard.js';\nimport normalizeExternalHTML from './normalizeExternalHTML/index.js';\n\nconst debug = logger('quill:clipboard');\n\ntype Selector = string | Node['TEXT_NODE'] | Node['ELEMENT_NODE'];\ntype Matcher = (node: Node, delta: Delta, scroll: ScrollBlot) => Delta;\n\nconst CLIPBOARD_CONFIG: [Selector, Matcher][] = [\n [Node.TEXT_NODE, matchText],\n [Node.TEXT_NODE, matchNewline],\n ['br', matchBreak],\n [Node.ELEMENT_NODE, matchNewline],\n [Node.ELEMENT_NODE, matchBlot],\n [Node.ELEMENT_NODE, matchAttributor],\n [Node.ELEMENT_NODE, matchStyles],\n ['li', matchIndent],\n ['ol, ul', matchList],\n ['pre', matchCodeBlock],\n ['tr', matchTable],\n ['b', createMatchAlias('bold')],\n ['i', createMatchAlias('italic')],\n ['strike', createMatchAlias('strike')],\n ['style', matchIgnore],\n];\n\nconst ATTRIBUTE_ATTRIBUTORS = [AlignAttribute, DirectionAttribute].reduce(\n (memo: Record, attr) => {\n memo[attr.keyName] = attr;\n return memo;\n },\n {},\n);\n\nconst STYLE_ATTRIBUTORS = [\n AlignStyle,\n BackgroundStyle,\n ColorStyle,\n DirectionStyle,\n FontStyle,\n SizeStyle,\n].reduce((memo: Record, attr) => {\n memo[attr.keyName] = attr;\n return memo;\n}, {});\n\ninterface ClipboardOptions {\n matchers: [Selector, Matcher][];\n}\n\nclass Clipboard extends Module {\n static DEFAULTS: ClipboardOptions = {\n matchers: [],\n };\n\n matchers: [Selector, Matcher][];\n\n constructor(quill: Quill, options: Partial) {\n super(quill, options);\n this.quill.root.addEventListener('copy', (e) =>\n this.onCaptureCopy(e, false),\n );\n this.quill.root.addEventListener('cut', (e) => this.onCaptureCopy(e, true));\n this.quill.root.addEventListener('paste', this.onCapturePaste.bind(this));\n this.matchers = [];\n CLIPBOARD_CONFIG.concat(this.options.matchers ?? []).forEach(\n ([selector, matcher]) => {\n this.addMatcher(selector, matcher);\n },\n );\n }\n\n addMatcher(selector: Selector, matcher: Matcher) {\n this.matchers.push([selector, matcher]);\n }\n\n convert(\n { html, text }: { html?: string; text?: string },\n formats: Record = {},\n ) {\n if (formats[CodeBlock.blotName]) {\n return new Delta().insert(text || '', {\n [CodeBlock.blotName]: formats[CodeBlock.blotName],\n });\n }\n if (!html) {\n return new Delta().insert(text || '', formats);\n }\n const delta = this.convertHTML(html);\n // Remove trailing newline\n if (\n deltaEndsWith(delta, '\\n') &&\n (delta.ops[delta.ops.length - 1].attributes == null || formats.table)\n ) {\n return delta.compose(new Delta().retain(delta.length() - 1).delete(1));\n }\n return delta;\n }\n\n protected normalizeHTML(doc: Document) {\n normalizeExternalHTML(doc);\n }\n\n protected convertHTML(html: string) {\n const doc = new DOMParser().parseFromString(html, 'text/html');\n this.normalizeHTML(doc);\n const container = doc.body;\n const nodeMatches = new WeakMap();\n const [elementMatchers, textMatchers] = this.prepareMatching(\n container,\n nodeMatches,\n );\n return traverse(\n this.quill.scroll,\n container,\n elementMatchers,\n textMatchers,\n nodeMatches,\n );\n }\n\n dangerouslyPasteHTML(html: string, source?: EmitterSource): void;\n dangerouslyPasteHTML(\n index: number,\n html: string,\n source?: EmitterSource,\n ): void;\n dangerouslyPasteHTML(\n index: number | string,\n html?: string,\n source: EmitterSource = Quill.sources.API,\n ) {\n if (typeof index === 'string') {\n const delta = this.convert({ html: index, text: '' });\n // @ts-expect-error\n this.quill.setContents(delta, html);\n this.quill.setSelection(0, Quill.sources.SILENT);\n } else {\n const paste = this.convert({ html, text: '' });\n this.quill.updateContents(\n new Delta().retain(index).concat(paste),\n source,\n );\n this.quill.setSelection(index + paste.length(), Quill.sources.SILENT);\n }\n }\n\n onCaptureCopy(e: ClipboardEvent, isCut = false) {\n if (e.defaultPrevented) return;\n e.preventDefault();\n const [range] = this.quill.selection.getRange();\n if (range == null) return;\n const { html, text } = this.onCopy(range, isCut);\n e.clipboardData?.setData('text/plain', text);\n e.clipboardData?.setData('text/html', html);\n if (isCut) {\n deleteRange({ range, quill: this.quill });\n }\n }\n\n /*\n * https://www.iana.org/assignments/media-types/text/uri-list\n */\n private normalizeURIList(urlList: string) {\n return (\n urlList\n .split(/\\r?\\n/)\n // Ignore all comments\n .filter((url) => url[0] !== '#')\n .join('\\n')\n );\n }\n\n onCapturePaste(e: ClipboardEvent) {\n if (e.defaultPrevented || !this.quill.isEnabled()) return;\n e.preventDefault();\n const range = this.quill.getSelection(true);\n if (range == null) return;\n const html = e.clipboardData?.getData('text/html');\n let text = e.clipboardData?.getData('text/plain');\n if (!html && !text) {\n const urlList = e.clipboardData?.getData('text/uri-list');\n if (urlList) {\n text = this.normalizeURIList(urlList);\n }\n }\n const files = Array.from(e.clipboardData?.files || []);\n if (!html && files.length > 0) {\n this.quill.uploader.upload(range, files);\n return;\n }\n if (html && files.length > 0) {\n const doc = new DOMParser().parseFromString(html, 'text/html');\n if (\n doc.body.childElementCount === 1 &&\n doc.body.firstElementChild?.tagName === 'IMG'\n ) {\n this.quill.uploader.upload(range, files);\n return;\n }\n }\n this.onPaste(range, { html, text });\n }\n\n onCopy(range: Range, isCut: boolean): { html: string; text: string };\n onCopy(range: Range) {\n const text = this.quill.getText(range);\n const html = this.quill.getSemanticHTML(range);\n return { html, text };\n }\n\n onPaste(range: Range, { text, html }: { text?: string; html?: string }) {\n const formats = this.quill.getFormat(range.index);\n const pastedDelta = this.convert({ text, html }, formats);\n debug.log('onPaste', pastedDelta, { text, html });\n const delta = new Delta()\n .retain(range.index)\n .delete(range.length)\n .concat(pastedDelta);\n this.quill.updateContents(delta, Quill.sources.USER);\n // range.length contributes to delta.length()\n this.quill.setSelection(\n delta.length() - range.length,\n Quill.sources.SILENT,\n );\n this.quill.scrollSelectionIntoView();\n }\n\n prepareMatching(container: Element, nodeMatches: WeakMap) {\n const elementMatchers: Matcher[] = [];\n const textMatchers: Matcher[] = [];\n this.matchers.forEach((pair) => {\n const [selector, matcher] = pair;\n switch (selector) {\n case Node.TEXT_NODE:\n textMatchers.push(matcher);\n break;\n case Node.ELEMENT_NODE:\n elementMatchers.push(matcher);\n break;\n default:\n Array.from(container.querySelectorAll(selector)).forEach((node) => {\n if (nodeMatches.has(node)) {\n const matches = nodeMatches.get(node);\n matches?.push(matcher);\n } else {\n nodeMatches.set(node, [matcher]);\n }\n });\n break;\n }\n });\n return [elementMatchers, textMatchers];\n }\n}\n\nfunction applyFormat(\n delta: Delta,\n format: string,\n value: unknown,\n scroll: ScrollBlot,\n): Delta {\n if (!scroll.query(format)) {\n return delta;\n }\n\n return delta.reduce((newDelta, op) => {\n if (!op.insert) return newDelta;\n if (op.attributes && op.attributes[format]) {\n return newDelta.push(op);\n }\n const formats = value ? { [format]: value } : {};\n return newDelta.insert(op.insert, { ...formats, ...op.attributes });\n }, new Delta());\n}\n\nfunction deltaEndsWith(delta: Delta, text: string) {\n let endText = '';\n for (\n let i = delta.ops.length - 1;\n i >= 0 && endText.length < text.length;\n --i // eslint-disable-line no-plusplus\n ) {\n const op = delta.ops[i];\n if (typeof op.insert !== 'string') break;\n endText = op.insert + endText;\n }\n return endText.slice(-1 * text.length) === text;\n}\n\nfunction isLine(node: Node, scroll: ScrollBlot) {\n if (!(node instanceof Element)) return false;\n const match = scroll.query(node);\n // @ts-expect-error\n if (match && match.prototype instanceof EmbedBlot) return false;\n\n return [\n 'address',\n 'article',\n 'blockquote',\n 'canvas',\n 'dd',\n 'div',\n 'dl',\n 'dt',\n 'fieldset',\n 'figcaption',\n 'figure',\n 'footer',\n 'form',\n 'h1',\n 'h2',\n 'h3',\n 'h4',\n 'h5',\n 'h6',\n 'header',\n 'iframe',\n 'li',\n 'main',\n 'nav',\n 'ol',\n 'output',\n 'p',\n 'pre',\n 'section',\n 'table',\n 'td',\n 'tr',\n 'ul',\n 'video',\n ].includes(node.tagName.toLowerCase());\n}\n\nfunction isBetweenInlineElements(node: HTMLElement, scroll: ScrollBlot) {\n return (\n node.previousElementSibling &&\n node.nextElementSibling &&\n !isLine(node.previousElementSibling, scroll) &&\n !isLine(node.nextElementSibling, scroll)\n );\n}\n\nconst preNodes = new WeakMap();\nfunction isPre(node: Node | null) {\n if (node == null) return false;\n if (!preNodes.has(node)) {\n // @ts-expect-error\n if (node.tagName === 'PRE') {\n preNodes.set(node, true);\n } else {\n preNodes.set(node, isPre(node.parentNode));\n }\n }\n return preNodes.get(node);\n}\n\nfunction traverse(\n scroll: ScrollBlot,\n node: ChildNode,\n elementMatchers: Matcher[],\n textMatchers: Matcher[],\n nodeMatches: WeakMap,\n): Delta {\n // Post-order\n if (node.nodeType === node.TEXT_NODE) {\n return textMatchers.reduce((delta: Delta, matcher) => {\n return matcher(node, delta, scroll);\n }, new Delta());\n }\n if (node.nodeType === node.ELEMENT_NODE) {\n return Array.from(node.childNodes || []).reduce((delta, childNode) => {\n let childrenDelta = traverse(\n scroll,\n childNode,\n elementMatchers,\n textMatchers,\n nodeMatches,\n );\n if (childNode.nodeType === node.ELEMENT_NODE) {\n childrenDelta = elementMatchers.reduce((reducedDelta, matcher) => {\n return matcher(childNode as HTMLElement, reducedDelta, scroll);\n }, childrenDelta);\n childrenDelta = (nodeMatches.get(childNode) || []).reduce(\n (reducedDelta, matcher) => {\n return matcher(childNode, reducedDelta, scroll);\n },\n childrenDelta,\n );\n }\n return delta.concat(childrenDelta);\n }, new Delta());\n }\n return new Delta();\n}\n\nfunction createMatchAlias(format: string) {\n return (_node: Element, delta: Delta, scroll: ScrollBlot) => {\n return applyFormat(delta, format, true, scroll);\n };\n}\n\nfunction matchAttributor(node: HTMLElement, delta: Delta, scroll: ScrollBlot) {\n const attributes = Attributor.keys(node);\n const classes = ClassAttributor.keys(node);\n const styles = StyleAttributor.keys(node);\n const formats: Record = {};\n attributes\n .concat(classes)\n .concat(styles)\n .forEach((name) => {\n let attr = scroll.query(name, Scope.ATTRIBUTE) as Attributor;\n if (attr != null) {\n formats[attr.attrName] = attr.value(node);\n if (formats[attr.attrName]) return;\n }\n attr = ATTRIBUTE_ATTRIBUTORS[name];\n if (attr != null && (attr.attrName === name || attr.keyName === name)) {\n formats[attr.attrName] = attr.value(node) || undefined;\n }\n attr = STYLE_ATTRIBUTORS[name];\n if (attr != null && (attr.attrName === name || attr.keyName === name)) {\n attr = STYLE_ATTRIBUTORS[name];\n formats[attr.attrName] = attr.value(node) || undefined;\n }\n });\n\n return Object.entries(formats).reduce(\n (newDelta, [name, value]) => applyFormat(newDelta, name, value, scroll),\n delta,\n );\n}\n\nfunction matchBlot(node: Node, delta: Delta, scroll: ScrollBlot) {\n const match = scroll.query(node);\n if (match == null) return delta;\n // @ts-expect-error\n if (match.prototype instanceof EmbedBlot) {\n const embed = {};\n // @ts-expect-error\n const value = match.value(node);\n if (value != null) {\n // @ts-expect-error\n embed[match.blotName] = value;\n // @ts-expect-error\n return new Delta().insert(embed, match.formats(node, scroll));\n }\n } else {\n // @ts-expect-error\n if (match.prototype instanceof BlockBlot && !deltaEndsWith(delta, '\\n')) {\n delta.insert('\\n');\n }\n if (\n 'blotName' in match &&\n 'formats' in match &&\n typeof match.formats === 'function'\n ) {\n return applyFormat(\n delta,\n match.blotName,\n match.formats(node, scroll),\n scroll,\n );\n }\n }\n return delta;\n}\n\nfunction matchBreak(node: Node, delta: Delta) {\n if (!deltaEndsWith(delta, '\\n')) {\n delta.insert('\\n');\n }\n return delta;\n}\n\nfunction matchCodeBlock(node: Node, delta: Delta, scroll: ScrollBlot) {\n const match = scroll.query('code-block');\n const language =\n match && 'formats' in match && typeof match.formats === 'function'\n ? match.formats(node, scroll)\n : true;\n return applyFormat(delta, 'code-block', language, scroll);\n}\n\nfunction matchIgnore() {\n return new Delta();\n}\n\nfunction matchIndent(node: Node, delta: Delta, scroll: ScrollBlot) {\n const match = scroll.query(node);\n if (\n match == null ||\n // @ts-expect-error\n match.blotName !== 'list' ||\n !deltaEndsWith(delta, '\\n')\n ) {\n return delta;\n }\n let indent = -1;\n let parent = node.parentNode;\n while (parent != null) {\n // @ts-expect-error\n if (['OL', 'UL'].includes(parent.tagName)) {\n indent += 1;\n }\n parent = parent.parentNode;\n }\n if (indent <= 0) return delta;\n return delta.reduce((composed, op) => {\n if (!op.insert) return composed;\n if (op.attributes && typeof op.attributes.indent === 'number') {\n return composed.push(op);\n }\n return composed.insert(op.insert, { indent, ...(op.attributes || {}) });\n }, new Delta());\n}\n\nfunction matchList(node: Node, delta: Delta, scroll: ScrollBlot) {\n const element = node as Element;\n let list = element.tagName === 'OL' ? 'ordered' : 'bullet';\n\n const checkedAttr = element.getAttribute('data-checked');\n if (checkedAttr) {\n list = checkedAttr === 'true' ? 'checked' : 'unchecked';\n }\n\n return applyFormat(delta, 'list', list, scroll);\n}\n\nfunction matchNewline(node: Node, delta: Delta, scroll: ScrollBlot) {\n if (!deltaEndsWith(delta, '\\n')) {\n if (\n isLine(node, scroll) &&\n (node.childNodes.length > 0 || node instanceof HTMLParagraphElement)\n ) {\n return delta.insert('\\n');\n }\n if (delta.length() > 0 && node.nextSibling) {\n let nextSibling: Node | null = node.nextSibling;\n while (nextSibling != null) {\n if (isLine(nextSibling, scroll)) {\n return delta.insert('\\n');\n }\n const match = scroll.query(nextSibling);\n // @ts-expect-error\n if (match && match.prototype instanceof BlockEmbed) {\n return delta.insert('\\n');\n }\n nextSibling = nextSibling.firstChild;\n }\n }\n }\n return delta;\n}\n\nfunction matchStyles(node: HTMLElement, delta: Delta, scroll: ScrollBlot) {\n const formats: Record = {};\n const style: Partial = node.style || {};\n if (style.fontStyle === 'italic') {\n formats.italic = true;\n }\n if (style.textDecoration === 'underline') {\n formats.underline = true;\n }\n if (style.textDecoration === 'line-through') {\n formats.strike = true;\n }\n if (\n style.fontWeight?.startsWith('bold') ||\n // @ts-expect-error Fix me later\n parseInt(style.fontWeight, 10) >= 700\n ) {\n formats.bold = true;\n }\n delta = Object.entries(formats).reduce(\n (newDelta, [name, value]) => applyFormat(newDelta, name, value, scroll),\n delta,\n );\n // @ts-expect-error\n if (parseFloat(style.textIndent || 0) > 0) {\n // Could be 0.5in\n return new Delta().insert('\\t').concat(delta);\n }\n return delta;\n}\n\nfunction matchTable(\n node: HTMLTableRowElement,\n delta: Delta,\n scroll: ScrollBlot,\n) {\n const table =\n node.parentElement?.tagName === 'TABLE'\n ? node.parentElement\n : node.parentElement?.parentElement;\n if (table != null) {\n const rows = Array.from(table.querySelectorAll('tr'));\n const row = rows.indexOf(node) + 1;\n return applyFormat(delta, 'table', row, scroll);\n }\n return delta;\n}\n\nfunction matchText(node: HTMLElement, delta: Delta, scroll: ScrollBlot) {\n // @ts-expect-error\n let text = node.data as string;\n // Word represents empty line with  \n if (node.parentElement?.tagName === 'O:P') {\n return delta.insert(text.trim());\n }\n if (!isPre(node)) {\n if (\n text.trim().length === 0 &&\n text.includes('\\n') &&\n !isBetweenInlineElements(node, scroll)\n ) {\n return delta;\n }\n // convert all non-nbsp whitespace into regular space\n text = text.replace(/[^\\S\\u00a0]/g, ' ');\n // collapse consecutive spaces into one\n text = text.replace(/ {2,}/g, ' ');\n if (\n (node.previousSibling == null &&\n node.parentElement != null &&\n isLine(node.parentElement, scroll)) ||\n (node.previousSibling instanceof Element &&\n isLine(node.previousSibling, scroll))\n ) {\n // block structure means we don't need leading space\n text = text.replace(/^ /, '');\n }\n if (\n (node.nextSibling == null &&\n node.parentElement != null &&\n isLine(node.parentElement, scroll)) ||\n (node.nextSibling instanceof Element && isLine(node.nextSibling, scroll))\n ) {\n // block structure means we don't need trailing space\n text = text.replace(/ $/, '');\n }\n // done removing whitespace and can normalize all to regular space\n text = text.replaceAll('\\u00a0', ' ');\n }\n return delta.insert(text);\n}\n\nexport {\n Clipboard as default,\n matchAttributor,\n matchBlot,\n matchNewline,\n matchText,\n traverse,\n};\n","import { cloneDeep, isEqual } from 'lodash-es';\nimport Delta, { AttributeMap } from 'quill-delta';\nimport { EmbedBlot, Scope, TextBlot } from 'parchment';\nimport type { Blot, BlockBlot } from 'parchment';\nimport Quill from '../core/quill.js';\nimport logger from '../core/logger.js';\nimport Module from '../core/module.js';\nimport type { BlockEmbed } from '../blots/block.js';\nimport type { Range } from '../core/selection.js';\n\nconst debug = logger('quill:keyboard');\n\nconst SHORTKEY = /Mac/i.test(navigator.platform) ? 'metaKey' : 'ctrlKey';\n\nexport interface Context {\n collapsed: boolean;\n empty: boolean;\n offset: number;\n prefix: string;\n suffix: string;\n format: Record;\n event: KeyboardEvent;\n line: BlockEmbed | BlockBlot;\n}\n\ninterface BindingObject\n extends Partial> {\n key: number | string | string[];\n shortKey?: boolean | null;\n shiftKey?: boolean | null;\n altKey?: boolean | null;\n metaKey?: boolean | null;\n ctrlKey?: boolean | null;\n prefix?: RegExp;\n suffix?: RegExp;\n format?: Record | string[];\n handler?: (\n this: { quill: Quill },\n range: Range,\n curContext: Context,\n // eslint-disable-next-line no-use-before-define\n binding: NormalizedBinding,\n ) => boolean | void;\n}\n\ntype Binding = BindingObject | string | number;\n\ninterface NormalizedBinding extends Omit {\n key: string | number;\n}\n\ninterface KeyboardOptions {\n bindings: Record;\n}\n\ninterface KeyboardOptions {\n bindings: Record;\n}\n\nclass Keyboard extends Module {\n static DEFAULTS: KeyboardOptions;\n\n static match(evt: KeyboardEvent, binding: BindingObject) {\n if (\n (['altKey', 'ctrlKey', 'metaKey', 'shiftKey'] as const).some((key) => {\n return !!binding[key] !== evt[key] && binding[key] !== null;\n })\n ) {\n return false;\n }\n return binding.key === evt.key || binding.key === evt.which;\n }\n\n bindings: Record;\n\n constructor(quill: Quill, options: Partial) {\n super(quill, options);\n this.bindings = {};\n // @ts-expect-error Fix me later\n Object.keys(this.options.bindings).forEach((name) => {\n // @ts-expect-error Fix me later\n if (this.options.bindings[name]) {\n // @ts-expect-error Fix me later\n this.addBinding(this.options.bindings[name]);\n }\n });\n this.addBinding({ key: 'Enter', shiftKey: null }, this.handleEnter);\n this.addBinding(\n { key: 'Enter', metaKey: null, ctrlKey: null, altKey: null },\n () => {},\n );\n if (/Firefox/i.test(navigator.userAgent)) {\n // Need to handle delete and backspace for Firefox in the general case #1171\n this.addBinding(\n { key: 'Backspace' },\n { collapsed: true },\n this.handleBackspace,\n );\n this.addBinding(\n { key: 'Delete' },\n { collapsed: true },\n this.handleDelete,\n );\n } else {\n this.addBinding(\n { key: 'Backspace' },\n { collapsed: true, prefix: /^.?$/ },\n this.handleBackspace,\n );\n this.addBinding(\n { key: 'Delete' },\n { collapsed: true, suffix: /^.?$/ },\n this.handleDelete,\n );\n }\n this.addBinding(\n { key: 'Backspace' },\n { collapsed: false },\n this.handleDeleteRange,\n );\n this.addBinding(\n { key: 'Delete' },\n { collapsed: false },\n this.handleDeleteRange,\n );\n this.addBinding(\n {\n key: 'Backspace',\n altKey: null,\n ctrlKey: null,\n metaKey: null,\n shiftKey: null,\n },\n { collapsed: true, offset: 0 },\n this.handleBackspace,\n );\n this.listen();\n }\n\n addBinding(\n keyBinding: Binding,\n context:\n | Required\n | Partial> = {},\n handler:\n | Required\n | Partial> = {},\n ) {\n const binding = normalize(keyBinding);\n if (binding == null) {\n debug.warn('Attempted to add invalid keyboard binding', binding);\n return;\n }\n if (typeof context === 'function') {\n context = { handler: context };\n }\n if (typeof handler === 'function') {\n handler = { handler };\n }\n const keys = Array.isArray(binding.key) ? binding.key : [binding.key];\n keys.forEach((key) => {\n const singleBinding = {\n ...binding,\n key,\n ...context,\n ...handler,\n };\n this.bindings[singleBinding.key] = this.bindings[singleBinding.key] || [];\n this.bindings[singleBinding.key].push(singleBinding);\n });\n }\n\n listen() {\n this.quill.root.addEventListener('keydown', (evt) => {\n if (evt.defaultPrevented || evt.isComposing) return;\n\n // evt.isComposing is false when pressing Enter/Backspace when composing in Safari\n // https://bugs.webkit.org/show_bug.cgi?id=165004\n const isComposing =\n evt.keyCode === 229 && (evt.key === 'Enter' || evt.key === 'Backspace');\n if (isComposing) return;\n\n const bindings = (this.bindings[evt.key] || []).concat(\n this.bindings[evt.which] || [],\n );\n const matches = bindings.filter((binding) =>\n Keyboard.match(evt, binding),\n );\n if (matches.length === 0) return;\n // @ts-expect-error\n const blot = Quill.find(evt.target, true);\n if (blot && blot.scroll !== this.quill.scroll) return;\n const range = this.quill.getSelection();\n if (range == null || !this.quill.hasFocus()) return;\n const [line, offset] = this.quill.getLine(range.index);\n const [leafStart, offsetStart] = this.quill.getLeaf(range.index);\n const [leafEnd, offsetEnd] =\n range.length === 0\n ? [leafStart, offsetStart]\n : this.quill.getLeaf(range.index + range.length);\n const prefixText =\n leafStart instanceof TextBlot\n ? leafStart.value().slice(0, offsetStart)\n : '';\n const suffixText =\n leafEnd instanceof TextBlot ? leafEnd.value().slice(offsetEnd) : '';\n const curContext = {\n collapsed: range.length === 0,\n // @ts-expect-error Fix me later\n empty: range.length === 0 && line.length() <= 1,\n format: this.quill.getFormat(range),\n line,\n offset,\n prefix: prefixText,\n suffix: suffixText,\n event: evt,\n };\n const prevented = matches.some((binding) => {\n if (\n binding.collapsed != null &&\n binding.collapsed !== curContext.collapsed\n ) {\n return false;\n }\n if (binding.empty != null && binding.empty !== curContext.empty) {\n return false;\n }\n if (binding.offset != null && binding.offset !== curContext.offset) {\n return false;\n }\n if (Array.isArray(binding.format)) {\n // any format is present\n if (binding.format.every((name) => curContext.format[name] == null)) {\n return false;\n }\n } else if (typeof binding.format === 'object') {\n // all formats must match\n if (\n !Object.keys(binding.format).every((name) => {\n // @ts-expect-error Fix me later\n if (binding.format[name] === true)\n return curContext.format[name] != null;\n // @ts-expect-error Fix me later\n if (binding.format[name] === false)\n return curContext.format[name] == null;\n // @ts-expect-error Fix me later\n return isEqual(binding.format[name], curContext.format[name]);\n })\n ) {\n return false;\n }\n }\n if (binding.prefix != null && !binding.prefix.test(curContext.prefix)) {\n return false;\n }\n if (binding.suffix != null && !binding.suffix.test(curContext.suffix)) {\n return false;\n }\n // @ts-expect-error Fix me later\n return binding.handler.call(this, range, curContext, binding) !== true;\n });\n if (prevented) {\n evt.preventDefault();\n }\n });\n }\n\n handleBackspace(range: Range, context: Context) {\n // Check for astral symbols\n const length = /[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]$/.test(context.prefix)\n ? 2\n : 1;\n if (range.index === 0 || this.quill.getLength() <= 1) return;\n let formats = {};\n const [line] = this.quill.getLine(range.index);\n let delta = new Delta().retain(range.index - length).delete(length);\n if (context.offset === 0) {\n // Always deleting newline here, length always 1\n const [prev] = this.quill.getLine(range.index - 1);\n if (prev) {\n const isPrevLineEmpty =\n prev.statics.blotName === 'block' && prev.length() <= 1;\n if (!isPrevLineEmpty) {\n // @ts-expect-error Fix me later\n const curFormats = line.formats();\n const prevFormats = this.quill.getFormat(range.index - 1, 1);\n formats = AttributeMap.diff(curFormats, prevFormats) || {};\n if (Object.keys(formats).length > 0) {\n // line.length() - 1 targets \\n in line, another -1 for newline being deleted\n const formatDelta = new Delta()\n // @ts-expect-error Fix me later\n .retain(range.index + line.length() - 2)\n .retain(1, formats);\n delta = delta.compose(formatDelta);\n }\n }\n }\n }\n this.quill.updateContents(delta, Quill.sources.USER);\n this.quill.focus();\n }\n\n handleDelete(range: Range, context: Context) {\n // Check for astral symbols\n const length = /^[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/.test(context.suffix)\n ? 2\n : 1;\n if (range.index >= this.quill.getLength() - length) return;\n let formats = {};\n const [line] = this.quill.getLine(range.index);\n let delta = new Delta().retain(range.index).delete(length);\n // @ts-expect-error Fix me later\n if (context.offset >= line.length() - 1) {\n const [next] = this.quill.getLine(range.index + 1);\n if (next) {\n // @ts-expect-error Fix me later\n const curFormats = line.formats();\n const nextFormats = this.quill.getFormat(range.index, 1);\n formats = AttributeMap.diff(curFormats, nextFormats) || {};\n if (Object.keys(formats).length > 0) {\n delta = delta.retain(next.length() - 1).retain(1, formats);\n }\n }\n }\n this.quill.updateContents(delta, Quill.sources.USER);\n this.quill.focus();\n }\n\n handleDeleteRange(range: Range) {\n deleteRange({ range, quill: this.quill });\n this.quill.focus();\n }\n\n handleEnter(range: Range, context: Context) {\n const lineFormats = Object.keys(context.format).reduce(\n (formats: Record, format) => {\n if (\n this.quill.scroll.query(format, Scope.BLOCK) &&\n !Array.isArray(context.format[format])\n ) {\n formats[format] = context.format[format];\n }\n return formats;\n },\n {},\n );\n const delta = new Delta()\n .retain(range.index)\n .delete(range.length)\n .insert('\\n', lineFormats);\n this.quill.updateContents(delta, Quill.sources.USER);\n this.quill.setSelection(range.index + 1, Quill.sources.SILENT);\n this.quill.focus();\n }\n}\n\nconst defaultOptions: KeyboardOptions = {\n bindings: {\n bold: makeFormatHandler('bold'),\n italic: makeFormatHandler('italic'),\n underline: makeFormatHandler('underline'),\n indent: {\n // highlight tab or tab at beginning of list, indent or blockquote\n key: 'Tab',\n format: ['blockquote', 'indent', 'list'],\n handler(range, context) {\n if (context.collapsed && context.offset !== 0) return true;\n this.quill.format('indent', '+1', Quill.sources.USER);\n return false;\n },\n },\n outdent: {\n key: 'Tab',\n shiftKey: true,\n format: ['blockquote', 'indent', 'list'],\n // highlight tab or tab at beginning of list, indent or blockquote\n handler(range, context) {\n if (context.collapsed && context.offset !== 0) return true;\n this.quill.format('indent', '-1', Quill.sources.USER);\n return false;\n },\n },\n 'outdent backspace': {\n key: 'Backspace',\n collapsed: true,\n shiftKey: null,\n metaKey: null,\n ctrlKey: null,\n altKey: null,\n format: ['indent', 'list'],\n offset: 0,\n handler(range, context) {\n if (context.format.indent != null) {\n this.quill.format('indent', '-1', Quill.sources.USER);\n } else if (context.format.list != null) {\n this.quill.format('list', false, Quill.sources.USER);\n }\n },\n },\n 'indent code-block': makeCodeBlockHandler(true),\n 'outdent code-block': makeCodeBlockHandler(false),\n 'remove tab': {\n key: 'Tab',\n shiftKey: true,\n collapsed: true,\n prefix: /\\t$/,\n handler(range) {\n this.quill.deleteText(range.index - 1, 1, Quill.sources.USER);\n },\n },\n tab: {\n key: 'Tab',\n handler(range, context) {\n if (context.format.table) return true;\n this.quill.history.cutoff();\n const delta = new Delta()\n .retain(range.index)\n .delete(range.length)\n .insert('\\t');\n this.quill.updateContents(delta, Quill.sources.USER);\n this.quill.history.cutoff();\n this.quill.setSelection(range.index + 1, Quill.sources.SILENT);\n return false;\n },\n },\n 'blockquote empty enter': {\n key: 'Enter',\n collapsed: true,\n format: ['blockquote'],\n empty: true,\n handler() {\n this.quill.format('blockquote', false, Quill.sources.USER);\n },\n },\n 'list empty enter': {\n key: 'Enter',\n collapsed: true,\n format: ['list'],\n empty: true,\n handler(range, context) {\n const formats: Record = { list: false };\n if (context.format.indent) {\n formats.indent = false;\n }\n this.quill.formatLine(\n range.index,\n range.length,\n formats,\n Quill.sources.USER,\n );\n },\n },\n 'checklist enter': {\n key: 'Enter',\n collapsed: true,\n format: { list: 'checked' },\n handler(range) {\n const [line, offset] = this.quill.getLine(range.index);\n const formats = {\n // @ts-expect-error Fix me later\n ...line.formats(),\n list: 'checked',\n };\n const delta = new Delta()\n .retain(range.index)\n .insert('\\n', formats)\n // @ts-expect-error Fix me later\n .retain(line.length() - offset - 1)\n .retain(1, { list: 'unchecked' });\n this.quill.updateContents(delta, Quill.sources.USER);\n this.quill.setSelection(range.index + 1, Quill.sources.SILENT);\n this.quill.scrollSelectionIntoView();\n },\n },\n 'header enter': {\n key: 'Enter',\n collapsed: true,\n format: ['header'],\n suffix: /^$/,\n handler(range, context) {\n const [line, offset] = this.quill.getLine(range.index);\n const delta = new Delta()\n .retain(range.index)\n .insert('\\n', context.format)\n // @ts-expect-error Fix me later\n .retain(line.length() - offset - 1)\n .retain(1, { header: null });\n this.quill.updateContents(delta, Quill.sources.USER);\n this.quill.setSelection(range.index + 1, Quill.sources.SILENT);\n this.quill.scrollSelectionIntoView();\n },\n },\n 'table backspace': {\n key: 'Backspace',\n format: ['table'],\n collapsed: true,\n offset: 0,\n handler() {},\n },\n 'table delete': {\n key: 'Delete',\n format: ['table'],\n collapsed: true,\n suffix: /^$/,\n handler() {},\n },\n 'table enter': {\n key: 'Enter',\n shiftKey: null,\n format: ['table'],\n handler(range) {\n const module = this.quill.getModule('table');\n if (module) {\n // @ts-expect-error\n const [table, row, cell, offset] = module.getTable(range);\n const shift = tableSide(table, row, cell, offset);\n if (shift == null) return;\n let index = table.offset();\n if (shift < 0) {\n const delta = new Delta().retain(index).insert('\\n');\n this.quill.updateContents(delta, Quill.sources.USER);\n this.quill.setSelection(\n range.index + 1,\n range.length,\n Quill.sources.SILENT,\n );\n } else if (shift > 0) {\n index += table.length();\n const delta = new Delta().retain(index).insert('\\n');\n this.quill.updateContents(delta, Quill.sources.USER);\n this.quill.setSelection(index, Quill.sources.USER);\n }\n }\n },\n },\n 'table tab': {\n key: 'Tab',\n shiftKey: null,\n format: ['table'],\n handler(range, context) {\n const { event, line: cell } = context;\n const offset = cell.offset(this.quill.scroll);\n if (event.shiftKey) {\n this.quill.setSelection(offset - 1, Quill.sources.USER);\n } else {\n this.quill.setSelection(offset + cell.length(), Quill.sources.USER);\n }\n },\n },\n 'list autofill': {\n key: ' ',\n shiftKey: null,\n collapsed: true,\n format: {\n 'code-block': false,\n blockquote: false,\n table: false,\n },\n prefix: /^\\s*?(\\d+\\.|-|\\*|\\[ ?\\]|\\[x\\])$/,\n handler(range, context) {\n if (this.quill.scroll.query('list') == null) return true;\n const { length } = context.prefix;\n const [line, offset] = this.quill.getLine(range.index);\n if (offset > length) return true;\n let value;\n switch (context.prefix.trim()) {\n case '[]':\n case '[ ]':\n value = 'unchecked';\n break;\n case '[x]':\n value = 'checked';\n break;\n case '-':\n case '*':\n value = 'bullet';\n break;\n default:\n value = 'ordered';\n }\n this.quill.insertText(range.index, ' ', Quill.sources.USER);\n this.quill.history.cutoff();\n const delta = new Delta()\n .retain(range.index - offset)\n .delete(length + 1)\n // @ts-expect-error Fix me later\n .retain(line.length() - 2 - offset)\n .retain(1, { list: value });\n this.quill.updateContents(delta, Quill.sources.USER);\n this.quill.history.cutoff();\n this.quill.setSelection(range.index - length, Quill.sources.SILENT);\n return false;\n },\n },\n 'code exit': {\n key: 'Enter',\n collapsed: true,\n format: ['code-block'],\n prefix: /^$/,\n suffix: /^\\s*$/,\n handler(range) {\n const [line, offset] = this.quill.getLine(range.index);\n let numLines = 2;\n let cur = line;\n while (\n cur != null &&\n cur.length() <= 1 &&\n cur.formats()['code-block']\n ) {\n // @ts-expect-error\n cur = cur.prev;\n numLines -= 1;\n // Requisite prev lines are empty\n if (numLines <= 0) {\n const delta = new Delta()\n // @ts-expect-error Fix me later\n .retain(range.index + line.length() - offset - 2)\n .retain(1, { 'code-block': null })\n .delete(1);\n this.quill.updateContents(delta, Quill.sources.USER);\n this.quill.setSelection(range.index - 1, Quill.sources.SILENT);\n return false;\n }\n }\n return true;\n },\n },\n 'embed left': makeEmbedArrowHandler('ArrowLeft', false),\n 'embed left shift': makeEmbedArrowHandler('ArrowLeft', true),\n 'embed right': makeEmbedArrowHandler('ArrowRight', false),\n 'embed right shift': makeEmbedArrowHandler('ArrowRight', true),\n 'table down': makeTableArrowHandler(false),\n 'table up': makeTableArrowHandler(true),\n },\n};\n\nKeyboard.DEFAULTS = defaultOptions;\n\nfunction makeCodeBlockHandler(indent: boolean): BindingObject {\n return {\n key: 'Tab',\n shiftKey: !indent,\n format: { 'code-block': true },\n handler(range, { event }) {\n const CodeBlock = this.quill.scroll.query('code-block');\n // @ts-expect-error\n const { TAB } = CodeBlock;\n if (range.length === 0 && !event.shiftKey) {\n this.quill.insertText(range.index, TAB, Quill.sources.USER);\n this.quill.setSelection(range.index + TAB.length, Quill.sources.SILENT);\n return;\n }\n\n const lines =\n range.length === 0\n ? this.quill.getLines(range.index, 1)\n : this.quill.getLines(range);\n let { index, length } = range;\n lines.forEach((line, i) => {\n if (indent) {\n line.insertAt(0, TAB);\n if (i === 0) {\n index += TAB.length;\n } else {\n length += TAB.length;\n }\n // @ts-expect-error Fix me later\n } else if (line.domNode.textContent.startsWith(TAB)) {\n line.deleteAt(0, TAB.length);\n if (i === 0) {\n index -= TAB.length;\n } else {\n length -= TAB.length;\n }\n }\n });\n this.quill.update(Quill.sources.USER);\n this.quill.setSelection(index, length, Quill.sources.SILENT);\n },\n };\n}\n\nfunction makeEmbedArrowHandler(\n key: string,\n shiftKey: boolean | null,\n): BindingObject {\n const where = key === 'ArrowLeft' ? 'prefix' : 'suffix';\n return {\n key,\n shiftKey,\n altKey: null,\n [where]: /^$/,\n handler(range) {\n let { index } = range;\n if (key === 'ArrowRight') {\n index += range.length + 1;\n }\n const [leaf] = this.quill.getLeaf(index);\n if (!(leaf instanceof EmbedBlot)) return true;\n if (key === 'ArrowLeft') {\n if (shiftKey) {\n this.quill.setSelection(\n range.index - 1,\n range.length + 1,\n Quill.sources.USER,\n );\n } else {\n this.quill.setSelection(range.index - 1, Quill.sources.USER);\n }\n } else if (shiftKey) {\n this.quill.setSelection(\n range.index,\n range.length + 1,\n Quill.sources.USER,\n );\n } else {\n this.quill.setSelection(\n range.index + range.length + 1,\n Quill.sources.USER,\n );\n }\n return false;\n },\n };\n}\n\nfunction makeFormatHandler(format: string): BindingObject {\n return {\n key: format[0],\n shortKey: true,\n handler(range, context) {\n this.quill.format(format, !context.format[format], Quill.sources.USER);\n },\n };\n}\n\nfunction makeTableArrowHandler(up: boolean): BindingObject {\n return {\n key: up ? 'ArrowUp' : 'ArrowDown',\n collapsed: true,\n format: ['table'],\n handler(range, context) {\n // TODO move to table module\n const key = up ? 'prev' : 'next';\n const cell = context.line;\n const targetRow = cell.parent[key];\n if (targetRow != null) {\n if (targetRow.statics.blotName === 'table-row') {\n // @ts-expect-error\n let targetCell = targetRow.children.head;\n let cur = cell;\n while (cur.prev != null) {\n // @ts-expect-error\n cur = cur.prev;\n targetCell = targetCell.next;\n }\n const index =\n targetCell.offset(this.quill.scroll) +\n Math.min(context.offset, targetCell.length() - 1);\n this.quill.setSelection(index, 0, Quill.sources.USER);\n }\n } else {\n // @ts-expect-error\n const targetLine = cell.table()[key];\n if (targetLine != null) {\n if (up) {\n this.quill.setSelection(\n targetLine.offset(this.quill.scroll) + targetLine.length() - 1,\n 0,\n Quill.sources.USER,\n );\n } else {\n this.quill.setSelection(\n targetLine.offset(this.quill.scroll),\n 0,\n Quill.sources.USER,\n );\n }\n }\n }\n return false;\n },\n };\n}\n\nfunction normalize(binding: Binding): BindingObject | null {\n if (typeof binding === 'string' || typeof binding === 'number') {\n binding = { key: binding };\n } else if (typeof binding === 'object') {\n binding = cloneDeep(binding);\n } else {\n return null;\n }\n if (binding.shortKey) {\n binding[SHORTKEY] = binding.shortKey;\n delete binding.shortKey;\n }\n return binding;\n}\n\n// TODO: Move into quill.ts or editor.ts\nfunction deleteRange({ quill, range }: { quill: Quill; range: Range }) {\n const lines = quill.getLines(range);\n let formats = {};\n if (lines.length > 1) {\n const firstFormats = lines[0].formats();\n const lastFormats = lines[lines.length - 1].formats();\n formats = AttributeMap.diff(lastFormats, firstFormats) || {};\n }\n quill.deleteText(range, Quill.sources.USER);\n if (Object.keys(formats).length > 0) {\n quill.formatLine(range.index, 1, formats, Quill.sources.USER);\n }\n quill.setSelection(range.index, Quill.sources.SILENT);\n}\n\nfunction tableSide(_table: unknown, row: Blot, cell: Blot, offset: number) {\n if (row.prev == null && row.next == null) {\n if (cell.prev == null && cell.next == null) {\n return offset === 0 ? -1 : 1;\n }\n return cell.prev == null ? -1 : 1;\n }\n if (row.prev == null) {\n return -1;\n }\n if (row.next == null) {\n return 1;\n }\n return null;\n}\n\nexport { Keyboard as default, SHORTKEY, normalize, deleteRange };\n","'use strict';\n\nvar has = Object.prototype.hasOwnProperty\n , prefix = '~';\n\n/**\n * Constructor to create a storage for our `EE` objects.\n * An `Events` instance is a plain object whose properties are event names.\n *\n * @constructor\n * @private\n */\nfunction Events() {}\n\n//\n// We try to not inherit from `Object.prototype`. In some engines creating an\n// instance in this way is faster than calling `Object.create(null)` directly.\n// If `Object.create(null)` is not supported we prefix the event names with a\n// character to make sure that the built-in object properties are not\n// overridden or used as an attack vector.\n//\nif (Object.create) {\n Events.prototype = Object.create(null);\n\n //\n // This hack is needed because the `__proto__` property is still inherited in\n // some old browsers like Android 4, iPhone 5.1, Opera 11 and Safari 5.\n //\n if (!new Events().__proto__) prefix = false;\n}\n\n/**\n * Representation of a single event listener.\n *\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} [once=false] Specify if the listener is a one-time listener.\n * @constructor\n * @private\n */\nfunction EE(fn, context, once) {\n this.fn = fn;\n this.context = context;\n this.once = once || false;\n}\n\n/**\n * Add a listener for a given event.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} once Specify if the listener is a one-time listener.\n * @returns {EventEmitter}\n * @private\n */\nfunction addListener(emitter, event, fn, context, once) {\n if (typeof fn !== 'function') {\n throw new TypeError('The listener must be a function');\n }\n\n var listener = new EE(fn, context || emitter, once)\n , evt = prefix ? prefix + event : event;\n\n if (!emitter._events[evt]) emitter._events[evt] = listener, emitter._eventsCount++;\n else if (!emitter._events[evt].fn) emitter._events[evt].push(listener);\n else emitter._events[evt] = [emitter._events[evt], listener];\n\n return emitter;\n}\n\n/**\n * Clear event by name.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} evt The Event name.\n * @private\n */\nfunction clearEvent(emitter, evt) {\n if (--emitter._eventsCount === 0) emitter._events = new Events();\n else delete emitter._events[evt];\n}\n\n/**\n * Minimal `EventEmitter` interface that is molded against the Node.js\n * `EventEmitter` interface.\n *\n * @constructor\n * @public\n */\nfunction EventEmitter() {\n this._events = new Events();\n this._eventsCount = 0;\n}\n\n/**\n * Return an array listing the events for which the emitter has registered\n * listeners.\n *\n * @returns {Array}\n * @public\n */\nEventEmitter.prototype.eventNames = function eventNames() {\n var names = []\n , events\n , name;\n\n if (this._eventsCount === 0) return names;\n\n for (name in (events = this._events)) {\n if (has.call(events, name)) names.push(prefix ? name.slice(1) : name);\n }\n\n if (Object.getOwnPropertySymbols) {\n return names.concat(Object.getOwnPropertySymbols(events));\n }\n\n return names;\n};\n\n/**\n * Return the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Array} The registered listeners.\n * @public\n */\nEventEmitter.prototype.listeners = function listeners(event) {\n var evt = prefix ? prefix + event : event\n , handlers = this._events[evt];\n\n if (!handlers) return [];\n if (handlers.fn) return [handlers.fn];\n\n for (var i = 0, l = handlers.length, ee = new Array(l); i < l; i++) {\n ee[i] = handlers[i].fn;\n }\n\n return ee;\n};\n\n/**\n * Return the number of listeners listening to a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Number} The number of listeners.\n * @public\n */\nEventEmitter.prototype.listenerCount = function listenerCount(event) {\n var evt = prefix ? prefix + event : event\n , listeners = this._events[evt];\n\n if (!listeners) return 0;\n if (listeners.fn) return 1;\n return listeners.length;\n};\n\n/**\n * Calls each of the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Boolean} `true` if the event had listeners, else `false`.\n * @public\n */\nEventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {\n var evt = prefix ? prefix + event : event;\n\n if (!this._events[evt]) return false;\n\n var listeners = this._events[evt]\n , len = arguments.length\n , args\n , i;\n\n if (listeners.fn) {\n if (listeners.once) this.removeListener(event, listeners.fn, undefined, true);\n\n switch (len) {\n case 1: return listeners.fn.call(listeners.context), true;\n case 2: return listeners.fn.call(listeners.context, a1), true;\n case 3: return listeners.fn.call(listeners.context, a1, a2), true;\n case 4: return listeners.fn.call(listeners.context, a1, a2, a3), true;\n case 5: return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;\n case 6: return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;\n }\n\n for (i = 1, args = new Array(len -1); i < len; i++) {\n args[i - 1] = arguments[i];\n }\n\n listeners.fn.apply(listeners.context, args);\n } else {\n var length = listeners.length\n , j;\n\n for (i = 0; i < length; i++) {\n if (listeners[i].once) this.removeListener(event, listeners[i].fn, undefined, true);\n\n switch (len) {\n case 1: listeners[i].fn.call(listeners[i].context); break;\n case 2: listeners[i].fn.call(listeners[i].context, a1); break;\n case 3: listeners[i].fn.call(listeners[i].context, a1, a2); break;\n case 4: listeners[i].fn.call(listeners[i].context, a1, a2, a3); break;\n default:\n if (!args) for (j = 1, args = new Array(len -1); j < len; j++) {\n args[j - 1] = arguments[j];\n }\n\n listeners[i].fn.apply(listeners[i].context, args);\n }\n }\n }\n\n return true;\n};\n\n/**\n * Add a listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.on = function on(event, fn, context) {\n return addListener(this, event, fn, context, false);\n};\n\n/**\n * Add a one-time listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.once = function once(event, fn, context) {\n return addListener(this, event, fn, context, true);\n};\n\n/**\n * Remove the listeners of a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn Only remove the listeners that match this function.\n * @param {*} context Only remove the listeners that have this context.\n * @param {Boolean} once Only remove one-time listeners.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) {\n var evt = prefix ? prefix + event : event;\n\n if (!this._events[evt]) return this;\n if (!fn) {\n clearEvent(this, evt);\n return this;\n }\n\n var listeners = this._events[evt];\n\n if (listeners.fn) {\n if (\n listeners.fn === fn &&\n (!once || listeners.once) &&\n (!context || listeners.context === context)\n ) {\n clearEvent(this, evt);\n }\n } else {\n for (var i = 0, events = [], length = listeners.length; i < length; i++) {\n if (\n listeners[i].fn !== fn ||\n (once && !listeners[i].once) ||\n (context && listeners[i].context !== context)\n ) {\n events.push(listeners[i]);\n }\n }\n\n //\n // Reset the array, or remove it completely if we have no more listeners.\n //\n if (events.length) this._events[evt] = events.length === 1 ? events[0] : events;\n else clearEvent(this, evt);\n }\n\n return this;\n};\n\n/**\n * Remove all listeners, or those of the specified event.\n *\n * @param {(String|Symbol)} [event] The event name.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeAllListeners = function removeAllListeners(event) {\n var evt;\n\n if (event) {\n evt = prefix ? prefix + event : event;\n if (this._events[evt]) clearEvent(this, evt);\n } else {\n this._events = new Events();\n this._eventsCount = 0;\n }\n\n return this;\n};\n\n//\n// Alias methods names because people roll like that.\n//\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\nEventEmitter.prototype.addListener = EventEmitter.prototype.on;\n\n//\n// Expose the prefix.\n//\nEventEmitter.prefixed = prefix;\n\n//\n// Allow `EventEmitter` to be imported as module namespace.\n//\nEventEmitter.EventEmitter = EventEmitter;\n\n//\n// Expose the module.\n//\nif ('undefined' !== typeof module) {\n module.exports = EventEmitter;\n}\n","/**\n * This library modifies the diff-patch-match library by Neil Fraser\n * by removing the patch and match functionality and certain advanced\n * options in the diff function. The original license is as follows:\n *\n * ===\n *\n * Diff Match and Patch\n *\n * Copyright 2006 Google Inc.\n * http://code.google.com/p/google-diff-match-patch/\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * The data structure representing a diff is an array of tuples:\n * [[DIFF_DELETE, 'Hello'], [DIFF_INSERT, 'Goodbye'], [DIFF_EQUAL, ' world.']]\n * which means: delete 'Hello', add 'Goodbye' and keep ' world.'\n */\nvar DIFF_DELETE = -1;\nvar DIFF_INSERT = 1;\nvar DIFF_EQUAL = 0;\n\n/**\n * Find the differences between two texts. Simplifies the problem by stripping\n * any common prefix or suffix off the texts before diffing.\n * @param {string} text1 Old string to be diffed.\n * @param {string} text2 New string to be diffed.\n * @param {Int|Object} [cursor_pos] Edit position in text1 or object with more info\n * @param {boolean} [cleanup] Apply semantic cleanup before returning.\n * @return {Array} Array of diff tuples.\n */\nfunction diff_main(text1, text2, cursor_pos, cleanup, _fix_unicode) {\n // Check for equality\n if (text1 === text2) {\n if (text1) {\n return [[DIFF_EQUAL, text1]];\n }\n return [];\n }\n\n if (cursor_pos != null) {\n var editdiff = find_cursor_edit_diff(text1, text2, cursor_pos);\n if (editdiff) {\n return editdiff;\n }\n }\n\n // Trim off common prefix (speedup).\n var commonlength = diff_commonPrefix(text1, text2);\n var commonprefix = text1.substring(0, commonlength);\n text1 = text1.substring(commonlength);\n text2 = text2.substring(commonlength);\n\n // Trim off common suffix (speedup).\n commonlength = diff_commonSuffix(text1, text2);\n var commonsuffix = text1.substring(text1.length - commonlength);\n text1 = text1.substring(0, text1.length - commonlength);\n text2 = text2.substring(0, text2.length - commonlength);\n\n // Compute the diff on the middle block.\n var diffs = diff_compute_(text1, text2);\n\n // Restore the prefix and suffix.\n if (commonprefix) {\n diffs.unshift([DIFF_EQUAL, commonprefix]);\n }\n if (commonsuffix) {\n diffs.push([DIFF_EQUAL, commonsuffix]);\n }\n diff_cleanupMerge(diffs, _fix_unicode);\n if (cleanup) {\n diff_cleanupSemantic(diffs);\n }\n return diffs;\n}\n\n/**\n * Find the differences between two texts. Assumes that the texts do not\n * have any common prefix or suffix.\n * @param {string} text1 Old string to be diffed.\n * @param {string} text2 New string to be diffed.\n * @return {Array} Array of diff tuples.\n */\nfunction diff_compute_(text1, text2) {\n var diffs;\n\n if (!text1) {\n // Just add some text (speedup).\n return [[DIFF_INSERT, text2]];\n }\n\n if (!text2) {\n // Just delete some text (speedup).\n return [[DIFF_DELETE, text1]];\n }\n\n var longtext = text1.length > text2.length ? text1 : text2;\n var shorttext = text1.length > text2.length ? text2 : text1;\n var i = longtext.indexOf(shorttext);\n if (i !== -1) {\n // Shorter text is inside the longer text (speedup).\n diffs = [\n [DIFF_INSERT, longtext.substring(0, i)],\n [DIFF_EQUAL, shorttext],\n [DIFF_INSERT, longtext.substring(i + shorttext.length)],\n ];\n // Swap insertions for deletions if diff is reversed.\n if (text1.length > text2.length) {\n diffs[0][0] = diffs[2][0] = DIFF_DELETE;\n }\n return diffs;\n }\n\n if (shorttext.length === 1) {\n // Single character string.\n // After the previous speedup, the character can't be an equality.\n return [\n [DIFF_DELETE, text1],\n [DIFF_INSERT, text2],\n ];\n }\n\n // Check to see if the problem can be split in two.\n var hm = diff_halfMatch_(text1, text2);\n if (hm) {\n // A half-match was found, sort out the return data.\n var text1_a = hm[0];\n var text1_b = hm[1];\n var text2_a = hm[2];\n var text2_b = hm[3];\n var mid_common = hm[4];\n // Send both pairs off for separate processing.\n var diffs_a = diff_main(text1_a, text2_a);\n var diffs_b = diff_main(text1_b, text2_b);\n // Merge the results.\n return diffs_a.concat([[DIFF_EQUAL, mid_common]], diffs_b);\n }\n\n return diff_bisect_(text1, text2);\n}\n\n/**\n * Find the 'middle snake' of a diff, split the problem in two\n * and return the recursively constructed diff.\n * See Myers 1986 paper: An O(ND) Difference Algorithm and Its Variations.\n * @param {string} text1 Old string to be diffed.\n * @param {string} text2 New string to be diffed.\n * @return {Array} Array of diff tuples.\n * @private\n */\nfunction diff_bisect_(text1, text2) {\n // Cache the text lengths to prevent multiple calls.\n var text1_length = text1.length;\n var text2_length = text2.length;\n var max_d = Math.ceil((text1_length + text2_length) / 2);\n var v_offset = max_d;\n var v_length = 2 * max_d;\n var v1 = new Array(v_length);\n var v2 = new Array(v_length);\n // Setting all elements to -1 is faster in Chrome & Firefox than mixing\n // integers and undefined.\n for (var x = 0; x < v_length; x++) {\n v1[x] = -1;\n v2[x] = -1;\n }\n v1[v_offset + 1] = 0;\n v2[v_offset + 1] = 0;\n var delta = text1_length - text2_length;\n // If the total number of characters is odd, then the front path will collide\n // with the reverse path.\n var front = delta % 2 !== 0;\n // Offsets for start and end of k loop.\n // Prevents mapping of space beyond the grid.\n var k1start = 0;\n var k1end = 0;\n var k2start = 0;\n var k2end = 0;\n for (var d = 0; d < max_d; d++) {\n // Walk the front path one step.\n for (var k1 = -d + k1start; k1 <= d - k1end; k1 += 2) {\n var k1_offset = v_offset + k1;\n var x1;\n if (k1 === -d || (k1 !== d && v1[k1_offset - 1] < v1[k1_offset + 1])) {\n x1 = v1[k1_offset + 1];\n } else {\n x1 = v1[k1_offset - 1] + 1;\n }\n var y1 = x1 - k1;\n while (\n x1 < text1_length &&\n y1 < text2_length &&\n text1.charAt(x1) === text2.charAt(y1)\n ) {\n x1++;\n y1++;\n }\n v1[k1_offset] = x1;\n if (x1 > text1_length) {\n // Ran off the right of the graph.\n k1end += 2;\n } else if (y1 > text2_length) {\n // Ran off the bottom of the graph.\n k1start += 2;\n } else if (front) {\n var k2_offset = v_offset + delta - k1;\n if (k2_offset >= 0 && k2_offset < v_length && v2[k2_offset] !== -1) {\n // Mirror x2 onto top-left coordinate system.\n var x2 = text1_length - v2[k2_offset];\n if (x1 >= x2) {\n // Overlap detected.\n return diff_bisectSplit_(text1, text2, x1, y1);\n }\n }\n }\n }\n\n // Walk the reverse path one step.\n for (var k2 = -d + k2start; k2 <= d - k2end; k2 += 2) {\n var k2_offset = v_offset + k2;\n var x2;\n if (k2 === -d || (k2 !== d && v2[k2_offset - 1] < v2[k2_offset + 1])) {\n x2 = v2[k2_offset + 1];\n } else {\n x2 = v2[k2_offset - 1] + 1;\n }\n var y2 = x2 - k2;\n while (\n x2 < text1_length &&\n y2 < text2_length &&\n text1.charAt(text1_length - x2 - 1) ===\n text2.charAt(text2_length - y2 - 1)\n ) {\n x2++;\n y2++;\n }\n v2[k2_offset] = x2;\n if (x2 > text1_length) {\n // Ran off the left of the graph.\n k2end += 2;\n } else if (y2 > text2_length) {\n // Ran off the top of the graph.\n k2start += 2;\n } else if (!front) {\n var k1_offset = v_offset + delta - k2;\n if (k1_offset >= 0 && k1_offset < v_length && v1[k1_offset] !== -1) {\n var x1 = v1[k1_offset];\n var y1 = v_offset + x1 - k1_offset;\n // Mirror x2 onto top-left coordinate system.\n x2 = text1_length - x2;\n if (x1 >= x2) {\n // Overlap detected.\n return diff_bisectSplit_(text1, text2, x1, y1);\n }\n }\n }\n }\n }\n // Diff took too long and hit the deadline or\n // number of diffs equals number of characters, no commonality at all.\n return [\n [DIFF_DELETE, text1],\n [DIFF_INSERT, text2],\n ];\n}\n\n/**\n * Given the location of the 'middle snake', split the diff in two parts\n * and recurse.\n * @param {string} text1 Old string to be diffed.\n * @param {string} text2 New string to be diffed.\n * @param {number} x Index of split point in text1.\n * @param {number} y Index of split point in text2.\n * @return {Array} Array of diff tuples.\n */\nfunction diff_bisectSplit_(text1, text2, x, y) {\n var text1a = text1.substring(0, x);\n var text2a = text2.substring(0, y);\n var text1b = text1.substring(x);\n var text2b = text2.substring(y);\n\n // Compute both diffs serially.\n var diffs = diff_main(text1a, text2a);\n var diffsb = diff_main(text1b, text2b);\n\n return diffs.concat(diffsb);\n}\n\n/**\n * Determine the common prefix of two strings.\n * @param {string} text1 First string.\n * @param {string} text2 Second string.\n * @return {number} The number of characters common to the start of each\n * string.\n */\nfunction diff_commonPrefix(text1, text2) {\n // Quick check for common null cases.\n if (!text1 || !text2 || text1.charAt(0) !== text2.charAt(0)) {\n return 0;\n }\n // Binary search.\n // Performance analysis: http://neil.fraser.name/news/2007/10/09/\n var pointermin = 0;\n var pointermax = Math.min(text1.length, text2.length);\n var pointermid = pointermax;\n var pointerstart = 0;\n while (pointermin < pointermid) {\n if (\n text1.substring(pointerstart, pointermid) ==\n text2.substring(pointerstart, pointermid)\n ) {\n pointermin = pointermid;\n pointerstart = pointermin;\n } else {\n pointermax = pointermid;\n }\n pointermid = Math.floor((pointermax - pointermin) / 2 + pointermin);\n }\n\n if (is_surrogate_pair_start(text1.charCodeAt(pointermid - 1))) {\n pointermid--;\n }\n\n return pointermid;\n}\n\n/**\n * Determine if the suffix of one string is the prefix of another.\n * @param {string} text1 First string.\n * @param {string} text2 Second string.\n * @return {number} The number of characters common to the end of the first\n * string and the start of the second string.\n * @private\n */\nfunction diff_commonOverlap_(text1, text2) {\n // Cache the text lengths to prevent multiple calls.\n var text1_length = text1.length;\n var text2_length = text2.length;\n // Eliminate the null case.\n if (text1_length == 0 || text2_length == 0) {\n return 0;\n }\n // Truncate the longer string.\n if (text1_length > text2_length) {\n text1 = text1.substring(text1_length - text2_length);\n } else if (text1_length < text2_length) {\n text2 = text2.substring(0, text1_length);\n }\n var text_length = Math.min(text1_length, text2_length);\n // Quick check for the worst case.\n if (text1 == text2) {\n return text_length;\n }\n\n // Start by looking for a single character match\n // and increase length until no match is found.\n // Performance analysis: http://neil.fraser.name/news/2010/11/04/\n var best = 0;\n var length = 1;\n while (true) {\n var pattern = text1.substring(text_length - length);\n var found = text2.indexOf(pattern);\n if (found == -1) {\n return best;\n }\n length += found;\n if (\n found == 0 ||\n text1.substring(text_length - length) == text2.substring(0, length)\n ) {\n best = length;\n length++;\n }\n }\n}\n\n/**\n * Determine the common suffix of two strings.\n * @param {string} text1 First string.\n * @param {string} text2 Second string.\n * @return {number} The number of characters common to the end of each string.\n */\nfunction diff_commonSuffix(text1, text2) {\n // Quick check for common null cases.\n if (!text1 || !text2 || text1.slice(-1) !== text2.slice(-1)) {\n return 0;\n }\n // Binary search.\n // Performance analysis: http://neil.fraser.name/news/2007/10/09/\n var pointermin = 0;\n var pointermax = Math.min(text1.length, text2.length);\n var pointermid = pointermax;\n var pointerend = 0;\n while (pointermin < pointermid) {\n if (\n text1.substring(text1.length - pointermid, text1.length - pointerend) ==\n text2.substring(text2.length - pointermid, text2.length - pointerend)\n ) {\n pointermin = pointermid;\n pointerend = pointermin;\n } else {\n pointermax = pointermid;\n }\n pointermid = Math.floor((pointermax - pointermin) / 2 + pointermin);\n }\n\n if (is_surrogate_pair_end(text1.charCodeAt(text1.length - pointermid))) {\n pointermid--;\n }\n\n return pointermid;\n}\n\n/**\n * Do the two texts share a substring which is at least half the length of the\n * longer text?\n * This speedup can produce non-minimal diffs.\n * @param {string} text1 First string.\n * @param {string} text2 Second string.\n * @return {Array.} Five element Array, containing the prefix of\n * text1, the suffix of text1, the prefix of text2, the suffix of\n * text2 and the common middle. Or null if there was no match.\n */\nfunction diff_halfMatch_(text1, text2) {\n var longtext = text1.length > text2.length ? text1 : text2;\n var shorttext = text1.length > text2.length ? text2 : text1;\n if (longtext.length < 4 || shorttext.length * 2 < longtext.length) {\n return null; // Pointless.\n }\n\n /**\n * Does a substring of shorttext exist within longtext such that the substring\n * is at least half the length of longtext?\n * Closure, but does not reference any external variables.\n * @param {string} longtext Longer string.\n * @param {string} shorttext Shorter string.\n * @param {number} i Start index of quarter length substring within longtext.\n * @return {Array.} Five element Array, containing the prefix of\n * longtext, the suffix of longtext, the prefix of shorttext, the suffix\n * of shorttext and the common middle. Or null if there was no match.\n * @private\n */\n function diff_halfMatchI_(longtext, shorttext, i) {\n // Start with a 1/4 length substring at position i as a seed.\n var seed = longtext.substring(i, i + Math.floor(longtext.length / 4));\n var j = -1;\n var best_common = \"\";\n var best_longtext_a, best_longtext_b, best_shorttext_a, best_shorttext_b;\n while ((j = shorttext.indexOf(seed, j + 1)) !== -1) {\n var prefixLength = diff_commonPrefix(\n longtext.substring(i),\n shorttext.substring(j)\n );\n var suffixLength = diff_commonSuffix(\n longtext.substring(0, i),\n shorttext.substring(0, j)\n );\n if (best_common.length < suffixLength + prefixLength) {\n best_common =\n shorttext.substring(j - suffixLength, j) +\n shorttext.substring(j, j + prefixLength);\n best_longtext_a = longtext.substring(0, i - suffixLength);\n best_longtext_b = longtext.substring(i + prefixLength);\n best_shorttext_a = shorttext.substring(0, j - suffixLength);\n best_shorttext_b = shorttext.substring(j + prefixLength);\n }\n }\n if (best_common.length * 2 >= longtext.length) {\n return [\n best_longtext_a,\n best_longtext_b,\n best_shorttext_a,\n best_shorttext_b,\n best_common,\n ];\n } else {\n return null;\n }\n }\n\n // First check if the second quarter is the seed for a half-match.\n var hm1 = diff_halfMatchI_(\n longtext,\n shorttext,\n Math.ceil(longtext.length / 4)\n );\n // Check again based on the third quarter.\n var hm2 = diff_halfMatchI_(\n longtext,\n shorttext,\n Math.ceil(longtext.length / 2)\n );\n var hm;\n if (!hm1 && !hm2) {\n return null;\n } else if (!hm2) {\n hm = hm1;\n } else if (!hm1) {\n hm = hm2;\n } else {\n // Both matched. Select the longest.\n hm = hm1[4].length > hm2[4].length ? hm1 : hm2;\n }\n\n // A half-match was found, sort out the return data.\n var text1_a, text1_b, text2_a, text2_b;\n if (text1.length > text2.length) {\n text1_a = hm[0];\n text1_b = hm[1];\n text2_a = hm[2];\n text2_b = hm[3];\n } else {\n text2_a = hm[0];\n text2_b = hm[1];\n text1_a = hm[2];\n text1_b = hm[3];\n }\n var mid_common = hm[4];\n return [text1_a, text1_b, text2_a, text2_b, mid_common];\n}\n\n/**\n * Reduce the number of edits by eliminating semantically trivial equalities.\n * @param {!Array.} diffs Array of diff tuples.\n */\nfunction diff_cleanupSemantic(diffs) {\n var changes = false;\n var equalities = []; // Stack of indices where equalities are found.\n var equalitiesLength = 0; // Keeping our own length var is faster in JS.\n /** @type {?string} */\n var lastequality = null;\n // Always equal to diffs[equalities[equalitiesLength - 1]][1]\n var pointer = 0; // Index of current position.\n // Number of characters that changed prior to the equality.\n var length_insertions1 = 0;\n var length_deletions1 = 0;\n // Number of characters that changed after the equality.\n var length_insertions2 = 0;\n var length_deletions2 = 0;\n while (pointer < diffs.length) {\n if (diffs[pointer][0] == DIFF_EQUAL) {\n // Equality found.\n equalities[equalitiesLength++] = pointer;\n length_insertions1 = length_insertions2;\n length_deletions1 = length_deletions2;\n length_insertions2 = 0;\n length_deletions2 = 0;\n lastequality = diffs[pointer][1];\n } else {\n // An insertion or deletion.\n if (diffs[pointer][0] == DIFF_INSERT) {\n length_insertions2 += diffs[pointer][1].length;\n } else {\n length_deletions2 += diffs[pointer][1].length;\n }\n // Eliminate an equality that is smaller or equal to the edits on both\n // sides of it.\n if (\n lastequality &&\n lastequality.length <=\n Math.max(length_insertions1, length_deletions1) &&\n lastequality.length <= Math.max(length_insertions2, length_deletions2)\n ) {\n // Duplicate record.\n diffs.splice(equalities[equalitiesLength - 1], 0, [\n DIFF_DELETE,\n lastequality,\n ]);\n // Change second copy to insert.\n diffs[equalities[equalitiesLength - 1] + 1][0] = DIFF_INSERT;\n // Throw away the equality we just deleted.\n equalitiesLength--;\n // Throw away the previous equality (it needs to be reevaluated).\n equalitiesLength--;\n pointer = equalitiesLength > 0 ? equalities[equalitiesLength - 1] : -1;\n length_insertions1 = 0; // Reset the counters.\n length_deletions1 = 0;\n length_insertions2 = 0;\n length_deletions2 = 0;\n lastequality = null;\n changes = true;\n }\n }\n pointer++;\n }\n\n // Normalize the diff.\n if (changes) {\n diff_cleanupMerge(diffs);\n }\n diff_cleanupSemanticLossless(diffs);\n\n // Find any overlaps between deletions and insertions.\n // e.g: abcxxxxxxdef\n // -> abcxxxdef\n // e.g: xxxabcdefxxx\n // -> defxxxabc\n // Only extract an overlap if it is as big as the edit ahead or behind it.\n pointer = 1;\n while (pointer < diffs.length) {\n if (\n diffs[pointer - 1][0] == DIFF_DELETE &&\n diffs[pointer][0] == DIFF_INSERT\n ) {\n var deletion = diffs[pointer - 1][1];\n var insertion = diffs[pointer][1];\n var overlap_length1 = diff_commonOverlap_(deletion, insertion);\n var overlap_length2 = diff_commonOverlap_(insertion, deletion);\n if (overlap_length1 >= overlap_length2) {\n if (\n overlap_length1 >= deletion.length / 2 ||\n overlap_length1 >= insertion.length / 2\n ) {\n // Overlap found. Insert an equality and trim the surrounding edits.\n diffs.splice(pointer, 0, [\n DIFF_EQUAL,\n insertion.substring(0, overlap_length1),\n ]);\n diffs[pointer - 1][1] = deletion.substring(\n 0,\n deletion.length - overlap_length1\n );\n diffs[pointer + 1][1] = insertion.substring(overlap_length1);\n pointer++;\n }\n } else {\n if (\n overlap_length2 >= deletion.length / 2 ||\n overlap_length2 >= insertion.length / 2\n ) {\n // Reverse overlap found.\n // Insert an equality and swap and trim the surrounding edits.\n diffs.splice(pointer, 0, [\n DIFF_EQUAL,\n deletion.substring(0, overlap_length2),\n ]);\n diffs[pointer - 1][0] = DIFF_INSERT;\n diffs[pointer - 1][1] = insertion.substring(\n 0,\n insertion.length - overlap_length2\n );\n diffs[pointer + 1][0] = DIFF_DELETE;\n diffs[pointer + 1][1] = deletion.substring(overlap_length2);\n pointer++;\n }\n }\n pointer++;\n }\n pointer++;\n }\n}\n\nvar nonAlphaNumericRegex_ = /[^a-zA-Z0-9]/;\nvar whitespaceRegex_ = /\\s/;\nvar linebreakRegex_ = /[\\r\\n]/;\nvar blanklineEndRegex_ = /\\n\\r?\\n$/;\nvar blanklineStartRegex_ = /^\\r?\\n\\r?\\n/;\n\n/**\n * Look for single edits surrounded on both sides by equalities\n * which can be shifted sideways to align the edit to a word boundary.\n * e.g: The cat came. -> The cat came.\n * @param {!Array.} diffs Array of diff tuples.\n */\nfunction diff_cleanupSemanticLossless(diffs) {\n /**\n * Given two strings, compute a score representing whether the internal\n * boundary falls on logical boundaries.\n * Scores range from 6 (best) to 0 (worst).\n * Closure, but does not reference any external variables.\n * @param {string} one First string.\n * @param {string} two Second string.\n * @return {number} The score.\n * @private\n */\n function diff_cleanupSemanticScore_(one, two) {\n if (!one || !two) {\n // Edges are the best.\n return 6;\n }\n\n // Each port of this function behaves slightly differently due to\n // subtle differences in each language's definition of things like\n // 'whitespace'. Since this function's purpose is largely cosmetic,\n // the choice has been made to use each language's native features\n // rather than force total conformity.\n var char1 = one.charAt(one.length - 1);\n var char2 = two.charAt(0);\n var nonAlphaNumeric1 = char1.match(nonAlphaNumericRegex_);\n var nonAlphaNumeric2 = char2.match(nonAlphaNumericRegex_);\n var whitespace1 = nonAlphaNumeric1 && char1.match(whitespaceRegex_);\n var whitespace2 = nonAlphaNumeric2 && char2.match(whitespaceRegex_);\n var lineBreak1 = whitespace1 && char1.match(linebreakRegex_);\n var lineBreak2 = whitespace2 && char2.match(linebreakRegex_);\n var blankLine1 = lineBreak1 && one.match(blanklineEndRegex_);\n var blankLine2 = lineBreak2 && two.match(blanklineStartRegex_);\n\n if (blankLine1 || blankLine2) {\n // Five points for blank lines.\n return 5;\n } else if (lineBreak1 || lineBreak2) {\n // Four points for line breaks.\n return 4;\n } else if (nonAlphaNumeric1 && !whitespace1 && whitespace2) {\n // Three points for end of sentences.\n return 3;\n } else if (whitespace1 || whitespace2) {\n // Two points for whitespace.\n return 2;\n } else if (nonAlphaNumeric1 || nonAlphaNumeric2) {\n // One point for non-alphanumeric.\n return 1;\n }\n return 0;\n }\n\n var pointer = 1;\n // Intentionally ignore the first and last element (don't need checking).\n while (pointer < diffs.length - 1) {\n if (\n diffs[pointer - 1][0] == DIFF_EQUAL &&\n diffs[pointer + 1][0] == DIFF_EQUAL\n ) {\n // This is a single edit surrounded by equalities.\n var equality1 = diffs[pointer - 1][1];\n var edit = diffs[pointer][1];\n var equality2 = diffs[pointer + 1][1];\n\n // First, shift the edit as far left as possible.\n var commonOffset = diff_commonSuffix(equality1, edit);\n if (commonOffset) {\n var commonString = edit.substring(edit.length - commonOffset);\n equality1 = equality1.substring(0, equality1.length - commonOffset);\n edit = commonString + edit.substring(0, edit.length - commonOffset);\n equality2 = commonString + equality2;\n }\n\n // Second, step character by character right, looking for the best fit.\n var bestEquality1 = equality1;\n var bestEdit = edit;\n var bestEquality2 = equality2;\n var bestScore =\n diff_cleanupSemanticScore_(equality1, edit) +\n diff_cleanupSemanticScore_(edit, equality2);\n while (edit.charAt(0) === equality2.charAt(0)) {\n equality1 += edit.charAt(0);\n edit = edit.substring(1) + equality2.charAt(0);\n equality2 = equality2.substring(1);\n var score =\n diff_cleanupSemanticScore_(equality1, edit) +\n diff_cleanupSemanticScore_(edit, equality2);\n // The >= encourages trailing rather than leading whitespace on edits.\n if (score >= bestScore) {\n bestScore = score;\n bestEquality1 = equality1;\n bestEdit = edit;\n bestEquality2 = equality2;\n }\n }\n\n if (diffs[pointer - 1][1] != bestEquality1) {\n // We have an improvement, save it back to the diff.\n if (bestEquality1) {\n diffs[pointer - 1][1] = bestEquality1;\n } else {\n diffs.splice(pointer - 1, 1);\n pointer--;\n }\n diffs[pointer][1] = bestEdit;\n if (bestEquality2) {\n diffs[pointer + 1][1] = bestEquality2;\n } else {\n diffs.splice(pointer + 1, 1);\n pointer--;\n }\n }\n }\n pointer++;\n }\n}\n\n/**\n * Reorder and merge like edit sections. Merge equalities.\n * Any edit section can move as long as it doesn't cross an equality.\n * @param {Array} diffs Array of diff tuples.\n * @param {boolean} fix_unicode Whether to normalize to a unicode-correct diff\n */\nfunction diff_cleanupMerge(diffs, fix_unicode) {\n diffs.push([DIFF_EQUAL, \"\"]); // Add a dummy entry at the end.\n var pointer = 0;\n var count_delete = 0;\n var count_insert = 0;\n var text_delete = \"\";\n var text_insert = \"\";\n var commonlength;\n while (pointer < diffs.length) {\n if (pointer < diffs.length - 1 && !diffs[pointer][1]) {\n diffs.splice(pointer, 1);\n continue;\n }\n switch (diffs[pointer][0]) {\n case DIFF_INSERT:\n count_insert++;\n text_insert += diffs[pointer][1];\n pointer++;\n break;\n case DIFF_DELETE:\n count_delete++;\n text_delete += diffs[pointer][1];\n pointer++;\n break;\n case DIFF_EQUAL:\n var previous_equality = pointer - count_insert - count_delete - 1;\n if (fix_unicode) {\n // prevent splitting of unicode surrogate pairs. when fix_unicode is true,\n // we assume that the old and new text in the diff are complete and correct\n // unicode-encoded JS strings, but the tuple boundaries may fall between\n // surrogate pairs. we fix this by shaving off stray surrogates from the end\n // of the previous equality and the beginning of this equality. this may create\n // empty equalities or a common prefix or suffix. for example, if AB and AC are\n // emojis, `[[0, 'A'], [-1, 'BA'], [0, 'C']]` would turn into deleting 'ABAC' and\n // inserting 'AC', and then the common suffix 'AC' will be eliminated. in this\n // particular case, both equalities go away, we absorb any previous inequalities,\n // and we keep scanning for the next equality before rewriting the tuples.\n if (\n previous_equality >= 0 &&\n ends_with_pair_start(diffs[previous_equality][1])\n ) {\n var stray = diffs[previous_equality][1].slice(-1);\n diffs[previous_equality][1] = diffs[previous_equality][1].slice(\n 0,\n -1\n );\n text_delete = stray + text_delete;\n text_insert = stray + text_insert;\n if (!diffs[previous_equality][1]) {\n // emptied out previous equality, so delete it and include previous delete/insert\n diffs.splice(previous_equality, 1);\n pointer--;\n var k = previous_equality - 1;\n if (diffs[k] && diffs[k][0] === DIFF_INSERT) {\n count_insert++;\n text_insert = diffs[k][1] + text_insert;\n k--;\n }\n if (diffs[k] && diffs[k][0] === DIFF_DELETE) {\n count_delete++;\n text_delete = diffs[k][1] + text_delete;\n k--;\n }\n previous_equality = k;\n }\n }\n if (starts_with_pair_end(diffs[pointer][1])) {\n var stray = diffs[pointer][1].charAt(0);\n diffs[pointer][1] = diffs[pointer][1].slice(1);\n text_delete += stray;\n text_insert += stray;\n }\n }\n if (pointer < diffs.length - 1 && !diffs[pointer][1]) {\n // for empty equality not at end, wait for next equality\n diffs.splice(pointer, 1);\n break;\n }\n if (text_delete.length > 0 || text_insert.length > 0) {\n // note that diff_commonPrefix and diff_commonSuffix are unicode-aware\n if (text_delete.length > 0 && text_insert.length > 0) {\n // Factor out any common prefixes.\n commonlength = diff_commonPrefix(text_insert, text_delete);\n if (commonlength !== 0) {\n if (previous_equality >= 0) {\n diffs[previous_equality][1] += text_insert.substring(\n 0,\n commonlength\n );\n } else {\n diffs.splice(0, 0, [\n DIFF_EQUAL,\n text_insert.substring(0, commonlength),\n ]);\n pointer++;\n }\n text_insert = text_insert.substring(commonlength);\n text_delete = text_delete.substring(commonlength);\n }\n // Factor out any common suffixes.\n commonlength = diff_commonSuffix(text_insert, text_delete);\n if (commonlength !== 0) {\n diffs[pointer][1] =\n text_insert.substring(text_insert.length - commonlength) +\n diffs[pointer][1];\n text_insert = text_insert.substring(\n 0,\n text_insert.length - commonlength\n );\n text_delete = text_delete.substring(\n 0,\n text_delete.length - commonlength\n );\n }\n }\n // Delete the offending records and add the merged ones.\n var n = count_insert + count_delete;\n if (text_delete.length === 0 && text_insert.length === 0) {\n diffs.splice(pointer - n, n);\n pointer = pointer - n;\n } else if (text_delete.length === 0) {\n diffs.splice(pointer - n, n, [DIFF_INSERT, text_insert]);\n pointer = pointer - n + 1;\n } else if (text_insert.length === 0) {\n diffs.splice(pointer - n, n, [DIFF_DELETE, text_delete]);\n pointer = pointer - n + 1;\n } else {\n diffs.splice(\n pointer - n,\n n,\n [DIFF_DELETE, text_delete],\n [DIFF_INSERT, text_insert]\n );\n pointer = pointer - n + 2;\n }\n }\n if (pointer !== 0 && diffs[pointer - 1][0] === DIFF_EQUAL) {\n // Merge this equality with the previous one.\n diffs[pointer - 1][1] += diffs[pointer][1];\n diffs.splice(pointer, 1);\n } else {\n pointer++;\n }\n count_insert = 0;\n count_delete = 0;\n text_delete = \"\";\n text_insert = \"\";\n break;\n }\n }\n if (diffs[diffs.length - 1][1] === \"\") {\n diffs.pop(); // Remove the dummy entry at the end.\n }\n\n // Second pass: look for single edits surrounded on both sides by equalities\n // which can be shifted sideways to eliminate an equality.\n // e.g: ABAC -> ABAC\n var changes = false;\n pointer = 1;\n // Intentionally ignore the first and last element (don't need checking).\n while (pointer < diffs.length - 1) {\n if (\n diffs[pointer - 1][0] === DIFF_EQUAL &&\n diffs[pointer + 1][0] === DIFF_EQUAL\n ) {\n // This is a single edit surrounded by equalities.\n if (\n diffs[pointer][1].substring(\n diffs[pointer][1].length - diffs[pointer - 1][1].length\n ) === diffs[pointer - 1][1]\n ) {\n // Shift the edit over the previous equality.\n diffs[pointer][1] =\n diffs[pointer - 1][1] +\n diffs[pointer][1].substring(\n 0,\n diffs[pointer][1].length - diffs[pointer - 1][1].length\n );\n diffs[pointer + 1][1] = diffs[pointer - 1][1] + diffs[pointer + 1][1];\n diffs.splice(pointer - 1, 1);\n changes = true;\n } else if (\n diffs[pointer][1].substring(0, diffs[pointer + 1][1].length) ==\n diffs[pointer + 1][1]\n ) {\n // Shift the edit over the next equality.\n diffs[pointer - 1][1] += diffs[pointer + 1][1];\n diffs[pointer][1] =\n diffs[pointer][1].substring(diffs[pointer + 1][1].length) +\n diffs[pointer + 1][1];\n diffs.splice(pointer + 1, 1);\n changes = true;\n }\n }\n pointer++;\n }\n // If shifts were made, the diff needs reordering and another shift sweep.\n if (changes) {\n diff_cleanupMerge(diffs, fix_unicode);\n }\n}\n\nfunction is_surrogate_pair_start(charCode) {\n return charCode >= 0xd800 && charCode <= 0xdbff;\n}\n\nfunction is_surrogate_pair_end(charCode) {\n return charCode >= 0xdc00 && charCode <= 0xdfff;\n}\n\nfunction starts_with_pair_end(str) {\n return is_surrogate_pair_end(str.charCodeAt(0));\n}\n\nfunction ends_with_pair_start(str) {\n return is_surrogate_pair_start(str.charCodeAt(str.length - 1));\n}\n\nfunction remove_empty_tuples(tuples) {\n var ret = [];\n for (var i = 0; i < tuples.length; i++) {\n if (tuples[i][1].length > 0) {\n ret.push(tuples[i]);\n }\n }\n return ret;\n}\n\nfunction make_edit_splice(before, oldMiddle, newMiddle, after) {\n if (ends_with_pair_start(before) || starts_with_pair_end(after)) {\n return null;\n }\n return remove_empty_tuples([\n [DIFF_EQUAL, before],\n [DIFF_DELETE, oldMiddle],\n [DIFF_INSERT, newMiddle],\n [DIFF_EQUAL, after],\n ]);\n}\n\nfunction find_cursor_edit_diff(oldText, newText, cursor_pos) {\n // note: this runs after equality check has ruled out exact equality\n var oldRange =\n typeof cursor_pos === \"number\"\n ? { index: cursor_pos, length: 0 }\n : cursor_pos.oldRange;\n var newRange = typeof cursor_pos === \"number\" ? null : cursor_pos.newRange;\n // take into account the old and new selection to generate the best diff\n // possible for a text edit. for example, a text change from \"xxx\" to \"xx\"\n // could be a delete or forwards-delete of any one of the x's, or the\n // result of selecting two of the x's and typing \"x\".\n var oldLength = oldText.length;\n var newLength = newText.length;\n if (oldRange.length === 0 && (newRange === null || newRange.length === 0)) {\n // see if we have an insert or delete before or after cursor\n var oldCursor = oldRange.index;\n var oldBefore = oldText.slice(0, oldCursor);\n var oldAfter = oldText.slice(oldCursor);\n var maybeNewCursor = newRange ? newRange.index : null;\n editBefore: {\n // is this an insert or delete right before oldCursor?\n var newCursor = oldCursor + newLength - oldLength;\n if (maybeNewCursor !== null && maybeNewCursor !== newCursor) {\n break editBefore;\n }\n if (newCursor < 0 || newCursor > newLength) {\n break editBefore;\n }\n var newBefore = newText.slice(0, newCursor);\n var newAfter = newText.slice(newCursor);\n if (newAfter !== oldAfter) {\n break editBefore;\n }\n var prefixLength = Math.min(oldCursor, newCursor);\n var oldPrefix = oldBefore.slice(0, prefixLength);\n var newPrefix = newBefore.slice(0, prefixLength);\n if (oldPrefix !== newPrefix) {\n break editBefore;\n }\n var oldMiddle = oldBefore.slice(prefixLength);\n var newMiddle = newBefore.slice(prefixLength);\n return make_edit_splice(oldPrefix, oldMiddle, newMiddle, oldAfter);\n }\n editAfter: {\n // is this an insert or delete right after oldCursor?\n if (maybeNewCursor !== null && maybeNewCursor !== oldCursor) {\n break editAfter;\n }\n var cursor = oldCursor;\n var newBefore = newText.slice(0, cursor);\n var newAfter = newText.slice(cursor);\n if (newBefore !== oldBefore) {\n break editAfter;\n }\n var suffixLength = Math.min(oldLength - cursor, newLength - cursor);\n var oldSuffix = oldAfter.slice(oldAfter.length - suffixLength);\n var newSuffix = newAfter.slice(newAfter.length - suffixLength);\n if (oldSuffix !== newSuffix) {\n break editAfter;\n }\n var oldMiddle = oldAfter.slice(0, oldAfter.length - suffixLength);\n var newMiddle = newAfter.slice(0, newAfter.length - suffixLength);\n return make_edit_splice(oldBefore, oldMiddle, newMiddle, oldSuffix);\n }\n }\n if (oldRange.length > 0 && newRange && newRange.length === 0) {\n replaceRange: {\n // see if diff could be a splice of the old selection range\n var oldPrefix = oldText.slice(0, oldRange.index);\n var oldSuffix = oldText.slice(oldRange.index + oldRange.length);\n var prefixLength = oldPrefix.length;\n var suffixLength = oldSuffix.length;\n if (newLength < prefixLength + suffixLength) {\n break replaceRange;\n }\n var newPrefix = newText.slice(0, prefixLength);\n var newSuffix = newText.slice(newLength - suffixLength);\n if (oldPrefix !== newPrefix || oldSuffix !== newSuffix) {\n break replaceRange;\n }\n var oldMiddle = oldText.slice(prefixLength, oldLength - suffixLength);\n var newMiddle = newText.slice(prefixLength, newLength - suffixLength);\n return make_edit_splice(oldPrefix, oldMiddle, newMiddle, oldSuffix);\n }\n }\n\n return null;\n}\n\nfunction diff(text1, text2, cursor_pos, cleanup) {\n // only pass fix_unicode=true at the top level, not when diff_main is\n // recursively invoked\n return diff_main(text1, text2, cursor_pos, cleanup, true);\n}\n\ndiff.INSERT = DIFF_INSERT;\ndiff.DELETE = DIFF_DELETE;\ndiff.EQUAL = DIFF_EQUAL;\n\nmodule.exports = diff;\n","/**\n * lodash (Custom Build) \n * Build: `lodash modularize exports=\"npm\" -o ./`\n * Copyright jQuery Foundation and other contributors \n * Released under MIT license \n * Based on Underscore.js 1.8.3 \n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n\n/** Used as the size to enable large array optimizations. */\nvar LARGE_ARRAY_SIZE = 200;\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n errorTag = '[object Error]',\n funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n objectTag = '[object Object]',\n promiseTag = '[object Promise]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n symbolTag = '[object Symbol]',\n weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]',\n float32Tag = '[object Float32Array]',\n float64Tag = '[object Float64Array]',\n int8Tag = '[object Int8Array]',\n int16Tag = '[object Int16Array]',\n int32Tag = '[object Int32Array]',\n uint8Tag = '[object Uint8Array]',\n uint8ClampedTag = '[object Uint8ClampedArray]',\n uint16Tag = '[object Uint16Array]',\n uint32Tag = '[object Uint32Array]';\n\n/**\n * Used to match `RegExp`\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n */\nvar reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g;\n\n/** Used to match `RegExp` flags from their coerced string values. */\nvar reFlags = /\\w*$/;\n\n/** Used to detect host constructors (Safari). */\nvar reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n/** Used to detect unsigned integer values. */\nvar reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n/** Used to identify `toStringTag` values supported by `_.clone`. */\nvar cloneableTags = {};\ncloneableTags[argsTag] = cloneableTags[arrayTag] =\ncloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] =\ncloneableTags[boolTag] = cloneableTags[dateTag] =\ncloneableTags[float32Tag] = cloneableTags[float64Tag] =\ncloneableTags[int8Tag] = cloneableTags[int16Tag] =\ncloneableTags[int32Tag] = cloneableTags[mapTag] =\ncloneableTags[numberTag] = cloneableTags[objectTag] =\ncloneableTags[regexpTag] = cloneableTags[setTag] =\ncloneableTags[stringTag] = cloneableTags[symbolTag] =\ncloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] =\ncloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true;\ncloneableTags[errorTag] = cloneableTags[funcTag] =\ncloneableTags[weakMapTag] = false;\n\n/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/**\n * Adds the key-value `pair` to `map`.\n *\n * @private\n * @param {Object} map The map to modify.\n * @param {Array} pair The key-value pair to add.\n * @returns {Object} Returns `map`.\n */\nfunction addMapEntry(map, pair) {\n // Don't return `map.set` because it's not chainable in IE 11.\n map.set(pair[0], pair[1]);\n return map;\n}\n\n/**\n * Adds `value` to `set`.\n *\n * @private\n * @param {Object} set The set to modify.\n * @param {*} value The value to add.\n * @returns {Object} Returns `set`.\n */\nfunction addSetEntry(set, value) {\n // Don't return `set.add` because it's not chainable in IE 11.\n set.add(value);\n return set;\n}\n\n/**\n * A specialized version of `_.forEach` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns `array`.\n */\nfunction arrayEach(array, iteratee) {\n var index = -1,\n length = array ? array.length : 0;\n\n while (++index < length) {\n if (iteratee(array[index], index, array) === false) {\n break;\n }\n }\n return array;\n}\n\n/**\n * Appends the elements of `values` to `array`.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {Array} values The values to append.\n * @returns {Array} Returns `array`.\n */\nfunction arrayPush(array, values) {\n var index = -1,\n length = values.length,\n offset = array.length;\n\n while (++index < length) {\n array[offset + index] = values[index];\n }\n return array;\n}\n\n/**\n * A specialized version of `_.reduce` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {*} [accumulator] The initial value.\n * @param {boolean} [initAccum] Specify using the first element of `array` as\n * the initial value.\n * @returns {*} Returns the accumulated value.\n */\nfunction arrayReduce(array, iteratee, accumulator, initAccum) {\n var index = -1,\n length = array ? array.length : 0;\n\n if (initAccum && length) {\n accumulator = array[++index];\n }\n while (++index < length) {\n accumulator = iteratee(accumulator, array[index], index, array);\n }\n return accumulator;\n}\n\n/**\n * The base implementation of `_.times` without support for iteratee shorthands\n * or max array length checks.\n *\n * @private\n * @param {number} n The number of times to invoke `iteratee`.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the array of results.\n */\nfunction baseTimes(n, iteratee) {\n var index = -1,\n result = Array(n);\n\n while (++index < n) {\n result[index] = iteratee(index);\n }\n return result;\n}\n\n/**\n * Gets the value at `key` of `object`.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\nfunction getValue(object, key) {\n return object == null ? undefined : object[key];\n}\n\n/**\n * Checks if `value` is a host object in IE < 9.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a host object, else `false`.\n */\nfunction isHostObject(value) {\n // Many host objects are `Object` objects that can coerce to strings\n // despite having improperly defined `toString` methods.\n var result = false;\n if (value != null && typeof value.toString != 'function') {\n try {\n result = !!(value + '');\n } catch (e) {}\n }\n return result;\n}\n\n/**\n * Converts `map` to its key-value pairs.\n *\n * @private\n * @param {Object} map The map to convert.\n * @returns {Array} Returns the key-value pairs.\n */\nfunction mapToArray(map) {\n var index = -1,\n result = Array(map.size);\n\n map.forEach(function(value, key) {\n result[++index] = [key, value];\n });\n return result;\n}\n\n/**\n * Creates a unary function that invokes `func` with its argument transformed.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {Function} transform The argument transform.\n * @returns {Function} Returns the new function.\n */\nfunction overArg(func, transform) {\n return function(arg) {\n return func(transform(arg));\n };\n}\n\n/**\n * Converts `set` to an array of its values.\n *\n * @private\n * @param {Object} set The set to convert.\n * @returns {Array} Returns the values.\n */\nfunction setToArray(set) {\n var index = -1,\n result = Array(set.size);\n\n set.forEach(function(value) {\n result[++index] = value;\n });\n return result;\n}\n\n/** Used for built-in method references. */\nvar arrayProto = Array.prototype,\n funcProto = Function.prototype,\n objectProto = Object.prototype;\n\n/** Used to detect overreaching core-js shims. */\nvar coreJsData = root['__core-js_shared__'];\n\n/** Used to detect methods masquerading as native. */\nvar maskSrcKey = (function() {\n var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n return uid ? ('Symbol(src)_1.' + uid) : '';\n}());\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objectToString = objectProto.toString;\n\n/** Used to detect if a method is native. */\nvar reIsNative = RegExp('^' +\n funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n);\n\n/** Built-in value references. */\nvar Buffer = moduleExports ? root.Buffer : undefined,\n Symbol = root.Symbol,\n Uint8Array = root.Uint8Array,\n getPrototype = overArg(Object.getPrototypeOf, Object),\n objectCreate = Object.create,\n propertyIsEnumerable = objectProto.propertyIsEnumerable,\n splice = arrayProto.splice;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeGetSymbols = Object.getOwnPropertySymbols,\n nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined,\n nativeKeys = overArg(Object.keys, Object);\n\n/* Built-in method references that are verified to be native. */\nvar DataView = getNative(root, 'DataView'),\n Map = getNative(root, 'Map'),\n Promise = getNative(root, 'Promise'),\n Set = getNative(root, 'Set'),\n WeakMap = getNative(root, 'WeakMap'),\n nativeCreate = getNative(Object, 'create');\n\n/** Used to detect maps, sets, and weakmaps. */\nvar dataViewCtorString = toSource(DataView),\n mapCtorString = toSource(Map),\n promiseCtorString = toSource(Promise),\n setCtorString = toSource(Set),\n weakMapCtorString = toSource(WeakMap);\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;\n\n/**\n * Creates a hash object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Hash(entries) {\n var index = -1,\n length = entries ? entries.length : 0;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n/**\n * Removes all key-value entries from the hash.\n *\n * @private\n * @name clear\n * @memberOf Hash\n */\nfunction hashClear() {\n this.__data__ = nativeCreate ? nativeCreate(null) : {};\n}\n\n/**\n * Removes `key` and its value from the hash.\n *\n * @private\n * @name delete\n * @memberOf Hash\n * @param {Object} hash The hash to modify.\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction hashDelete(key) {\n return this.has(key) && delete this.__data__[key];\n}\n\n/**\n * Gets the hash value for `key`.\n *\n * @private\n * @name get\n * @memberOf Hash\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction hashGet(key) {\n var data = this.__data__;\n if (nativeCreate) {\n var result = data[key];\n return result === HASH_UNDEFINED ? undefined : result;\n }\n return hasOwnProperty.call(data, key) ? data[key] : undefined;\n}\n\n/**\n * Checks if a hash value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Hash\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction hashHas(key) {\n var data = this.__data__;\n return nativeCreate ? data[key] !== undefined : hasOwnProperty.call(data, key);\n}\n\n/**\n * Sets the hash `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Hash\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the hash instance.\n */\nfunction hashSet(key, value) {\n var data = this.__data__;\n data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n return this;\n}\n\n// Add methods to `Hash`.\nHash.prototype.clear = hashClear;\nHash.prototype['delete'] = hashDelete;\nHash.prototype.get = hashGet;\nHash.prototype.has = hashHas;\nHash.prototype.set = hashSet;\n\n/**\n * Creates an list cache object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction ListCache(entries) {\n var index = -1,\n length = entries ? entries.length : 0;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n/**\n * Removes all key-value entries from the list cache.\n *\n * @private\n * @name clear\n * @memberOf ListCache\n */\nfunction listCacheClear() {\n this.__data__ = [];\n}\n\n/**\n * Removes `key` and its value from the list cache.\n *\n * @private\n * @name delete\n * @memberOf ListCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction listCacheDelete(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n return false;\n }\n var lastIndex = data.length - 1;\n if (index == lastIndex) {\n data.pop();\n } else {\n splice.call(data, index, 1);\n }\n return true;\n}\n\n/**\n * Gets the list cache value for `key`.\n *\n * @private\n * @name get\n * @memberOf ListCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction listCacheGet(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n return index < 0 ? undefined : data[index][1];\n}\n\n/**\n * Checks if a list cache value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf ListCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction listCacheHas(key) {\n return assocIndexOf(this.__data__, key) > -1;\n}\n\n/**\n * Sets the list cache `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf ListCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the list cache instance.\n */\nfunction listCacheSet(key, value) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n data.push([key, value]);\n } else {\n data[index][1] = value;\n }\n return this;\n}\n\n// Add methods to `ListCache`.\nListCache.prototype.clear = listCacheClear;\nListCache.prototype['delete'] = listCacheDelete;\nListCache.prototype.get = listCacheGet;\nListCache.prototype.has = listCacheHas;\nListCache.prototype.set = listCacheSet;\n\n/**\n * Creates a map cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction MapCache(entries) {\n var index = -1,\n length = entries ? entries.length : 0;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n/**\n * Removes all key-value entries from the map.\n *\n * @private\n * @name clear\n * @memberOf MapCache\n */\nfunction mapCacheClear() {\n this.__data__ = {\n 'hash': new Hash,\n 'map': new (Map || ListCache),\n 'string': new Hash\n };\n}\n\n/**\n * Removes `key` and its value from the map.\n *\n * @private\n * @name delete\n * @memberOf MapCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction mapCacheDelete(key) {\n return getMapData(this, key)['delete'](key);\n}\n\n/**\n * Gets the map value for `key`.\n *\n * @private\n * @name get\n * @memberOf MapCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction mapCacheGet(key) {\n return getMapData(this, key).get(key);\n}\n\n/**\n * Checks if a map value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf MapCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction mapCacheHas(key) {\n return getMapData(this, key).has(key);\n}\n\n/**\n * Sets the map `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf MapCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the map cache instance.\n */\nfunction mapCacheSet(key, value) {\n getMapData(this, key).set(key, value);\n return this;\n}\n\n// Add methods to `MapCache`.\nMapCache.prototype.clear = mapCacheClear;\nMapCache.prototype['delete'] = mapCacheDelete;\nMapCache.prototype.get = mapCacheGet;\nMapCache.prototype.has = mapCacheHas;\nMapCache.prototype.set = mapCacheSet;\n\n/**\n * Creates a stack cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Stack(entries) {\n this.__data__ = new ListCache(entries);\n}\n\n/**\n * Removes all key-value entries from the stack.\n *\n * @private\n * @name clear\n * @memberOf Stack\n */\nfunction stackClear() {\n this.__data__ = new ListCache;\n}\n\n/**\n * Removes `key` and its value from the stack.\n *\n * @private\n * @name delete\n * @memberOf Stack\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction stackDelete(key) {\n return this.__data__['delete'](key);\n}\n\n/**\n * Gets the stack value for `key`.\n *\n * @private\n * @name get\n * @memberOf Stack\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction stackGet(key) {\n return this.__data__.get(key);\n}\n\n/**\n * Checks if a stack value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Stack\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction stackHas(key) {\n return this.__data__.has(key);\n}\n\n/**\n * Sets the stack `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Stack\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the stack cache instance.\n */\nfunction stackSet(key, value) {\n var cache = this.__data__;\n if (cache instanceof ListCache) {\n var pairs = cache.__data__;\n if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {\n pairs.push([key, value]);\n return this;\n }\n cache = this.__data__ = new MapCache(pairs);\n }\n cache.set(key, value);\n return this;\n}\n\n// Add methods to `Stack`.\nStack.prototype.clear = stackClear;\nStack.prototype['delete'] = stackDelete;\nStack.prototype.get = stackGet;\nStack.prototype.has = stackHas;\nStack.prototype.set = stackSet;\n\n/**\n * Creates an array of the enumerable property names of the array-like `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @param {boolean} inherited Specify returning inherited property names.\n * @returns {Array} Returns the array of property names.\n */\nfunction arrayLikeKeys(value, inherited) {\n // Safari 8.1 makes `arguments.callee` enumerable in strict mode.\n // Safari 9 makes `arguments.length` enumerable in strict mode.\n var result = (isArray(value) || isArguments(value))\n ? baseTimes(value.length, String)\n : [];\n\n var length = result.length,\n skipIndexes = !!length;\n\n for (var key in value) {\n if ((inherited || hasOwnProperty.call(value, key)) &&\n !(skipIndexes && (key == 'length' || isIndex(key, length)))) {\n result.push(key);\n }\n }\n return result;\n}\n\n/**\n * Assigns `value` to `key` of `object` if the existing value is not equivalent\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction assignValue(object, key, value) {\n var objValue = object[key];\n if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||\n (value === undefined && !(key in object))) {\n object[key] = value;\n }\n}\n\n/**\n * Gets the index at which the `key` is found in `array` of key-value pairs.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} key The key to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction assocIndexOf(array, key) {\n var length = array.length;\n while (length--) {\n if (eq(array[length][0], key)) {\n return length;\n }\n }\n return -1;\n}\n\n/**\n * The base implementation of `_.assign` without support for multiple sources\n * or `customizer` functions.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @returns {Object} Returns `object`.\n */\nfunction baseAssign(object, source) {\n return object && copyObject(source, keys(source), object);\n}\n\n/**\n * The base implementation of `_.clone` and `_.cloneDeep` which tracks\n * traversed objects.\n *\n * @private\n * @param {*} value The value to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @param {boolean} [isFull] Specify a clone including symbols.\n * @param {Function} [customizer] The function to customize cloning.\n * @param {string} [key] The key of `value`.\n * @param {Object} [object] The parent object of `value`.\n * @param {Object} [stack] Tracks traversed objects and their clone counterparts.\n * @returns {*} Returns the cloned value.\n */\nfunction baseClone(value, isDeep, isFull, customizer, key, object, stack) {\n var result;\n if (customizer) {\n result = object ? customizer(value, key, object, stack) : customizer(value);\n }\n if (result !== undefined) {\n return result;\n }\n if (!isObject(value)) {\n return value;\n }\n var isArr = isArray(value);\n if (isArr) {\n result = initCloneArray(value);\n if (!isDeep) {\n return copyArray(value, result);\n }\n } else {\n var tag = getTag(value),\n isFunc = tag == funcTag || tag == genTag;\n\n if (isBuffer(value)) {\n return cloneBuffer(value, isDeep);\n }\n if (tag == objectTag || tag == argsTag || (isFunc && !object)) {\n if (isHostObject(value)) {\n return object ? value : {};\n }\n result = initCloneObject(isFunc ? {} : value);\n if (!isDeep) {\n return copySymbols(value, baseAssign(result, value));\n }\n } else {\n if (!cloneableTags[tag]) {\n return object ? value : {};\n }\n result = initCloneByTag(value, tag, baseClone, isDeep);\n }\n }\n // Check for circular references and return its corresponding clone.\n stack || (stack = new Stack);\n var stacked = stack.get(value);\n if (stacked) {\n return stacked;\n }\n stack.set(value, result);\n\n if (!isArr) {\n var props = isFull ? getAllKeys(value) : keys(value);\n }\n arrayEach(props || value, function(subValue, key) {\n if (props) {\n key = subValue;\n subValue = value[key];\n }\n // Recursively populate clone (susceptible to call stack limits).\n assignValue(result, key, baseClone(subValue, isDeep, isFull, customizer, key, value, stack));\n });\n return result;\n}\n\n/**\n * The base implementation of `_.create` without support for assigning\n * properties to the created object.\n *\n * @private\n * @param {Object} prototype The object to inherit from.\n * @returns {Object} Returns the new object.\n */\nfunction baseCreate(proto) {\n return isObject(proto) ? objectCreate(proto) : {};\n}\n\n/**\n * The base implementation of `getAllKeys` and `getAllKeysIn` which uses\n * `keysFunc` and `symbolsFunc` to get the enumerable property names and\n * symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @param {Function} symbolsFunc The function to get the symbols of `object`.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction baseGetAllKeys(object, keysFunc, symbolsFunc) {\n var result = keysFunc(object);\n return isArray(object) ? result : arrayPush(result, symbolsFunc(object));\n}\n\n/**\n * The base implementation of `getTag`.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n return objectToString.call(value);\n}\n\n/**\n * The base implementation of `_.isNative` without bad shim checks.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function,\n * else `false`.\n */\nfunction baseIsNative(value) {\n if (!isObject(value) || isMasked(value)) {\n return false;\n }\n var pattern = (isFunction(value) || isHostObject(value)) ? reIsNative : reIsHostCtor;\n return pattern.test(toSource(value));\n}\n\n/**\n * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeys(object) {\n if (!isPrototype(object)) {\n return nativeKeys(object);\n }\n var result = [];\n for (var key in Object(object)) {\n if (hasOwnProperty.call(object, key) && key != 'constructor') {\n result.push(key);\n }\n }\n return result;\n}\n\n/**\n * Creates a clone of `buffer`.\n *\n * @private\n * @param {Buffer} buffer The buffer to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Buffer} Returns the cloned buffer.\n */\nfunction cloneBuffer(buffer, isDeep) {\n if (isDeep) {\n return buffer.slice();\n }\n var result = new buffer.constructor(buffer.length);\n buffer.copy(result);\n return result;\n}\n\n/**\n * Creates a clone of `arrayBuffer`.\n *\n * @private\n * @param {ArrayBuffer} arrayBuffer The array buffer to clone.\n * @returns {ArrayBuffer} Returns the cloned array buffer.\n */\nfunction cloneArrayBuffer(arrayBuffer) {\n var result = new arrayBuffer.constructor(arrayBuffer.byteLength);\n new Uint8Array(result).set(new Uint8Array(arrayBuffer));\n return result;\n}\n\n/**\n * Creates a clone of `dataView`.\n *\n * @private\n * @param {Object} dataView The data view to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the cloned data view.\n */\nfunction cloneDataView(dataView, isDeep) {\n var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer;\n return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength);\n}\n\n/**\n * Creates a clone of `map`.\n *\n * @private\n * @param {Object} map The map to clone.\n * @param {Function} cloneFunc The function to clone values.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the cloned map.\n */\nfunction cloneMap(map, isDeep, cloneFunc) {\n var array = isDeep ? cloneFunc(mapToArray(map), true) : mapToArray(map);\n return arrayReduce(array, addMapEntry, new map.constructor);\n}\n\n/**\n * Creates a clone of `regexp`.\n *\n * @private\n * @param {Object} regexp The regexp to clone.\n * @returns {Object} Returns the cloned regexp.\n */\nfunction cloneRegExp(regexp) {\n var result = new regexp.constructor(regexp.source, reFlags.exec(regexp));\n result.lastIndex = regexp.lastIndex;\n return result;\n}\n\n/**\n * Creates a clone of `set`.\n *\n * @private\n * @param {Object} set The set to clone.\n * @param {Function} cloneFunc The function to clone values.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the cloned set.\n */\nfunction cloneSet(set, isDeep, cloneFunc) {\n var array = isDeep ? cloneFunc(setToArray(set), true) : setToArray(set);\n return arrayReduce(array, addSetEntry, new set.constructor);\n}\n\n/**\n * Creates a clone of the `symbol` object.\n *\n * @private\n * @param {Object} symbol The symbol object to clone.\n * @returns {Object} Returns the cloned symbol object.\n */\nfunction cloneSymbol(symbol) {\n return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {};\n}\n\n/**\n * Creates a clone of `typedArray`.\n *\n * @private\n * @param {Object} typedArray The typed array to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the cloned typed array.\n */\nfunction cloneTypedArray(typedArray, isDeep) {\n var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;\n return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);\n}\n\n/**\n * Copies the values of `source` to `array`.\n *\n * @private\n * @param {Array} source The array to copy values from.\n * @param {Array} [array=[]] The array to copy values to.\n * @returns {Array} Returns `array`.\n */\nfunction copyArray(source, array) {\n var index = -1,\n length = source.length;\n\n array || (array = Array(length));\n while (++index < length) {\n array[index] = source[index];\n }\n return array;\n}\n\n/**\n * Copies properties of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy properties from.\n * @param {Array} props The property identifiers to copy.\n * @param {Object} [object={}] The object to copy properties to.\n * @param {Function} [customizer] The function to customize copied values.\n * @returns {Object} Returns `object`.\n */\nfunction copyObject(source, props, object, customizer) {\n object || (object = {});\n\n var index = -1,\n length = props.length;\n\n while (++index < length) {\n var key = props[index];\n\n var newValue = customizer\n ? customizer(object[key], source[key], key, object, source)\n : undefined;\n\n assignValue(object, key, newValue === undefined ? source[key] : newValue);\n }\n return object;\n}\n\n/**\n * Copies own symbol properties of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy symbols from.\n * @param {Object} [object={}] The object to copy symbols to.\n * @returns {Object} Returns `object`.\n */\nfunction copySymbols(source, object) {\n return copyObject(source, getSymbols(source), object);\n}\n\n/**\n * Creates an array of own enumerable property names and symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction getAllKeys(object) {\n return baseGetAllKeys(object, keys, getSymbols);\n}\n\n/**\n * Gets the data for `map`.\n *\n * @private\n * @param {Object} map The map to query.\n * @param {string} key The reference key.\n * @returns {*} Returns the map data.\n */\nfunction getMapData(map, key) {\n var data = map.__data__;\n return isKeyable(key)\n ? data[typeof key == 'string' ? 'string' : 'hash']\n : data.map;\n}\n\n/**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */\nfunction getNative(object, key) {\n var value = getValue(object, key);\n return baseIsNative(value) ? value : undefined;\n}\n\n/**\n * Creates an array of the own enumerable symbol properties of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of symbols.\n */\nvar getSymbols = nativeGetSymbols ? overArg(nativeGetSymbols, Object) : stubArray;\n\n/**\n * Gets the `toStringTag` of `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nvar getTag = baseGetTag;\n\n// Fallback for data views, maps, sets, and weak maps in IE 11,\n// for data views in Edge < 14, and promises in Node.js.\nif ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||\n (Map && getTag(new Map) != mapTag) ||\n (Promise && getTag(Promise.resolve()) != promiseTag) ||\n (Set && getTag(new Set) != setTag) ||\n (WeakMap && getTag(new WeakMap) != weakMapTag)) {\n getTag = function(value) {\n var result = objectToString.call(value),\n Ctor = result == objectTag ? value.constructor : undefined,\n ctorString = Ctor ? toSource(Ctor) : undefined;\n\n if (ctorString) {\n switch (ctorString) {\n case dataViewCtorString: return dataViewTag;\n case mapCtorString: return mapTag;\n case promiseCtorString: return promiseTag;\n case setCtorString: return setTag;\n case weakMapCtorString: return weakMapTag;\n }\n }\n return result;\n };\n}\n\n/**\n * Initializes an array clone.\n *\n * @private\n * @param {Array} array The array to clone.\n * @returns {Array} Returns the initialized clone.\n */\nfunction initCloneArray(array) {\n var length = array.length,\n result = array.constructor(length);\n\n // Add properties assigned by `RegExp#exec`.\n if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) {\n result.index = array.index;\n result.input = array.input;\n }\n return result;\n}\n\n/**\n * Initializes an object clone.\n *\n * @private\n * @param {Object} object The object to clone.\n * @returns {Object} Returns the initialized clone.\n */\nfunction initCloneObject(object) {\n return (typeof object.constructor == 'function' && !isPrototype(object))\n ? baseCreate(getPrototype(object))\n : {};\n}\n\n/**\n * Initializes an object clone based on its `toStringTag`.\n *\n * **Note:** This function only supports cloning values with tags of\n * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.\n *\n * @private\n * @param {Object} object The object to clone.\n * @param {string} tag The `toStringTag` of the object to clone.\n * @param {Function} cloneFunc The function to clone values.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the initialized clone.\n */\nfunction initCloneByTag(object, tag, cloneFunc, isDeep) {\n var Ctor = object.constructor;\n switch (tag) {\n case arrayBufferTag:\n return cloneArrayBuffer(object);\n\n case boolTag:\n case dateTag:\n return new Ctor(+object);\n\n case dataViewTag:\n return cloneDataView(object, isDeep);\n\n case float32Tag: case float64Tag:\n case int8Tag: case int16Tag: case int32Tag:\n case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag:\n return cloneTypedArray(object, isDeep);\n\n case mapTag:\n return cloneMap(object, isDeep, cloneFunc);\n\n case numberTag:\n case stringTag:\n return new Ctor(object);\n\n case regexpTag:\n return cloneRegExp(object);\n\n case setTag:\n return cloneSet(object, isDeep, cloneFunc);\n\n case symbolTag:\n return cloneSymbol(object);\n }\n}\n\n/**\n * Checks if `value` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n */\nfunction isIndex(value, length) {\n length = length == null ? MAX_SAFE_INTEGER : length;\n return !!length &&\n (typeof value == 'number' || reIsUint.test(value)) &&\n (value > -1 && value % 1 == 0 && value < length);\n}\n\n/**\n * Checks if `value` is suitable for use as unique object key.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n */\nfunction isKeyable(value) {\n var type = typeof value;\n return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n ? (value !== '__proto__')\n : (value === null);\n}\n\n/**\n * Checks if `func` has its source masked.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n */\nfunction isMasked(func) {\n return !!maskSrcKey && (maskSrcKey in func);\n}\n\n/**\n * Checks if `value` is likely a prototype object.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n */\nfunction isPrototype(value) {\n var Ctor = value && value.constructor,\n proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\n return value === proto;\n}\n\n/**\n * Converts `func` to its source code.\n *\n * @private\n * @param {Function} func The function to process.\n * @returns {string} Returns the source code.\n */\nfunction toSource(func) {\n if (func != null) {\n try {\n return funcToString.call(func);\n } catch (e) {}\n try {\n return (func + '');\n } catch (e) {}\n }\n return '';\n}\n\n/**\n * This method is like `_.clone` except that it recursively clones `value`.\n *\n * @static\n * @memberOf _\n * @since 1.0.0\n * @category Lang\n * @param {*} value The value to recursively clone.\n * @returns {*} Returns the deep cloned value.\n * @see _.clone\n * @example\n *\n * var objects = [{ 'a': 1 }, { 'b': 2 }];\n *\n * var deep = _.cloneDeep(objects);\n * console.log(deep[0] === objects[0]);\n * // => false\n */\nfunction cloneDeep(value) {\n return baseClone(value, true, true);\n}\n\n/**\n * Performs a\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\nfunction eq(value, other) {\n return value === other || (value !== value && other !== other);\n}\n\n/**\n * Checks if `value` is likely an `arguments` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n * else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\nfunction isArguments(value) {\n // Safari 8.1 makes `arguments.callee` enumerable in strict mode.\n return isArrayLikeObject(value) && hasOwnProperty.call(value, 'callee') &&\n (!propertyIsEnumerable.call(value, 'callee') || objectToString.call(value) == argsTag);\n}\n\n/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\n/**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\nfunction isArrayLike(value) {\n return value != null && isLength(value.length) && !isFunction(value);\n}\n\n/**\n * This method is like `_.isArrayLike` except that it also checks if `value`\n * is an object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array-like object,\n * else `false`.\n * @example\n *\n * _.isArrayLikeObject([1, 2, 3]);\n * // => true\n *\n * _.isArrayLikeObject(document.body.children);\n * // => true\n *\n * _.isArrayLikeObject('abc');\n * // => false\n *\n * _.isArrayLikeObject(_.noop);\n * // => false\n */\nfunction isArrayLikeObject(value) {\n return isObjectLike(value) && isArrayLike(value);\n}\n\n/**\n * Checks if `value` is a buffer.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.\n * @example\n *\n * _.isBuffer(new Buffer(2));\n * // => true\n *\n * _.isBuffer(new Uint8Array(2));\n * // => false\n */\nvar isBuffer = nativeIsBuffer || stubFalse;\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in Safari 8-9 which returns 'object' for typed array and other constructors.\n var tag = isObject(value) ? objectToString.call(value) : '';\n return tag == funcTag || tag == genTag;\n}\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This method is loosely based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\nfunction isLength(value) {\n return typeof value == 'number' &&\n value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\n/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return !!value && (type == 'object' || type == 'function');\n}\n\n/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return !!value && typeof value == 'object';\n}\n\n/**\n * Creates an array of the own enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects. See the\n * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * for more details.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keys(new Foo);\n * // => ['a', 'b'] (iteration order is not guaranteed)\n *\n * _.keys('hi');\n * // => ['0', '1']\n */\nfunction keys(object) {\n return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);\n}\n\n/**\n * This method returns a new empty array.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {Array} Returns the new empty array.\n * @example\n *\n * var arrays = _.times(2, _.stubArray);\n *\n * console.log(arrays);\n * // => [[], []]\n *\n * console.log(arrays[0] === arrays[1]);\n * // => false\n */\nfunction stubArray() {\n return [];\n}\n\n/**\n * This method returns `false`.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {boolean} Returns `false`.\n * @example\n *\n * _.times(2, _.stubFalse);\n * // => [false, false]\n */\nfunction stubFalse() {\n return false;\n}\n\nmodule.exports = cloneDeep;\n","/**\n * Lodash (Custom Build) \n * Build: `lodash modularize exports=\"npm\" -o ./`\n * Copyright JS Foundation and other contributors \n * Released under MIT license \n * Based on Underscore.js 1.8.3 \n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n\n/** Used as the size to enable large array optimizations. */\nvar LARGE_ARRAY_SIZE = 200;\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n COMPARE_UNORDERED_FLAG = 2;\n\n/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n asyncTag = '[object AsyncFunction]',\n boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n errorTag = '[object Error]',\n funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n nullTag = '[object Null]',\n objectTag = '[object Object]',\n promiseTag = '[object Promise]',\n proxyTag = '[object Proxy]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n symbolTag = '[object Symbol]',\n undefinedTag = '[object Undefined]',\n weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]',\n float32Tag = '[object Float32Array]',\n float64Tag = '[object Float64Array]',\n int8Tag = '[object Int8Array]',\n int16Tag = '[object Int16Array]',\n int32Tag = '[object Int32Array]',\n uint8Tag = '[object Uint8Array]',\n uint8ClampedTag = '[object Uint8ClampedArray]',\n uint16Tag = '[object Uint16Array]',\n uint32Tag = '[object Uint32Array]';\n\n/**\n * Used to match `RegExp`\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n */\nvar reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g;\n\n/** Used to detect host constructors (Safari). */\nvar reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n/** Used to detect unsigned integer values. */\nvar reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n/** Used to identify `toStringTag` values of typed arrays. */\nvar typedArrayTags = {};\ntypedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\ntypedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\ntypedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\ntypedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\ntypedArrayTags[uint32Tag] = true;\ntypedArrayTags[argsTag] = typedArrayTags[arrayTag] =\ntypedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\ntypedArrayTags[dataViewTag] = typedArrayTags[dateTag] =\ntypedArrayTags[errorTag] = typedArrayTags[funcTag] =\ntypedArrayTags[mapTag] = typedArrayTags[numberTag] =\ntypedArrayTags[objectTag] = typedArrayTags[regexpTag] =\ntypedArrayTags[setTag] = typedArrayTags[stringTag] =\ntypedArrayTags[weakMapTag] = false;\n\n/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Detect free variable `process` from Node.js. */\nvar freeProcess = moduleExports && freeGlobal.process;\n\n/** Used to access faster Node.js helpers. */\nvar nodeUtil = (function() {\n try {\n return freeProcess && freeProcess.binding && freeProcess.binding('util');\n } catch (e) {}\n}());\n\n/* Node.js helper references. */\nvar nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;\n\n/**\n * A specialized version of `_.filter` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n */\nfunction arrayFilter(array, predicate) {\n var index = -1,\n length = array == null ? 0 : array.length,\n resIndex = 0,\n result = [];\n\n while (++index < length) {\n var value = array[index];\n if (predicate(value, index, array)) {\n result[resIndex++] = value;\n }\n }\n return result;\n}\n\n/**\n * Appends the elements of `values` to `array`.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {Array} values The values to append.\n * @returns {Array} Returns `array`.\n */\nfunction arrayPush(array, values) {\n var index = -1,\n length = values.length,\n offset = array.length;\n\n while (++index < length) {\n array[offset + index] = values[index];\n }\n return array;\n}\n\n/**\n * A specialized version of `_.some` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns `true` if any element passes the predicate check,\n * else `false`.\n */\nfunction arraySome(array, predicate) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n if (predicate(array[index], index, array)) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * The base implementation of `_.times` without support for iteratee shorthands\n * or max array length checks.\n *\n * @private\n * @param {number} n The number of times to invoke `iteratee`.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the array of results.\n */\nfunction baseTimes(n, iteratee) {\n var index = -1,\n result = Array(n);\n\n while (++index < n) {\n result[index] = iteratee(index);\n }\n return result;\n}\n\n/**\n * The base implementation of `_.unary` without support for storing metadata.\n *\n * @private\n * @param {Function} func The function to cap arguments for.\n * @returns {Function} Returns the new capped function.\n */\nfunction baseUnary(func) {\n return function(value) {\n return func(value);\n };\n}\n\n/**\n * Checks if a `cache` value for `key` exists.\n *\n * @private\n * @param {Object} cache The cache to query.\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction cacheHas(cache, key) {\n return cache.has(key);\n}\n\n/**\n * Gets the value at `key` of `object`.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\nfunction getValue(object, key) {\n return object == null ? undefined : object[key];\n}\n\n/**\n * Converts `map` to its key-value pairs.\n *\n * @private\n * @param {Object} map The map to convert.\n * @returns {Array} Returns the key-value pairs.\n */\nfunction mapToArray(map) {\n var index = -1,\n result = Array(map.size);\n\n map.forEach(function(value, key) {\n result[++index] = [key, value];\n });\n return result;\n}\n\n/**\n * Creates a unary function that invokes `func` with its argument transformed.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {Function} transform The argument transform.\n * @returns {Function} Returns the new function.\n */\nfunction overArg(func, transform) {\n return function(arg) {\n return func(transform(arg));\n };\n}\n\n/**\n * Converts `set` to an array of its values.\n *\n * @private\n * @param {Object} set The set to convert.\n * @returns {Array} Returns the values.\n */\nfunction setToArray(set) {\n var index = -1,\n result = Array(set.size);\n\n set.forEach(function(value) {\n result[++index] = value;\n });\n return result;\n}\n\n/** Used for built-in method references. */\nvar arrayProto = Array.prototype,\n funcProto = Function.prototype,\n objectProto = Object.prototype;\n\n/** Used to detect overreaching core-js shims. */\nvar coreJsData = root['__core-js_shared__'];\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Used to detect methods masquerading as native. */\nvar maskSrcKey = (function() {\n var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n return uid ? ('Symbol(src)_1.' + uid) : '';\n}());\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/** Used to detect if a method is native. */\nvar reIsNative = RegExp('^' +\n funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n);\n\n/** Built-in value references. */\nvar Buffer = moduleExports ? root.Buffer : undefined,\n Symbol = root.Symbol,\n Uint8Array = root.Uint8Array,\n propertyIsEnumerable = objectProto.propertyIsEnumerable,\n splice = arrayProto.splice,\n symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeGetSymbols = Object.getOwnPropertySymbols,\n nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined,\n nativeKeys = overArg(Object.keys, Object);\n\n/* Built-in method references that are verified to be native. */\nvar DataView = getNative(root, 'DataView'),\n Map = getNative(root, 'Map'),\n Promise = getNative(root, 'Promise'),\n Set = getNative(root, 'Set'),\n WeakMap = getNative(root, 'WeakMap'),\n nativeCreate = getNative(Object, 'create');\n\n/** Used to detect maps, sets, and weakmaps. */\nvar dataViewCtorString = toSource(DataView),\n mapCtorString = toSource(Map),\n promiseCtorString = toSource(Promise),\n setCtorString = toSource(Set),\n weakMapCtorString = toSource(WeakMap);\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;\n\n/**\n * Creates a hash object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Hash(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n/**\n * Removes all key-value entries from the hash.\n *\n * @private\n * @name clear\n * @memberOf Hash\n */\nfunction hashClear() {\n this.__data__ = nativeCreate ? nativeCreate(null) : {};\n this.size = 0;\n}\n\n/**\n * Removes `key` and its value from the hash.\n *\n * @private\n * @name delete\n * @memberOf Hash\n * @param {Object} hash The hash to modify.\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction hashDelete(key) {\n var result = this.has(key) && delete this.__data__[key];\n this.size -= result ? 1 : 0;\n return result;\n}\n\n/**\n * Gets the hash value for `key`.\n *\n * @private\n * @name get\n * @memberOf Hash\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction hashGet(key) {\n var data = this.__data__;\n if (nativeCreate) {\n var result = data[key];\n return result === HASH_UNDEFINED ? undefined : result;\n }\n return hasOwnProperty.call(data, key) ? data[key] : undefined;\n}\n\n/**\n * Checks if a hash value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Hash\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction hashHas(key) {\n var data = this.__data__;\n return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);\n}\n\n/**\n * Sets the hash `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Hash\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the hash instance.\n */\nfunction hashSet(key, value) {\n var data = this.__data__;\n this.size += this.has(key) ? 0 : 1;\n data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n return this;\n}\n\n// Add methods to `Hash`.\nHash.prototype.clear = hashClear;\nHash.prototype['delete'] = hashDelete;\nHash.prototype.get = hashGet;\nHash.prototype.has = hashHas;\nHash.prototype.set = hashSet;\n\n/**\n * Creates an list cache object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction ListCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n/**\n * Removes all key-value entries from the list cache.\n *\n * @private\n * @name clear\n * @memberOf ListCache\n */\nfunction listCacheClear() {\n this.__data__ = [];\n this.size = 0;\n}\n\n/**\n * Removes `key` and its value from the list cache.\n *\n * @private\n * @name delete\n * @memberOf ListCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction listCacheDelete(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n return false;\n }\n var lastIndex = data.length - 1;\n if (index == lastIndex) {\n data.pop();\n } else {\n splice.call(data, index, 1);\n }\n --this.size;\n return true;\n}\n\n/**\n * Gets the list cache value for `key`.\n *\n * @private\n * @name get\n * @memberOf ListCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction listCacheGet(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n return index < 0 ? undefined : data[index][1];\n}\n\n/**\n * Checks if a list cache value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf ListCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction listCacheHas(key) {\n return assocIndexOf(this.__data__, key) > -1;\n}\n\n/**\n * Sets the list cache `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf ListCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the list cache instance.\n */\nfunction listCacheSet(key, value) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n ++this.size;\n data.push([key, value]);\n } else {\n data[index][1] = value;\n }\n return this;\n}\n\n// Add methods to `ListCache`.\nListCache.prototype.clear = listCacheClear;\nListCache.prototype['delete'] = listCacheDelete;\nListCache.prototype.get = listCacheGet;\nListCache.prototype.has = listCacheHas;\nListCache.prototype.set = listCacheSet;\n\n/**\n * Creates a map cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction MapCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n/**\n * Removes all key-value entries from the map.\n *\n * @private\n * @name clear\n * @memberOf MapCache\n */\nfunction mapCacheClear() {\n this.size = 0;\n this.__data__ = {\n 'hash': new Hash,\n 'map': new (Map || ListCache),\n 'string': new Hash\n };\n}\n\n/**\n * Removes `key` and its value from the map.\n *\n * @private\n * @name delete\n * @memberOf MapCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction mapCacheDelete(key) {\n var result = getMapData(this, key)['delete'](key);\n this.size -= result ? 1 : 0;\n return result;\n}\n\n/**\n * Gets the map value for `key`.\n *\n * @private\n * @name get\n * @memberOf MapCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction mapCacheGet(key) {\n return getMapData(this, key).get(key);\n}\n\n/**\n * Checks if a map value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf MapCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction mapCacheHas(key) {\n return getMapData(this, key).has(key);\n}\n\n/**\n * Sets the map `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf MapCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the map cache instance.\n */\nfunction mapCacheSet(key, value) {\n var data = getMapData(this, key),\n size = data.size;\n\n data.set(key, value);\n this.size += data.size == size ? 0 : 1;\n return this;\n}\n\n// Add methods to `MapCache`.\nMapCache.prototype.clear = mapCacheClear;\nMapCache.prototype['delete'] = mapCacheDelete;\nMapCache.prototype.get = mapCacheGet;\nMapCache.prototype.has = mapCacheHas;\nMapCache.prototype.set = mapCacheSet;\n\n/**\n *\n * Creates an array cache object to store unique values.\n *\n * @private\n * @constructor\n * @param {Array} [values] The values to cache.\n */\nfunction SetCache(values) {\n var index = -1,\n length = values == null ? 0 : values.length;\n\n this.__data__ = new MapCache;\n while (++index < length) {\n this.add(values[index]);\n }\n}\n\n/**\n * Adds `value` to the array cache.\n *\n * @private\n * @name add\n * @memberOf SetCache\n * @alias push\n * @param {*} value The value to cache.\n * @returns {Object} Returns the cache instance.\n */\nfunction setCacheAdd(value) {\n this.__data__.set(value, HASH_UNDEFINED);\n return this;\n}\n\n/**\n * Checks if `value` is in the array cache.\n *\n * @private\n * @name has\n * @memberOf SetCache\n * @param {*} value The value to search for.\n * @returns {number} Returns `true` if `value` is found, else `false`.\n */\nfunction setCacheHas(value) {\n return this.__data__.has(value);\n}\n\n// Add methods to `SetCache`.\nSetCache.prototype.add = SetCache.prototype.push = setCacheAdd;\nSetCache.prototype.has = setCacheHas;\n\n/**\n * Creates a stack cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Stack(entries) {\n var data = this.__data__ = new ListCache(entries);\n this.size = data.size;\n}\n\n/**\n * Removes all key-value entries from the stack.\n *\n * @private\n * @name clear\n * @memberOf Stack\n */\nfunction stackClear() {\n this.__data__ = new ListCache;\n this.size = 0;\n}\n\n/**\n * Removes `key` and its value from the stack.\n *\n * @private\n * @name delete\n * @memberOf Stack\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction stackDelete(key) {\n var data = this.__data__,\n result = data['delete'](key);\n\n this.size = data.size;\n return result;\n}\n\n/**\n * Gets the stack value for `key`.\n *\n * @private\n * @name get\n * @memberOf Stack\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction stackGet(key) {\n return this.__data__.get(key);\n}\n\n/**\n * Checks if a stack value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Stack\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction stackHas(key) {\n return this.__data__.has(key);\n}\n\n/**\n * Sets the stack `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Stack\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the stack cache instance.\n */\nfunction stackSet(key, value) {\n var data = this.__data__;\n if (data instanceof ListCache) {\n var pairs = data.__data__;\n if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {\n pairs.push([key, value]);\n this.size = ++data.size;\n return this;\n }\n data = this.__data__ = new MapCache(pairs);\n }\n data.set(key, value);\n this.size = data.size;\n return this;\n}\n\n// Add methods to `Stack`.\nStack.prototype.clear = stackClear;\nStack.prototype['delete'] = stackDelete;\nStack.prototype.get = stackGet;\nStack.prototype.has = stackHas;\nStack.prototype.set = stackSet;\n\n/**\n * Creates an array of the enumerable property names of the array-like `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @param {boolean} inherited Specify returning inherited property names.\n * @returns {Array} Returns the array of property names.\n */\nfunction arrayLikeKeys(value, inherited) {\n var isArr = isArray(value),\n isArg = !isArr && isArguments(value),\n isBuff = !isArr && !isArg && isBuffer(value),\n isType = !isArr && !isArg && !isBuff && isTypedArray(value),\n skipIndexes = isArr || isArg || isBuff || isType,\n result = skipIndexes ? baseTimes(value.length, String) : [],\n length = result.length;\n\n for (var key in value) {\n if ((inherited || hasOwnProperty.call(value, key)) &&\n !(skipIndexes && (\n // Safari 9 has enumerable `arguments.length` in strict mode.\n key == 'length' ||\n // Node.js 0.10 has enumerable non-index properties on buffers.\n (isBuff && (key == 'offset' || key == 'parent')) ||\n // PhantomJS 2 has enumerable non-index properties on typed arrays.\n (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||\n // Skip index properties.\n isIndex(key, length)\n ))) {\n result.push(key);\n }\n }\n return result;\n}\n\n/**\n * Gets the index at which the `key` is found in `array` of key-value pairs.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} key The key to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction assocIndexOf(array, key) {\n var length = array.length;\n while (length--) {\n if (eq(array[length][0], key)) {\n return length;\n }\n }\n return -1;\n}\n\n/**\n * The base implementation of `getAllKeys` and `getAllKeysIn` which uses\n * `keysFunc` and `symbolsFunc` to get the enumerable property names and\n * symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @param {Function} symbolsFunc The function to get the symbols of `object`.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction baseGetAllKeys(object, keysFunc, symbolsFunc) {\n var result = keysFunc(object);\n return isArray(object) ? result : arrayPush(result, symbolsFunc(object));\n}\n\n/**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n if (value == null) {\n return value === undefined ? undefinedTag : nullTag;\n }\n return (symToStringTag && symToStringTag in Object(value))\n ? getRawTag(value)\n : objectToString(value);\n}\n\n/**\n * The base implementation of `_.isArguments`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n */\nfunction baseIsArguments(value) {\n return isObjectLike(value) && baseGetTag(value) == argsTag;\n}\n\n/**\n * The base implementation of `_.isEqual` which supports partial comparisons\n * and tracks traversed objects.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @param {boolean} bitmask The bitmask flags.\n * 1 - Unordered comparison\n * 2 - Partial comparison\n * @param {Function} [customizer] The function to customize comparisons.\n * @param {Object} [stack] Tracks traversed `value` and `other` objects.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n */\nfunction baseIsEqual(value, other, bitmask, customizer, stack) {\n if (value === other) {\n return true;\n }\n if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {\n return value !== value && other !== other;\n }\n return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);\n}\n\n/**\n * A specialized version of `baseIsEqual` for arrays and objects which performs\n * deep comparisons and tracks traversed objects enabling objects with circular\n * references to be compared.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} [stack] Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {\n var objIsArr = isArray(object),\n othIsArr = isArray(other),\n objTag = objIsArr ? arrayTag : getTag(object),\n othTag = othIsArr ? arrayTag : getTag(other);\n\n objTag = objTag == argsTag ? objectTag : objTag;\n othTag = othTag == argsTag ? objectTag : othTag;\n\n var objIsObj = objTag == objectTag,\n othIsObj = othTag == objectTag,\n isSameTag = objTag == othTag;\n\n if (isSameTag && isBuffer(object)) {\n if (!isBuffer(other)) {\n return false;\n }\n objIsArr = true;\n objIsObj = false;\n }\n if (isSameTag && !objIsObj) {\n stack || (stack = new Stack);\n return (objIsArr || isTypedArray(object))\n ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)\n : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);\n }\n if (!(bitmask & COMPARE_PARTIAL_FLAG)) {\n var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),\n othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');\n\n if (objIsWrapped || othIsWrapped) {\n var objUnwrapped = objIsWrapped ? object.value() : object,\n othUnwrapped = othIsWrapped ? other.value() : other;\n\n stack || (stack = new Stack);\n return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);\n }\n }\n if (!isSameTag) {\n return false;\n }\n stack || (stack = new Stack);\n return equalObjects(object, other, bitmask, customizer, equalFunc, stack);\n}\n\n/**\n * The base implementation of `_.isNative` without bad shim checks.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function,\n * else `false`.\n */\nfunction baseIsNative(value) {\n if (!isObject(value) || isMasked(value)) {\n return false;\n }\n var pattern = isFunction(value) ? reIsNative : reIsHostCtor;\n return pattern.test(toSource(value));\n}\n\n/**\n * The base implementation of `_.isTypedArray` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n */\nfunction baseIsTypedArray(value) {\n return isObjectLike(value) &&\n isLength(value.length) && !!typedArrayTags[baseGetTag(value)];\n}\n\n/**\n * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeys(object) {\n if (!isPrototype(object)) {\n return nativeKeys(object);\n }\n var result = [];\n for (var key in Object(object)) {\n if (hasOwnProperty.call(object, key) && key != 'constructor') {\n result.push(key);\n }\n }\n return result;\n}\n\n/**\n * A specialized version of `baseIsEqualDeep` for arrays with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Array} array The array to compare.\n * @param {Array} other The other array to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `array` and `other` objects.\n * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.\n */\nfunction equalArrays(array, other, bitmask, customizer, equalFunc, stack) {\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n arrLength = array.length,\n othLength = other.length;\n\n if (arrLength != othLength && !(isPartial && othLength > arrLength)) {\n return false;\n }\n // Assume cyclic values are equal.\n var stacked = stack.get(array);\n if (stacked && stack.get(other)) {\n return stacked == other;\n }\n var index = -1,\n result = true,\n seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined;\n\n stack.set(array, other);\n stack.set(other, array);\n\n // Ignore non-index properties.\n while (++index < arrLength) {\n var arrValue = array[index],\n othValue = other[index];\n\n if (customizer) {\n var compared = isPartial\n ? customizer(othValue, arrValue, index, other, array, stack)\n : customizer(arrValue, othValue, index, array, other, stack);\n }\n if (compared !== undefined) {\n if (compared) {\n continue;\n }\n result = false;\n break;\n }\n // Recursively compare arrays (susceptible to call stack limits).\n if (seen) {\n if (!arraySome(other, function(othValue, othIndex) {\n if (!cacheHas(seen, othIndex) &&\n (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {\n return seen.push(othIndex);\n }\n })) {\n result = false;\n break;\n }\n } else if (!(\n arrValue === othValue ||\n equalFunc(arrValue, othValue, bitmask, customizer, stack)\n )) {\n result = false;\n break;\n }\n }\n stack['delete'](array);\n stack['delete'](other);\n return result;\n}\n\n/**\n * A specialized version of `baseIsEqualDeep` for comparing objects of\n * the same `toStringTag`.\n *\n * **Note:** This function only supports comparing values with tags of\n * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {string} tag The `toStringTag` of the objects to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {\n switch (tag) {\n case dataViewTag:\n if ((object.byteLength != other.byteLength) ||\n (object.byteOffset != other.byteOffset)) {\n return false;\n }\n object = object.buffer;\n other = other.buffer;\n\n case arrayBufferTag:\n if ((object.byteLength != other.byteLength) ||\n !equalFunc(new Uint8Array(object), new Uint8Array(other))) {\n return false;\n }\n return true;\n\n case boolTag:\n case dateTag:\n case numberTag:\n // Coerce booleans to `1` or `0` and dates to milliseconds.\n // Invalid dates are coerced to `NaN`.\n return eq(+object, +other);\n\n case errorTag:\n return object.name == other.name && object.message == other.message;\n\n case regexpTag:\n case stringTag:\n // Coerce regexes to strings and treat strings, primitives and objects,\n // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring\n // for more details.\n return object == (other + '');\n\n case mapTag:\n var convert = mapToArray;\n\n case setTag:\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG;\n convert || (convert = setToArray);\n\n if (object.size != other.size && !isPartial) {\n return false;\n }\n // Assume cyclic values are equal.\n var stacked = stack.get(object);\n if (stacked) {\n return stacked == other;\n }\n bitmask |= COMPARE_UNORDERED_FLAG;\n\n // Recursively compare objects (susceptible to call stack limits).\n stack.set(object, other);\n var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);\n stack['delete'](object);\n return result;\n\n case symbolTag:\n if (symbolValueOf) {\n return symbolValueOf.call(object) == symbolValueOf.call(other);\n }\n }\n return false;\n}\n\n/**\n * A specialized version of `baseIsEqualDeep` for objects with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction equalObjects(object, other, bitmask, customizer, equalFunc, stack) {\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n objProps = getAllKeys(object),\n objLength = objProps.length,\n othProps = getAllKeys(other),\n othLength = othProps.length;\n\n if (objLength != othLength && !isPartial) {\n return false;\n }\n var index = objLength;\n while (index--) {\n var key = objProps[index];\n if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {\n return false;\n }\n }\n // Assume cyclic values are equal.\n var stacked = stack.get(object);\n if (stacked && stack.get(other)) {\n return stacked == other;\n }\n var result = true;\n stack.set(object, other);\n stack.set(other, object);\n\n var skipCtor = isPartial;\n while (++index < objLength) {\n key = objProps[index];\n var objValue = object[key],\n othValue = other[key];\n\n if (customizer) {\n var compared = isPartial\n ? customizer(othValue, objValue, key, other, object, stack)\n : customizer(objValue, othValue, key, object, other, stack);\n }\n // Recursively compare objects (susceptible to call stack limits).\n if (!(compared === undefined\n ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack))\n : compared\n )) {\n result = false;\n break;\n }\n skipCtor || (skipCtor = key == 'constructor');\n }\n if (result && !skipCtor) {\n var objCtor = object.constructor,\n othCtor = other.constructor;\n\n // Non `Object` object instances with different constructors are not equal.\n if (objCtor != othCtor &&\n ('constructor' in object && 'constructor' in other) &&\n !(typeof objCtor == 'function' && objCtor instanceof objCtor &&\n typeof othCtor == 'function' && othCtor instanceof othCtor)) {\n result = false;\n }\n }\n stack['delete'](object);\n stack['delete'](other);\n return result;\n}\n\n/**\n * Creates an array of own enumerable property names and symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction getAllKeys(object) {\n return baseGetAllKeys(object, keys, getSymbols);\n}\n\n/**\n * Gets the data for `map`.\n *\n * @private\n * @param {Object} map The map to query.\n * @param {string} key The reference key.\n * @returns {*} Returns the map data.\n */\nfunction getMapData(map, key) {\n var data = map.__data__;\n return isKeyable(key)\n ? data[typeof key == 'string' ? 'string' : 'hash']\n : data.map;\n}\n\n/**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */\nfunction getNative(object, key) {\n var value = getValue(object, key);\n return baseIsNative(value) ? value : undefined;\n}\n\n/**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\nfunction getRawTag(value) {\n var isOwn = hasOwnProperty.call(value, symToStringTag),\n tag = value[symToStringTag];\n\n try {\n value[symToStringTag] = undefined;\n var unmasked = true;\n } catch (e) {}\n\n var result = nativeObjectToString.call(value);\n if (unmasked) {\n if (isOwn) {\n value[symToStringTag] = tag;\n } else {\n delete value[symToStringTag];\n }\n }\n return result;\n}\n\n/**\n * Creates an array of the own enumerable symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of symbols.\n */\nvar getSymbols = !nativeGetSymbols ? stubArray : function(object) {\n if (object == null) {\n return [];\n }\n object = Object(object);\n return arrayFilter(nativeGetSymbols(object), function(symbol) {\n return propertyIsEnumerable.call(object, symbol);\n });\n};\n\n/**\n * Gets the `toStringTag` of `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nvar getTag = baseGetTag;\n\n// Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.\nif ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||\n (Map && getTag(new Map) != mapTag) ||\n (Promise && getTag(Promise.resolve()) != promiseTag) ||\n (Set && getTag(new Set) != setTag) ||\n (WeakMap && getTag(new WeakMap) != weakMapTag)) {\n getTag = function(value) {\n var result = baseGetTag(value),\n Ctor = result == objectTag ? value.constructor : undefined,\n ctorString = Ctor ? toSource(Ctor) : '';\n\n if (ctorString) {\n switch (ctorString) {\n case dataViewCtorString: return dataViewTag;\n case mapCtorString: return mapTag;\n case promiseCtorString: return promiseTag;\n case setCtorString: return setTag;\n case weakMapCtorString: return weakMapTag;\n }\n }\n return result;\n };\n}\n\n/**\n * Checks if `value` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n */\nfunction isIndex(value, length) {\n length = length == null ? MAX_SAFE_INTEGER : length;\n return !!length &&\n (typeof value == 'number' || reIsUint.test(value)) &&\n (value > -1 && value % 1 == 0 && value < length);\n}\n\n/**\n * Checks if `value` is suitable for use as unique object key.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n */\nfunction isKeyable(value) {\n var type = typeof value;\n return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n ? (value !== '__proto__')\n : (value === null);\n}\n\n/**\n * Checks if `func` has its source masked.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n */\nfunction isMasked(func) {\n return !!maskSrcKey && (maskSrcKey in func);\n}\n\n/**\n * Checks if `value` is likely a prototype object.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n */\nfunction isPrototype(value) {\n var Ctor = value && value.constructor,\n proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\n return value === proto;\n}\n\n/**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\nfunction objectToString(value) {\n return nativeObjectToString.call(value);\n}\n\n/**\n * Converts `func` to its source code.\n *\n * @private\n * @param {Function} func The function to convert.\n * @returns {string} Returns the source code.\n */\nfunction toSource(func) {\n if (func != null) {\n try {\n return funcToString.call(func);\n } catch (e) {}\n try {\n return (func + '');\n } catch (e) {}\n }\n return '';\n}\n\n/**\n * Performs a\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\nfunction eq(value, other) {\n return value === other || (value !== value && other !== other);\n}\n\n/**\n * Checks if `value` is likely an `arguments` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n * else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\nvar isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {\n return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&\n !propertyIsEnumerable.call(value, 'callee');\n};\n\n/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\n/**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\nfunction isArrayLike(value) {\n return value != null && isLength(value.length) && !isFunction(value);\n}\n\n/**\n * Checks if `value` is a buffer.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.\n * @example\n *\n * _.isBuffer(new Buffer(2));\n * // => true\n *\n * _.isBuffer(new Uint8Array(2));\n * // => false\n */\nvar isBuffer = nativeIsBuffer || stubFalse;\n\n/**\n * Performs a deep comparison between two values to determine if they are\n * equivalent.\n *\n * **Note:** This method supports comparing arrays, array buffers, booleans,\n * date objects, error objects, maps, numbers, `Object` objects, regexes,\n * sets, strings, symbols, and typed arrays. `Object` objects are compared\n * by their own, not inherited, enumerable properties. Functions and DOM\n * nodes are compared by strict equality, i.e. `===`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.isEqual(object, other);\n * // => true\n *\n * object === other;\n * // => false\n */\nfunction isEqual(value, other) {\n return baseIsEqual(value, other);\n}\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n if (!isObject(value)) {\n return false;\n }\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in Safari 9 which returns 'object' for typed arrays and other constructors.\n var tag = baseGetTag(value);\n return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\n}\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This method is loosely based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\nfunction isLength(value) {\n return typeof value == 'number' &&\n value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\n/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return value != null && (type == 'object' || type == 'function');\n}\n\n/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return value != null && typeof value == 'object';\n}\n\n/**\n * Checks if `value` is classified as a typed array.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n * @example\n *\n * _.isTypedArray(new Uint8Array);\n * // => true\n *\n * _.isTypedArray([]);\n * // => false\n */\nvar isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;\n\n/**\n * Creates an array of the own enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects. See the\n * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * for more details.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keys(new Foo);\n * // => ['a', 'b'] (iteration order is not guaranteed)\n *\n * _.keys('hi');\n * // => ['0', '1']\n */\nfunction keys(object) {\n return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);\n}\n\n/**\n * This method returns a new empty array.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {Array} Returns the new empty array.\n * @example\n *\n * var arrays = _.times(2, _.stubArray);\n *\n * console.log(arrays);\n * // => [[], []]\n *\n * console.log(arrays[0] === arrays[1]);\n * // => false\n */\nfunction stubArray() {\n return [];\n}\n\n/**\n * This method returns `false`.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {boolean} Returns `false`.\n * @example\n *\n * _.times(2, _.stubFalse);\n * // => [false, false]\n */\nfunction stubFalse() {\n return false;\n}\n\nmodule.exports = isEqual;\n","import cloneDeep = require('lodash.clonedeep');\nimport isEqual = require('lodash.isequal');\n\ninterface AttributeMap {\n [key: string]: unknown;\n}\n\nnamespace AttributeMap {\n export function compose(\n a: AttributeMap = {},\n b: AttributeMap = {},\n keepNull = false,\n ): AttributeMap | undefined {\n if (typeof a !== 'object') {\n a = {};\n }\n if (typeof b !== 'object') {\n b = {};\n }\n let attributes = cloneDeep(b);\n if (!keepNull) {\n attributes = Object.keys(attributes).reduce((copy, key) => {\n if (attributes[key] != null) {\n copy[key] = attributes[key];\n }\n return copy;\n }, {});\n }\n for (const key in a) {\n if (a[key] !== undefined && b[key] === undefined) {\n attributes[key] = a[key];\n }\n }\n return Object.keys(attributes).length > 0 ? attributes : undefined;\n }\n\n export function diff(\n a: AttributeMap = {},\n b: AttributeMap = {},\n ): AttributeMap | undefined {\n if (typeof a !== 'object') {\n a = {};\n }\n if (typeof b !== 'object') {\n b = {};\n }\n const attributes = Object.keys(a)\n .concat(Object.keys(b))\n .reduce((attrs, key) => {\n if (!isEqual(a[key], b[key])) {\n attrs[key] = b[key] === undefined ? null : b[key];\n }\n return attrs;\n }, {});\n return Object.keys(attributes).length > 0 ? attributes : undefined;\n }\n\n export function invert(\n attr: AttributeMap = {},\n base: AttributeMap = {},\n ): AttributeMap {\n attr = attr || {};\n const baseInverted = Object.keys(base).reduce((memo, key) => {\n if (base[key] !== attr[key] && attr[key] !== undefined) {\n memo[key] = base[key];\n }\n return memo;\n }, {});\n return Object.keys(attr).reduce((memo, key) => {\n if (attr[key] !== base[key] && base[key] === undefined) {\n memo[key] = null;\n }\n return memo;\n }, baseInverted);\n }\n\n export function transform(\n a: AttributeMap | undefined,\n b: AttributeMap | undefined,\n priority = false,\n ): AttributeMap | undefined {\n if (typeof a !== 'object') {\n return b;\n }\n if (typeof b !== 'object') {\n return undefined;\n }\n if (!priority) {\n return b; // b simply overwrites us without priority\n }\n const attributes = Object.keys(b).reduce((attrs, key) => {\n if (a[key] === undefined) {\n attrs[key] = b[key]; // null is a valid value\n }\n return attrs;\n }, {});\n return Object.keys(attributes).length > 0 ? attributes : undefined;\n }\n}\n\nexport default AttributeMap;\n","import * as diff from 'fast-diff';\nimport cloneDeep = require('lodash.clonedeep');\nimport isEqual = require('lodash.isequal');\nimport AttributeMap from './AttributeMap';\nimport Op from './Op';\nimport OpIterator from './OpIterator';\n\nconst NULL_CHARACTER = String.fromCharCode(0); // Placeholder char for embed in diff()\n\ninterface EmbedHandler {\n compose(a: T, b: T, keepNull: boolean): T;\n invert(a: T, b: T): T;\n transform(a: T, b: T, priority: boolean): T;\n}\n\nconst getEmbedTypeAndData = (\n a: Op['insert'] | Op['retain'],\n b: Op['insert'],\n): [string, unknown, unknown] => {\n if (typeof a !== 'object' || a === null) {\n throw new Error(`cannot retain a ${typeof a}`);\n }\n if (typeof b !== 'object' || b === null) {\n throw new Error(`cannot retain a ${typeof b}`);\n }\n const embedType = Object.keys(a)[0];\n if (!embedType || embedType !== Object.keys(b)[0]) {\n throw new Error(\n `embed types not matched: ${embedType} != ${Object.keys(b)[0]}`,\n );\n }\n return [embedType, a[embedType], b[embedType]];\n};\n\nclass Delta {\n static Op = Op;\n static OpIterator = OpIterator;\n static AttributeMap = AttributeMap;\n private static handlers: { [embedType: string]: EmbedHandler } = {};\n\n static registerEmbed(embedType: string, handler: EmbedHandler): void {\n this.handlers[embedType] = handler;\n }\n\n static unregisterEmbed(embedType: string): void {\n delete this.handlers[embedType];\n }\n\n private static getHandler(embedType: string): EmbedHandler {\n const handler = this.handlers[embedType];\n if (!handler) {\n throw new Error(`no handlers for embed type \"${embedType}\"`);\n }\n return handler;\n }\n\n ops: Op[];\n constructor(ops?: Op[] | { ops: Op[] }) {\n // Assume we are given a well formed ops\n if (Array.isArray(ops)) {\n this.ops = ops;\n } else if (ops != null && Array.isArray(ops.ops)) {\n this.ops = ops.ops;\n } else {\n this.ops = [];\n }\n }\n\n insert(\n arg: string | Record,\n attributes?: AttributeMap | null,\n ): this {\n const newOp: Op = {};\n if (typeof arg === 'string' && arg.length === 0) {\n return this;\n }\n newOp.insert = arg;\n if (\n attributes != null &&\n typeof attributes === 'object' &&\n Object.keys(attributes).length > 0\n ) {\n newOp.attributes = attributes;\n }\n return this.push(newOp);\n }\n\n delete(length: number): this {\n if (length <= 0) {\n return this;\n }\n return this.push({ delete: length });\n }\n\n retain(\n length: number | Record,\n attributes?: AttributeMap | null,\n ): this {\n if (typeof length === 'number' && length <= 0) {\n return this;\n }\n const newOp: Op = { retain: length };\n if (\n attributes != null &&\n typeof attributes === 'object' &&\n Object.keys(attributes).length > 0\n ) {\n newOp.attributes = attributes;\n }\n return this.push(newOp);\n }\n\n push(newOp: Op): this {\n let index = this.ops.length;\n let lastOp = this.ops[index - 1];\n newOp = cloneDeep(newOp);\n if (typeof lastOp === 'object') {\n if (\n typeof newOp.delete === 'number' &&\n typeof lastOp.delete === 'number'\n ) {\n this.ops[index - 1] = { delete: lastOp.delete + newOp.delete };\n return this;\n }\n // Since it does not matter if we insert before or after deleting at the same index,\n // always prefer to insert first\n if (typeof lastOp.delete === 'number' && newOp.insert != null) {\n index -= 1;\n lastOp = this.ops[index - 1];\n if (typeof lastOp !== 'object') {\n this.ops.unshift(newOp);\n return this;\n }\n }\n if (isEqual(newOp.attributes, lastOp.attributes)) {\n if (\n typeof newOp.insert === 'string' &&\n typeof lastOp.insert === 'string'\n ) {\n this.ops[index - 1] = { insert: lastOp.insert + newOp.insert };\n if (typeof newOp.attributes === 'object') {\n this.ops[index - 1].attributes = newOp.attributes;\n }\n return this;\n } else if (\n typeof newOp.retain === 'number' &&\n typeof lastOp.retain === 'number'\n ) {\n this.ops[index - 1] = { retain: lastOp.retain + newOp.retain };\n if (typeof newOp.attributes === 'object') {\n this.ops[index - 1].attributes = newOp.attributes;\n }\n return this;\n }\n }\n }\n if (index === this.ops.length) {\n this.ops.push(newOp);\n } else {\n this.ops.splice(index, 0, newOp);\n }\n return this;\n }\n\n chop(): this {\n const lastOp = this.ops[this.ops.length - 1];\n if (lastOp && typeof lastOp.retain === 'number' && !lastOp.attributes) {\n this.ops.pop();\n }\n return this;\n }\n\n filter(predicate: (op: Op, index: number) => boolean): Op[] {\n return this.ops.filter(predicate);\n }\n\n forEach(predicate: (op: Op, index: number) => void): void {\n this.ops.forEach(predicate);\n }\n\n map(predicate: (op: Op, index: number) => T): T[] {\n return this.ops.map(predicate);\n }\n\n partition(predicate: (op: Op) => boolean): [Op[], Op[]] {\n const passed: Op[] = [];\n const failed: Op[] = [];\n this.forEach((op) => {\n const target = predicate(op) ? passed : failed;\n target.push(op);\n });\n return [passed, failed];\n }\n\n reduce(\n predicate: (accum: T, curr: Op, index: number) => T,\n initialValue: T,\n ): T {\n return this.ops.reduce(predicate, initialValue);\n }\n\n changeLength(): number {\n return this.reduce((length, elem) => {\n if (elem.insert) {\n return length + Op.length(elem);\n } else if (elem.delete) {\n return length - elem.delete;\n }\n return length;\n }, 0);\n }\n\n length(): number {\n return this.reduce((length, elem) => {\n return length + Op.length(elem);\n }, 0);\n }\n\n slice(start = 0, end = Infinity): Delta {\n const ops = [];\n const iter = new OpIterator(this.ops);\n let index = 0;\n while (index < end && iter.hasNext()) {\n let nextOp;\n if (index < start) {\n nextOp = iter.next(start - index);\n } else {\n nextOp = iter.next(end - index);\n ops.push(nextOp);\n }\n index += Op.length(nextOp);\n }\n return new Delta(ops);\n }\n\n compose(other: Delta): Delta {\n const thisIter = new OpIterator(this.ops);\n const otherIter = new OpIterator(other.ops);\n const ops = [];\n const firstOther = otherIter.peek();\n if (\n firstOther != null &&\n typeof firstOther.retain === 'number' &&\n firstOther.attributes == null\n ) {\n let firstLeft = firstOther.retain;\n while (\n thisIter.peekType() === 'insert' &&\n thisIter.peekLength() <= firstLeft\n ) {\n firstLeft -= thisIter.peekLength();\n ops.push(thisIter.next());\n }\n if (firstOther.retain - firstLeft > 0) {\n otherIter.next(firstOther.retain - firstLeft);\n }\n }\n const delta = new Delta(ops);\n while (thisIter.hasNext() || otherIter.hasNext()) {\n if (otherIter.peekType() === 'insert') {\n delta.push(otherIter.next());\n } else if (thisIter.peekType() === 'delete') {\n delta.push(thisIter.next());\n } else {\n const length = Math.min(thisIter.peekLength(), otherIter.peekLength());\n const thisOp = thisIter.next(length);\n const otherOp = otherIter.next(length);\n if (otherOp.retain) {\n const newOp: Op = {};\n if (typeof thisOp.retain === 'number') {\n newOp.retain =\n typeof otherOp.retain === 'number' ? length : otherOp.retain;\n } else {\n if (typeof otherOp.retain === 'number') {\n if (thisOp.retain == null) {\n newOp.insert = thisOp.insert;\n } else {\n newOp.retain = thisOp.retain;\n }\n } else {\n const action = thisOp.retain == null ? 'insert' : 'retain';\n const [embedType, thisData, otherData] = getEmbedTypeAndData(\n thisOp[action],\n otherOp.retain,\n );\n const handler = Delta.getHandler(embedType);\n newOp[action] = {\n [embedType]: handler.compose(\n thisData,\n otherData,\n action === 'retain',\n ),\n };\n }\n }\n // Preserve null when composing with a retain, otherwise remove it for inserts\n const attributes = AttributeMap.compose(\n thisOp.attributes,\n otherOp.attributes,\n typeof thisOp.retain === 'number',\n );\n if (attributes) {\n newOp.attributes = attributes;\n }\n delta.push(newOp);\n\n // Optimization if rest of other is just retain\n if (\n !otherIter.hasNext() &&\n isEqual(delta.ops[delta.ops.length - 1], newOp)\n ) {\n const rest = new Delta(thisIter.rest());\n return delta.concat(rest).chop();\n }\n\n // Other op should be delete, we could be an insert or retain\n // Insert + delete cancels out\n } else if (\n typeof otherOp.delete === 'number' &&\n (typeof thisOp.retain === 'number' ||\n (typeof thisOp.retain === 'object' && thisOp.retain !== null))\n ) {\n delta.push(otherOp);\n }\n }\n }\n return delta.chop();\n }\n\n concat(other: Delta): Delta {\n const delta = new Delta(this.ops.slice());\n if (other.ops.length > 0) {\n delta.push(other.ops[0]);\n delta.ops = delta.ops.concat(other.ops.slice(1));\n }\n return delta;\n }\n\n diff(other: Delta, cursor?: number | diff.CursorInfo): Delta {\n if (this.ops === other.ops) {\n return new Delta();\n }\n const strings = [this, other].map((delta) => {\n return delta\n .map((op) => {\n if (op.insert != null) {\n return typeof op.insert === 'string' ? op.insert : NULL_CHARACTER;\n }\n const prep = delta === other ? 'on' : 'with';\n throw new Error('diff() called ' + prep + ' non-document');\n })\n .join('');\n });\n const retDelta = new Delta();\n const diffResult = diff(strings[0], strings[1], cursor, true);\n const thisIter = new OpIterator(this.ops);\n const otherIter = new OpIterator(other.ops);\n diffResult.forEach((component: diff.Diff) => {\n let length = component[1].length;\n while (length > 0) {\n let opLength = 0;\n switch (component[0]) {\n case diff.INSERT:\n opLength = Math.min(otherIter.peekLength(), length);\n retDelta.push(otherIter.next(opLength));\n break;\n case diff.DELETE:\n opLength = Math.min(length, thisIter.peekLength());\n thisIter.next(opLength);\n retDelta.delete(opLength);\n break;\n case diff.EQUAL:\n opLength = Math.min(\n thisIter.peekLength(),\n otherIter.peekLength(),\n length,\n );\n const thisOp = thisIter.next(opLength);\n const otherOp = otherIter.next(opLength);\n if (isEqual(thisOp.insert, otherOp.insert)) {\n retDelta.retain(\n opLength,\n AttributeMap.diff(thisOp.attributes, otherOp.attributes),\n );\n } else {\n retDelta.push(otherOp).delete(opLength);\n }\n break;\n }\n length -= opLength;\n }\n });\n return retDelta.chop();\n }\n\n eachLine(\n predicate: (\n line: Delta,\n attributes: AttributeMap,\n index: number,\n ) => boolean | void,\n newline = '\\n',\n ): void {\n const iter = new OpIterator(this.ops);\n let line = new Delta();\n let i = 0;\n while (iter.hasNext()) {\n if (iter.peekType() !== 'insert') {\n return;\n }\n const thisOp = iter.peek();\n const start = Op.length(thisOp) - iter.peekLength();\n const index =\n typeof thisOp.insert === 'string'\n ? thisOp.insert.indexOf(newline, start) - start\n : -1;\n if (index < 0) {\n line.push(iter.next());\n } else if (index > 0) {\n line.push(iter.next(index));\n } else {\n if (predicate(line, iter.next(1).attributes || {}, i) === false) {\n return;\n }\n i += 1;\n line = new Delta();\n }\n }\n if (line.length() > 0) {\n predicate(line, {}, i);\n }\n }\n\n invert(base: Delta): Delta {\n const inverted = new Delta();\n this.reduce((baseIndex, op) => {\n if (op.insert) {\n inverted.delete(Op.length(op));\n } else if (typeof op.retain === 'number' && op.attributes == null) {\n inverted.retain(op.retain);\n return baseIndex + op.retain;\n } else if (op.delete || typeof op.retain === 'number') {\n const length = (op.delete || op.retain) as number;\n const slice = base.slice(baseIndex, baseIndex + length);\n slice.forEach((baseOp) => {\n if (op.delete) {\n inverted.push(baseOp);\n } else if (op.retain && op.attributes) {\n inverted.retain(\n Op.length(baseOp),\n AttributeMap.invert(op.attributes, baseOp.attributes),\n );\n }\n });\n return baseIndex + length;\n } else if (typeof op.retain === 'object' && op.retain !== null) {\n const slice = base.slice(baseIndex, baseIndex + 1);\n const baseOp = new OpIterator(slice.ops).next();\n const [embedType, opData, baseOpData] = getEmbedTypeAndData(\n op.retain,\n baseOp.insert,\n );\n const handler = Delta.getHandler(embedType);\n inverted.retain(\n { [embedType]: handler.invert(opData, baseOpData) },\n AttributeMap.invert(op.attributes, baseOp.attributes),\n );\n return baseIndex + 1;\n }\n return baseIndex;\n }, 0);\n return inverted.chop();\n }\n\n transform(index: number, priority?: boolean): number;\n transform(other: Delta, priority?: boolean): Delta;\n transform(arg: number | Delta, priority = false): typeof arg {\n priority = !!priority;\n if (typeof arg === 'number') {\n return this.transformPosition(arg, priority);\n }\n const other: Delta = arg;\n const thisIter = new OpIterator(this.ops);\n const otherIter = new OpIterator(other.ops);\n const delta = new Delta();\n while (thisIter.hasNext() || otherIter.hasNext()) {\n if (\n thisIter.peekType() === 'insert' &&\n (priority || otherIter.peekType() !== 'insert')\n ) {\n delta.retain(Op.length(thisIter.next()));\n } else if (otherIter.peekType() === 'insert') {\n delta.push(otherIter.next());\n } else {\n const length = Math.min(thisIter.peekLength(), otherIter.peekLength());\n const thisOp = thisIter.next(length);\n const otherOp = otherIter.next(length);\n if (thisOp.delete) {\n // Our delete either makes their delete redundant or removes their retain\n continue;\n } else if (otherOp.delete) {\n delta.push(otherOp);\n } else {\n const thisData = thisOp.retain;\n const otherData = otherOp.retain;\n let transformedData: Op['retain'] =\n typeof otherData === 'object' && otherData !== null\n ? otherData\n : length;\n if (\n typeof thisData === 'object' &&\n thisData !== null &&\n typeof otherData === 'object' &&\n otherData !== null\n ) {\n const embedType = Object.keys(thisData)[0];\n if (embedType === Object.keys(otherData)[0]) {\n const handler = Delta.getHandler(embedType);\n if (handler) {\n transformedData = {\n [embedType]: handler.transform(\n thisData[embedType],\n otherData[embedType],\n priority,\n ),\n };\n }\n }\n }\n\n // We retain either their retain or insert\n delta.retain(\n transformedData,\n AttributeMap.transform(\n thisOp.attributes,\n otherOp.attributes,\n priority,\n ),\n );\n }\n }\n }\n return delta.chop();\n }\n\n transformPosition(index: number, priority = false): number {\n priority = !!priority;\n const thisIter = new OpIterator(this.ops);\n let offset = 0;\n while (thisIter.hasNext() && offset <= index) {\n const length = thisIter.peekLength();\n const nextType = thisIter.peekType();\n thisIter.next();\n if (nextType === 'delete') {\n index -= Math.min(length, index - offset);\n continue;\n } else if (nextType === 'insert' && (offset < index || !priority)) {\n index += length;\n }\n offset += length;\n }\n return index;\n }\n}\n\nexport default Delta;\n\nexport { Op, OpIterator, AttributeMap };\n\nif (typeof module === 'object') {\n module.exports = Delta;\n module.exports.default = Delta;\n}\n","import AttributeMap from './AttributeMap';\n\ninterface Op {\n // only one property out of {insert, delete, retain} will be present\n insert?: string | Record;\n delete?: number;\n retain?: number | Record;\n\n attributes?: AttributeMap;\n}\n\nnamespace Op {\n export function length(op: Op): number {\n if (typeof op.delete === 'number') {\n return op.delete;\n } else if (typeof op.retain === 'number') {\n return op.retain;\n } else if (typeof op.retain === 'object' && op.retain !== null) {\n return 1;\n } else {\n return typeof op.insert === 'string' ? op.insert.length : 1;\n }\n }\n}\n\nexport default Op;\n","import Op from './Op';\n\nexport default class Iterator {\n ops: Op[];\n index: number;\n offset: number;\n\n constructor(ops: Op[]) {\n this.ops = ops;\n this.index = 0;\n this.offset = 0;\n }\n\n hasNext(): boolean {\n return this.peekLength() < Infinity;\n }\n\n next(length?: number): Op {\n if (!length) {\n length = Infinity;\n }\n const nextOp = this.ops[this.index];\n if (nextOp) {\n const offset = this.offset;\n const opLength = Op.length(nextOp);\n if (length >= opLength - offset) {\n length = opLength - offset;\n this.index += 1;\n this.offset = 0;\n } else {\n this.offset += length;\n }\n if (typeof nextOp.delete === 'number') {\n return { delete: length };\n } else {\n const retOp: Op = {};\n if (nextOp.attributes) {\n retOp.attributes = nextOp.attributes;\n }\n if (typeof nextOp.retain === 'number') {\n retOp.retain = length;\n } else if (\n typeof nextOp.retain === 'object' &&\n nextOp.retain !== null\n ) {\n // offset should === 0, length should === 1\n retOp.retain = nextOp.retain;\n } else if (typeof nextOp.insert === 'string') {\n retOp.insert = nextOp.insert.substr(offset, length);\n } else {\n // offset should === 0, length should === 1\n retOp.insert = nextOp.insert;\n }\n return retOp;\n }\n } else {\n return { retain: Infinity };\n }\n }\n\n peek(): Op {\n return this.ops[this.index];\n }\n\n peekLength(): number {\n if (this.ops[this.index]) {\n // Should never return 0 if our index is being managed correctly\n return Op.length(this.ops[this.index]) - this.offset;\n } else {\n return Infinity;\n }\n }\n\n peekType(): string {\n const op = this.ops[this.index];\n if (op) {\n if (typeof op.delete === 'number') {\n return 'delete';\n } else if (\n typeof op.retain === 'number' ||\n (typeof op.retain === 'object' && op.retain !== null)\n ) {\n return 'retain';\n } else {\n return 'insert';\n }\n }\n return 'retain';\n }\n\n rest(): Op[] {\n if (!this.hasNext()) {\n return [];\n } else if (this.offset === 0) {\n return this.ops.slice(this.index);\n } else {\n const offset = this.offset;\n const index = this.index;\n const next = this.next();\n const rest = this.ops.slice(this.index);\n this.offset = offset;\n this.index = index;\n return [next].concat(rest);\n }\n }\n}\n","/**\n * Removes all key-value entries from the list cache.\n *\n * @private\n * @name clear\n * @memberOf ListCache\n */\nfunction listCacheClear() {\n this.__data__ = [];\n this.size = 0;\n}\n\nexport default listCacheClear;\n","import eq from './eq.js';\n\n/**\n * Gets the index at which the `key` is found in `array` of key-value pairs.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} key The key to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction assocIndexOf(array, key) {\n var length = array.length;\n while (length--) {\n if (eq(array[length][0], key)) {\n return length;\n }\n }\n return -1;\n}\n\nexport default assocIndexOf;\n","import assocIndexOf from './_assocIndexOf.js';\n\n/** Used for built-in method references. */\nvar arrayProto = Array.prototype;\n\n/** Built-in value references. */\nvar splice = arrayProto.splice;\n\n/**\n * Removes `key` and its value from the list cache.\n *\n * @private\n * @name delete\n * @memberOf ListCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction listCacheDelete(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n return false;\n }\n var lastIndex = data.length - 1;\n if (index == lastIndex) {\n data.pop();\n } else {\n splice.call(data, index, 1);\n }\n --this.size;\n return true;\n}\n\nexport default listCacheDelete;\n","import listCacheClear from './_listCacheClear.js';\nimport listCacheDelete from './_listCacheDelete.js';\nimport listCacheGet from './_listCacheGet.js';\nimport listCacheHas from './_listCacheHas.js';\nimport listCacheSet from './_listCacheSet.js';\n\n/**\n * Creates an list cache object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction ListCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `ListCache`.\nListCache.prototype.clear = listCacheClear;\nListCache.prototype['delete'] = listCacheDelete;\nListCache.prototype.get = listCacheGet;\nListCache.prototype.has = listCacheHas;\nListCache.prototype.set = listCacheSet;\n\nexport default ListCache;\n","import assocIndexOf from './_assocIndexOf.js';\n\n/**\n * Gets the list cache value for `key`.\n *\n * @private\n * @name get\n * @memberOf ListCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction listCacheGet(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n return index < 0 ? undefined : data[index][1];\n}\n\nexport default listCacheGet;\n","import assocIndexOf from './_assocIndexOf.js';\n\n/**\n * Checks if a list cache value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf ListCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction listCacheHas(key) {\n return assocIndexOf(this.__data__, key) > -1;\n}\n\nexport default listCacheHas;\n","import assocIndexOf from './_assocIndexOf.js';\n\n/**\n * Sets the list cache `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf ListCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the list cache instance.\n */\nfunction listCacheSet(key, value) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n ++this.size;\n data.push([key, value]);\n } else {\n data[index][1] = value;\n }\n return this;\n}\n\nexport default listCacheSet;\n","import getNative from './_getNative.js';\nimport root from './_root.js';\n\n/* Built-in method references that are verified to be native. */\nvar Map = getNative(root, 'Map');\n\nexport default Map;\n","import getNative from './_getNative.js';\n\n/* Built-in method references that are verified to be native. */\nvar nativeCreate = getNative(Object, 'create');\n\nexport default nativeCreate;\n","import nativeCreate from './_nativeCreate.js';\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Gets the hash value for `key`.\n *\n * @private\n * @name get\n * @memberOf Hash\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction hashGet(key) {\n var data = this.__data__;\n if (nativeCreate) {\n var result = data[key];\n return result === HASH_UNDEFINED ? undefined : result;\n }\n return hasOwnProperty.call(data, key) ? data[key] : undefined;\n}\n\nexport default hashGet;\n","import nativeCreate from './_nativeCreate.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Checks if a hash value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Hash\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction hashHas(key) {\n var data = this.__data__;\n return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);\n}\n\nexport default hashHas;\n","import hashClear from './_hashClear.js';\nimport hashDelete from './_hashDelete.js';\nimport hashGet from './_hashGet.js';\nimport hashHas from './_hashHas.js';\nimport hashSet from './_hashSet.js';\n\n/**\n * Creates a hash object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Hash(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `Hash`.\nHash.prototype.clear = hashClear;\nHash.prototype['delete'] = hashDelete;\nHash.prototype.get = hashGet;\nHash.prototype.has = hashHas;\nHash.prototype.set = hashSet;\n\nexport default Hash;\n","import nativeCreate from './_nativeCreate.js';\n\n/**\n * Removes all key-value entries from the hash.\n *\n * @private\n * @name clear\n * @memberOf Hash\n */\nfunction hashClear() {\n this.__data__ = nativeCreate ? nativeCreate(null) : {};\n this.size = 0;\n}\n\nexport default hashClear;\n","/**\n * Removes `key` and its value from the hash.\n *\n * @private\n * @name delete\n * @memberOf Hash\n * @param {Object} hash The hash to modify.\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction hashDelete(key) {\n var result = this.has(key) && delete this.__data__[key];\n this.size -= result ? 1 : 0;\n return result;\n}\n\nexport default hashDelete;\n","import nativeCreate from './_nativeCreate.js';\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/**\n * Sets the hash `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Hash\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the hash instance.\n */\nfunction hashSet(key, value) {\n var data = this.__data__;\n this.size += this.has(key) ? 0 : 1;\n data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n return this;\n}\n\nexport default hashSet;\n","import isKeyable from './_isKeyable.js';\n\n/**\n * Gets the data for `map`.\n *\n * @private\n * @param {Object} map The map to query.\n * @param {string} key The reference key.\n * @returns {*} Returns the map data.\n */\nfunction getMapData(map, key) {\n var data = map.__data__;\n return isKeyable(key)\n ? data[typeof key == 'string' ? 'string' : 'hash']\n : data.map;\n}\n\nexport default getMapData;\n","/**\n * Checks if `value` is suitable for use as unique object key.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n */\nfunction isKeyable(value) {\n var type = typeof value;\n return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n ? (value !== '__proto__')\n : (value === null);\n}\n\nexport default isKeyable;\n","import mapCacheClear from './_mapCacheClear.js';\nimport mapCacheDelete from './_mapCacheDelete.js';\nimport mapCacheGet from './_mapCacheGet.js';\nimport mapCacheHas from './_mapCacheHas.js';\nimport mapCacheSet from './_mapCacheSet.js';\n\n/**\n * Creates a map cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction MapCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `MapCache`.\nMapCache.prototype.clear = mapCacheClear;\nMapCache.prototype['delete'] = mapCacheDelete;\nMapCache.prototype.get = mapCacheGet;\nMapCache.prototype.has = mapCacheHas;\nMapCache.prototype.set = mapCacheSet;\n\nexport default MapCache;\n","import Hash from './_Hash.js';\nimport ListCache from './_ListCache.js';\nimport Map from './_Map.js';\n\n/**\n * Removes all key-value entries from the map.\n *\n * @private\n * @name clear\n * @memberOf MapCache\n */\nfunction mapCacheClear() {\n this.size = 0;\n this.__data__ = {\n 'hash': new Hash,\n 'map': new (Map || ListCache),\n 'string': new Hash\n };\n}\n\nexport default mapCacheClear;\n","import getMapData from './_getMapData.js';\n\n/**\n * Removes `key` and its value from the map.\n *\n * @private\n * @name delete\n * @memberOf MapCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction mapCacheDelete(key) {\n var result = getMapData(this, key)['delete'](key);\n this.size -= result ? 1 : 0;\n return result;\n}\n\nexport default mapCacheDelete;\n","import getMapData from './_getMapData.js';\n\n/**\n * Gets the map value for `key`.\n *\n * @private\n * @name get\n * @memberOf MapCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction mapCacheGet(key) {\n return getMapData(this, key).get(key);\n}\n\nexport default mapCacheGet;\n","import getMapData from './_getMapData.js';\n\n/**\n * Checks if a map value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf MapCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction mapCacheHas(key) {\n return getMapData(this, key).has(key);\n}\n\nexport default mapCacheHas;\n","import getMapData from './_getMapData.js';\n\n/**\n * Sets the map `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf MapCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the map cache instance.\n */\nfunction mapCacheSet(key, value) {\n var data = getMapData(this, key),\n size = data.size;\n\n data.set(key, value);\n this.size += data.size == size ? 0 : 1;\n return this;\n}\n\nexport default mapCacheSet;\n","import ListCache from './_ListCache.js';\nimport stackClear from './_stackClear.js';\nimport stackDelete from './_stackDelete.js';\nimport stackGet from './_stackGet.js';\nimport stackHas from './_stackHas.js';\nimport stackSet from './_stackSet.js';\n\n/**\n * Creates a stack cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Stack(entries) {\n var data = this.__data__ = new ListCache(entries);\n this.size = data.size;\n}\n\n// Add methods to `Stack`.\nStack.prototype.clear = stackClear;\nStack.prototype['delete'] = stackDelete;\nStack.prototype.get = stackGet;\nStack.prototype.has = stackHas;\nStack.prototype.set = stackSet;\n\nexport default Stack;\n","import ListCache from './_ListCache.js';\n\n/**\n * Removes all key-value entries from the stack.\n *\n * @private\n * @name clear\n * @memberOf Stack\n */\nfunction stackClear() {\n this.__data__ = new ListCache;\n this.size = 0;\n}\n\nexport default stackClear;\n","/**\n * Removes `key` and its value from the stack.\n *\n * @private\n * @name delete\n * @memberOf Stack\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction stackDelete(key) {\n var data = this.__data__,\n result = data['delete'](key);\n\n this.size = data.size;\n return result;\n}\n\nexport default stackDelete;\n","/**\n * Gets the stack value for `key`.\n *\n * @private\n * @name get\n * @memberOf Stack\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction stackGet(key) {\n return this.__data__.get(key);\n}\n\nexport default stackGet;\n","/**\n * Checks if a stack value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Stack\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction stackHas(key) {\n return this.__data__.has(key);\n}\n\nexport default stackHas;\n","import ListCache from './_ListCache.js';\nimport Map from './_Map.js';\nimport MapCache from './_MapCache.js';\n\n/** Used as the size to enable large array optimizations. */\nvar LARGE_ARRAY_SIZE = 200;\n\n/**\n * Sets the stack `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Stack\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the stack cache instance.\n */\nfunction stackSet(key, value) {\n var data = this.__data__;\n if (data instanceof ListCache) {\n var pairs = data.__data__;\n if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {\n pairs.push([key, value]);\n this.size = ++data.size;\n return this;\n }\n data = this.__data__ = new MapCache(pairs);\n }\n data.set(key, value);\n this.size = data.size;\n return this;\n}\n\nexport default stackSet;\n","import root from './_root.js';\n\n/** Built-in value references. */\nvar Symbol = root.Symbol;\n\nexport default Symbol;\n","import root from './_root.js';\n\n/** Built-in value references. */\nvar Uint8Array = root.Uint8Array;\n\nexport default Uint8Array;\n","/**\n * The base implementation of `_.times` without support for iteratee shorthands\n * or max array length checks.\n *\n * @private\n * @param {number} n The number of times to invoke `iteratee`.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the array of results.\n */\nfunction baseTimes(n, iteratee) {\n var index = -1,\n result = Array(n);\n\n while (++index < n) {\n result[index] = iteratee(index);\n }\n return result;\n}\n\nexport default baseTimes;\n","import baseTimes from './_baseTimes.js';\nimport isArguments from './isArguments.js';\nimport isArray from './isArray.js';\nimport isBuffer from './isBuffer.js';\nimport isIndex from './_isIndex.js';\nimport isTypedArray from './isTypedArray.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Creates an array of the enumerable property names of the array-like `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @param {boolean} inherited Specify returning inherited property names.\n * @returns {Array} Returns the array of property names.\n */\nfunction arrayLikeKeys(value, inherited) {\n var isArr = isArray(value),\n isArg = !isArr && isArguments(value),\n isBuff = !isArr && !isArg && isBuffer(value),\n isType = !isArr && !isArg && !isBuff && isTypedArray(value),\n skipIndexes = isArr || isArg || isBuff || isType,\n result = skipIndexes ? baseTimes(value.length, String) : [],\n length = result.length;\n\n for (var key in value) {\n if ((inherited || hasOwnProperty.call(value, key)) &&\n !(skipIndexes && (\n // Safari 9 has enumerable `arguments.length` in strict mode.\n key == 'length' ||\n // Node.js 0.10 has enumerable non-index properties on buffers.\n (isBuff && (key == 'offset' || key == 'parent')) ||\n // PhantomJS 2 has enumerable non-index properties on typed arrays.\n (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||\n // Skip index properties.\n isIndex(key, length)\n ))) {\n result.push(key);\n }\n }\n return result;\n}\n\nexport default arrayLikeKeys;\n","/**\n * Appends the elements of `values` to `array`.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {Array} values The values to append.\n * @returns {Array} Returns `array`.\n */\nfunction arrayPush(array, values) {\n var index = -1,\n length = values.length,\n offset = array.length;\n\n while (++index < length) {\n array[offset + index] = values[index];\n }\n return array;\n}\n\nexport default arrayPush;\n","import baseAssignValue from './_baseAssignValue.js';\nimport eq from './eq.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Assigns `value` to `key` of `object` if the existing value is not equivalent\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction assignValue(object, key, value) {\n var objValue = object[key];\n if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||\n (value === undefined && !(key in object))) {\n baseAssignValue(object, key, value);\n }\n}\n\nexport default assignValue;\n","import defineProperty from './_defineProperty.js';\n\n/**\n * The base implementation of `assignValue` and `assignMergeValue` without\n * value checks.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction baseAssignValue(object, key, value) {\n if (key == '__proto__' && defineProperty) {\n defineProperty(object, key, {\n 'configurable': true,\n 'enumerable': true,\n 'value': value,\n 'writable': true\n });\n } else {\n object[key] = value;\n }\n}\n\nexport default baseAssignValue;\n","import arrayPush from './_arrayPush.js';\nimport isArray from './isArray.js';\n\n/**\n * The base implementation of `getAllKeys` and `getAllKeysIn` which uses\n * `keysFunc` and `symbolsFunc` to get the enumerable property names and\n * symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @param {Function} symbolsFunc The function to get the symbols of `object`.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction baseGetAllKeys(object, keysFunc, symbolsFunc) {\n var result = keysFunc(object);\n return isArray(object) ? result : arrayPush(result, symbolsFunc(object));\n}\n\nexport default baseGetAllKeys;\n","import Symbol from './_Symbol.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\nfunction getRawTag(value) {\n var isOwn = hasOwnProperty.call(value, symToStringTag),\n tag = value[symToStringTag];\n\n try {\n value[symToStringTag] = undefined;\n var unmasked = true;\n } catch (e) {}\n\n var result = nativeObjectToString.call(value);\n if (unmasked) {\n if (isOwn) {\n value[symToStringTag] = tag;\n } else {\n delete value[symToStringTag];\n }\n }\n return result;\n}\n\nexport default getRawTag;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\nfunction objectToString(value) {\n return nativeObjectToString.call(value);\n}\n\nexport default objectToString;\n","import Symbol from './_Symbol.js';\nimport getRawTag from './_getRawTag.js';\nimport objectToString from './_objectToString.js';\n\n/** `Object#toString` result references. */\nvar nullTag = '[object Null]',\n undefinedTag = '[object Undefined]';\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n if (value == null) {\n return value === undefined ? undefinedTag : nullTag;\n }\n return (symToStringTag && symToStringTag in Object(value))\n ? getRawTag(value)\n : objectToString(value);\n}\n\nexport default baseGetTag;\n","/**\n * The base implementation of `_.unary` without support for storing metadata.\n *\n * @private\n * @param {Function} func The function to cap arguments for.\n * @returns {Function} Returns the new capped function.\n */\nfunction baseUnary(func) {\n return function(value) {\n return func(value);\n };\n}\n\nexport default baseUnary;\n","import Uint8Array from './_Uint8Array.js';\n\n/**\n * Creates a clone of `arrayBuffer`.\n *\n * @private\n * @param {ArrayBuffer} arrayBuffer The array buffer to clone.\n * @returns {ArrayBuffer} Returns the cloned array buffer.\n */\nfunction cloneArrayBuffer(arrayBuffer) {\n var result = new arrayBuffer.constructor(arrayBuffer.byteLength);\n new Uint8Array(result).set(new Uint8Array(arrayBuffer));\n return result;\n}\n\nexport default cloneArrayBuffer;\n","import root from './_root.js';\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Built-in value references. */\nvar Buffer = moduleExports ? root.Buffer : undefined,\n allocUnsafe = Buffer ? Buffer.allocUnsafe : undefined;\n\n/**\n * Creates a clone of `buffer`.\n *\n * @private\n * @param {Buffer} buffer The buffer to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Buffer} Returns the cloned buffer.\n */\nfunction cloneBuffer(buffer, isDeep) {\n if (isDeep) {\n return buffer.slice();\n }\n var length = buffer.length,\n result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length);\n\n buffer.copy(result);\n return result;\n}\n\nexport default cloneBuffer;\n","import cloneArrayBuffer from './_cloneArrayBuffer.js';\n\n/**\n * Creates a clone of `typedArray`.\n *\n * @private\n * @param {Object} typedArray The typed array to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the cloned typed array.\n */\nfunction cloneTypedArray(typedArray, isDeep) {\n var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;\n return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);\n}\n\nexport default cloneTypedArray;\n","/**\n * Copies the values of `source` to `array`.\n *\n * @private\n * @param {Array} source The array to copy values from.\n * @param {Array} [array=[]] The array to copy values to.\n * @returns {Array} Returns `array`.\n */\nfunction copyArray(source, array) {\n var index = -1,\n length = source.length;\n\n array || (array = Array(length));\n while (++index < length) {\n array[index] = source[index];\n }\n return array;\n}\n\nexport default copyArray;\n","import assignValue from './_assignValue.js';\nimport baseAssignValue from './_baseAssignValue.js';\n\n/**\n * Copies properties of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy properties from.\n * @param {Array} props The property identifiers to copy.\n * @param {Object} [object={}] The object to copy properties to.\n * @param {Function} [customizer] The function to customize copied values.\n * @returns {Object} Returns `object`.\n */\nfunction copyObject(source, props, object, customizer) {\n var isNew = !object;\n object || (object = {});\n\n var index = -1,\n length = props.length;\n\n while (++index < length) {\n var key = props[index];\n\n var newValue = customizer\n ? customizer(object[key], source[key], key, object, source)\n : undefined;\n\n if (newValue === undefined) {\n newValue = source[key];\n }\n if (isNew) {\n baseAssignValue(object, key, newValue);\n } else {\n assignValue(object, key, newValue);\n }\n }\n return object;\n}\n\nexport default copyObject;\n","import getNative from './_getNative.js';\n\nvar defineProperty = (function() {\n try {\n var func = getNative(Object, 'defineProperty');\n func({}, '', {});\n return func;\n } catch (e) {}\n}());\n\nexport default defineProperty;\n","/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\nexport default freeGlobal;\n","import baseGetAllKeys from './_baseGetAllKeys.js';\nimport getSymbols from './_getSymbols.js';\nimport keys from './keys.js';\n\n/**\n * Creates an array of own enumerable property names and symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction getAllKeys(object) {\n return baseGetAllKeys(object, keys, getSymbols);\n}\n\nexport default getAllKeys;\n","import coreJsData from './_coreJsData.js';\n\n/** Used to detect methods masquerading as native. */\nvar maskSrcKey = (function() {\n var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n return uid ? ('Symbol(src)_1.' + uid) : '';\n}());\n\n/**\n * Checks if `func` has its source masked.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n */\nfunction isMasked(func) {\n return !!maskSrcKey && (maskSrcKey in func);\n}\n\nexport default isMasked;\n","import root from './_root.js';\n\n/** Used to detect overreaching core-js shims. */\nvar coreJsData = root['__core-js_shared__'];\n\nexport default coreJsData;\n","import isFunction from './isFunction.js';\nimport isMasked from './_isMasked.js';\nimport isObject from './isObject.js';\nimport toSource from './_toSource.js';\n\n/**\n * Used to match `RegExp`\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n */\nvar reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g;\n\n/** Used to detect host constructors (Safari). */\nvar reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n/** Used for built-in method references. */\nvar funcProto = Function.prototype,\n objectProto = Object.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Used to detect if a method is native. */\nvar reIsNative = RegExp('^' +\n funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n);\n\n/**\n * The base implementation of `_.isNative` without bad shim checks.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function,\n * else `false`.\n */\nfunction baseIsNative(value) {\n if (!isObject(value) || isMasked(value)) {\n return false;\n }\n var pattern = isFunction(value) ? reIsNative : reIsHostCtor;\n return pattern.test(toSource(value));\n}\n\nexport default baseIsNative;\n","import baseIsNative from './_baseIsNative.js';\nimport getValue from './_getValue.js';\n\n/**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */\nfunction getNative(object, key) {\n var value = getValue(object, key);\n return baseIsNative(value) ? value : undefined;\n}\n\nexport default getNative;\n","/**\n * Gets the value at `key` of `object`.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\nfunction getValue(object, key) {\n return object == null ? undefined : object[key];\n}\n\nexport default getValue;\n","import overArg from './_overArg.js';\n\n/** Built-in value references. */\nvar getPrototype = overArg(Object.getPrototypeOf, Object);\n\nexport default getPrototype;\n","/**\n * A specialized version of `_.filter` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n */\nfunction arrayFilter(array, predicate) {\n var index = -1,\n length = array == null ? 0 : array.length,\n resIndex = 0,\n result = [];\n\n while (++index < length) {\n var value = array[index];\n if (predicate(value, index, array)) {\n result[resIndex++] = value;\n }\n }\n return result;\n}\n\nexport default arrayFilter;\n","import arrayFilter from './_arrayFilter.js';\nimport stubArray from './stubArray.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Built-in value references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeGetSymbols = Object.getOwnPropertySymbols;\n\n/**\n * Creates an array of the own enumerable symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of symbols.\n */\nvar getSymbols = !nativeGetSymbols ? stubArray : function(object) {\n if (object == null) {\n return [];\n }\n object = Object(object);\n return arrayFilter(nativeGetSymbols(object), function(symbol) {\n return propertyIsEnumerable.call(object, symbol);\n });\n};\n\nexport default getSymbols;\n","import getNative from './_getNative.js';\nimport root from './_root.js';\n\n/* Built-in method references that are verified to be native. */\nvar DataView = getNative(root, 'DataView');\n\nexport default DataView;\n","import getNative from './_getNative.js';\nimport root from './_root.js';\n\n/* Built-in method references that are verified to be native. */\nvar Promise = getNative(root, 'Promise');\n\nexport default Promise;\n","import getNative from './_getNative.js';\nimport root from './_root.js';\n\n/* Built-in method references that are verified to be native. */\nvar Set = getNative(root, 'Set');\n\nexport default Set;\n","import getNative from './_getNative.js';\nimport root from './_root.js';\n\n/* Built-in method references that are verified to be native. */\nvar WeakMap = getNative(root, 'WeakMap');\n\nexport default WeakMap;\n","import DataView from './_DataView.js';\nimport Map from './_Map.js';\nimport Promise from './_Promise.js';\nimport Set from './_Set.js';\nimport WeakMap from './_WeakMap.js';\nimport baseGetTag from './_baseGetTag.js';\nimport toSource from './_toSource.js';\n\n/** `Object#toString` result references. */\nvar mapTag = '[object Map]',\n objectTag = '[object Object]',\n promiseTag = '[object Promise]',\n setTag = '[object Set]',\n weakMapTag = '[object WeakMap]';\n\nvar dataViewTag = '[object DataView]';\n\n/** Used to detect maps, sets, and weakmaps. */\nvar dataViewCtorString = toSource(DataView),\n mapCtorString = toSource(Map),\n promiseCtorString = toSource(Promise),\n setCtorString = toSource(Set),\n weakMapCtorString = toSource(WeakMap);\n\n/**\n * Gets the `toStringTag` of `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nvar getTag = baseGetTag;\n\n// Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.\nif ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||\n (Map && getTag(new Map) != mapTag) ||\n (Promise && getTag(Promise.resolve()) != promiseTag) ||\n (Set && getTag(new Set) != setTag) ||\n (WeakMap && getTag(new WeakMap) != weakMapTag)) {\n getTag = function(value) {\n var result = baseGetTag(value),\n Ctor = result == objectTag ? value.constructor : undefined,\n ctorString = Ctor ? toSource(Ctor) : '';\n\n if (ctorString) {\n switch (ctorString) {\n case dataViewCtorString: return dataViewTag;\n case mapCtorString: return mapTag;\n case promiseCtorString: return promiseTag;\n case setCtorString: return setTag;\n case weakMapCtorString: return weakMapTag;\n }\n }\n return result;\n };\n}\n\nexport default getTag;\n","import isObject from './isObject.js';\n\n/** Built-in value references. */\nvar objectCreate = Object.create;\n\n/**\n * The base implementation of `_.create` without support for assigning\n * properties to the created object.\n *\n * @private\n * @param {Object} proto The object to inherit from.\n * @returns {Object} Returns the new object.\n */\nvar baseCreate = (function() {\n function object() {}\n return function(proto) {\n if (!isObject(proto)) {\n return {};\n }\n if (objectCreate) {\n return objectCreate(proto);\n }\n object.prototype = proto;\n var result = new object;\n object.prototype = undefined;\n return result;\n };\n}());\n\nexport default baseCreate;\n","import baseCreate from './_baseCreate.js';\nimport getPrototype from './_getPrototype.js';\nimport isPrototype from './_isPrototype.js';\n\n/**\n * Initializes an object clone.\n *\n * @private\n * @param {Object} object The object to clone.\n * @returns {Object} Returns the initialized clone.\n */\nfunction initCloneObject(object) {\n return (typeof object.constructor == 'function' && !isPrototype(object))\n ? baseCreate(getPrototype(object))\n : {};\n}\n\nexport default initCloneObject;\n","/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/** Used to detect unsigned integer values. */\nvar reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n/**\n * Checks if `value` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n */\nfunction isIndex(value, length) {\n var type = typeof value;\n length = length == null ? MAX_SAFE_INTEGER : length;\n\n return !!length &&\n (type == 'number' ||\n (type != 'symbol' && reIsUint.test(value))) &&\n (value > -1 && value % 1 == 0 && value < length);\n}\n\nexport default isIndex;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Checks if `value` is likely a prototype object.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n */\nfunction isPrototype(value) {\n var Ctor = value && value.constructor,\n proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\n return value === proto;\n}\n\nexport default isPrototype;\n","import freeGlobal from './_freeGlobal.js';\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Detect free variable `process` from Node.js. */\nvar freeProcess = moduleExports && freeGlobal.process;\n\n/** Used to access faster Node.js helpers. */\nvar nodeUtil = (function() {\n try {\n // Use `util.types` for Node.js 10+.\n var types = freeModule && freeModule.require && freeModule.require('util').types;\n\n if (types) {\n return types;\n }\n\n // Legacy `process.binding('util')` for Node.js < 10.\n return freeProcess && freeProcess.binding && freeProcess.binding('util');\n } catch (e) {}\n}());\n\nexport default nodeUtil;\n","/**\n * Creates a unary function that invokes `func` with its argument transformed.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {Function} transform The argument transform.\n * @returns {Function} Returns the new function.\n */\nfunction overArg(func, transform) {\n return function(arg) {\n return func(transform(arg));\n };\n}\n\nexport default overArg;\n","import freeGlobal from './_freeGlobal.js';\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\nexport default root;\n","/** Used for built-in method references. */\nvar funcProto = Function.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/**\n * Converts `func` to its source code.\n *\n * @private\n * @param {Function} func The function to convert.\n * @returns {string} Returns the source code.\n */\nfunction toSource(func) {\n if (func != null) {\n try {\n return funcToString.call(func);\n } catch (e) {}\n try {\n return (func + '');\n } catch (e) {}\n }\n return '';\n}\n\nexport default toSource;\n","import arrayPush from './_arrayPush.js';\nimport getPrototype from './_getPrototype.js';\nimport getSymbols from './_getSymbols.js';\nimport stubArray from './stubArray.js';\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeGetSymbols = Object.getOwnPropertySymbols;\n\n/**\n * Creates an array of the own and inherited enumerable symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of symbols.\n */\nvar getSymbolsIn = !nativeGetSymbols ? stubArray : function(object) {\n var result = [];\n while (object) {\n arrayPush(result, getSymbols(object));\n object = getPrototype(object);\n }\n return result;\n};\n\nexport default getSymbolsIn;\n","import baseGetAllKeys from './_baseGetAllKeys.js';\nimport getSymbolsIn from './_getSymbolsIn.js';\nimport keysIn from './keysIn.js';\n\n/**\n * Creates an array of own and inherited enumerable property names and\n * symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction getAllKeysIn(object) {\n return baseGetAllKeys(object, keysIn, getSymbolsIn);\n}\n\nexport default getAllKeysIn;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Initializes an array clone.\n *\n * @private\n * @param {Array} array The array to clone.\n * @returns {Array} Returns the initialized clone.\n */\nfunction initCloneArray(array) {\n var length = array.length,\n result = new array.constructor(length);\n\n // Add properties assigned by `RegExp#exec`.\n if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) {\n result.index = array.index;\n result.input = array.input;\n }\n return result;\n}\n\nexport default initCloneArray;\n","/** Used to match `RegExp` flags from their coerced string values. */\nvar reFlags = /\\w*$/;\n\n/**\n * Creates a clone of `regexp`.\n *\n * @private\n * @param {Object} regexp The regexp to clone.\n * @returns {Object} Returns the cloned regexp.\n */\nfunction cloneRegExp(regexp) {\n var result = new regexp.constructor(regexp.source, reFlags.exec(regexp));\n result.lastIndex = regexp.lastIndex;\n return result;\n}\n\nexport default cloneRegExp;\n","import Symbol from './_Symbol.js';\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;\n\n/**\n * Creates a clone of the `symbol` object.\n *\n * @private\n * @param {Object} symbol The symbol object to clone.\n * @returns {Object} Returns the cloned symbol object.\n */\nfunction cloneSymbol(symbol) {\n return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {};\n}\n\nexport default cloneSymbol;\n","import cloneArrayBuffer from './_cloneArrayBuffer.js';\nimport cloneDataView from './_cloneDataView.js';\nimport cloneRegExp from './_cloneRegExp.js';\nimport cloneSymbol from './_cloneSymbol.js';\nimport cloneTypedArray from './_cloneTypedArray.js';\n\n/** `Object#toString` result references. */\nvar boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n symbolTag = '[object Symbol]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]',\n float32Tag = '[object Float32Array]',\n float64Tag = '[object Float64Array]',\n int8Tag = '[object Int8Array]',\n int16Tag = '[object Int16Array]',\n int32Tag = '[object Int32Array]',\n uint8Tag = '[object Uint8Array]',\n uint8ClampedTag = '[object Uint8ClampedArray]',\n uint16Tag = '[object Uint16Array]',\n uint32Tag = '[object Uint32Array]';\n\n/**\n * Initializes an object clone based on its `toStringTag`.\n *\n * **Note:** This function only supports cloning values with tags of\n * `Boolean`, `Date`, `Error`, `Map`, `Number`, `RegExp`, `Set`, or `String`.\n *\n * @private\n * @param {Object} object The object to clone.\n * @param {string} tag The `toStringTag` of the object to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the initialized clone.\n */\nfunction initCloneByTag(object, tag, isDeep) {\n var Ctor = object.constructor;\n switch (tag) {\n case arrayBufferTag:\n return cloneArrayBuffer(object);\n\n case boolTag:\n case dateTag:\n return new Ctor(+object);\n\n case dataViewTag:\n return cloneDataView(object, isDeep);\n\n case float32Tag: case float64Tag:\n case int8Tag: case int16Tag: case int32Tag:\n case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag:\n return cloneTypedArray(object, isDeep);\n\n case mapTag:\n return new Ctor;\n\n case numberTag:\n case stringTag:\n return new Ctor(object);\n\n case regexpTag:\n return cloneRegExp(object);\n\n case setTag:\n return new Ctor;\n\n case symbolTag:\n return cloneSymbol(object);\n }\n}\n\nexport default initCloneByTag;\n","import cloneArrayBuffer from './_cloneArrayBuffer.js';\n\n/**\n * Creates a clone of `dataView`.\n *\n * @private\n * @param {Object} dataView The data view to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the cloned data view.\n */\nfunction cloneDataView(dataView, isDeep) {\n var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer;\n return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength);\n}\n\nexport default cloneDataView;\n","import baseIsMap from './_baseIsMap.js';\nimport baseUnary from './_baseUnary.js';\nimport nodeUtil from './_nodeUtil.js';\n\n/* Node.js helper references. */\nvar nodeIsMap = nodeUtil && nodeUtil.isMap;\n\n/**\n * Checks if `value` is classified as a `Map` object.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a map, else `false`.\n * @example\n *\n * _.isMap(new Map);\n * // => true\n *\n * _.isMap(new WeakMap);\n * // => false\n */\nvar isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap;\n\nexport default isMap;\n","import getTag from './_getTag.js';\nimport isObjectLike from './isObjectLike.js';\n\n/** `Object#toString` result references. */\nvar mapTag = '[object Map]';\n\n/**\n * The base implementation of `_.isMap` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a map, else `false`.\n */\nfunction baseIsMap(value) {\n return isObjectLike(value) && getTag(value) == mapTag;\n}\n\nexport default baseIsMap;\n","import baseIsSet from './_baseIsSet.js';\nimport baseUnary from './_baseUnary.js';\nimport nodeUtil from './_nodeUtil.js';\n\n/* Node.js helper references. */\nvar nodeIsSet = nodeUtil && nodeUtil.isSet;\n\n/**\n * Checks if `value` is classified as a `Set` object.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a set, else `false`.\n * @example\n *\n * _.isSet(new Set);\n * // => true\n *\n * _.isSet(new WeakSet);\n * // => false\n */\nvar isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet;\n\nexport default isSet;\n","import getTag from './_getTag.js';\nimport isObjectLike from './isObjectLike.js';\n\n/** `Object#toString` result references. */\nvar setTag = '[object Set]';\n\n/**\n * The base implementation of `_.isSet` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a set, else `false`.\n */\nfunction baseIsSet(value) {\n return isObjectLike(value) && getTag(value) == setTag;\n}\n\nexport default baseIsSet;\n","import Stack from './_Stack.js';\nimport arrayEach from './_arrayEach.js';\nimport assignValue from './_assignValue.js';\nimport baseAssign from './_baseAssign.js';\nimport baseAssignIn from './_baseAssignIn.js';\nimport cloneBuffer from './_cloneBuffer.js';\nimport copyArray from './_copyArray.js';\nimport copySymbols from './_copySymbols.js';\nimport copySymbolsIn from './_copySymbolsIn.js';\nimport getAllKeys from './_getAllKeys.js';\nimport getAllKeysIn from './_getAllKeysIn.js';\nimport getTag from './_getTag.js';\nimport initCloneArray from './_initCloneArray.js';\nimport initCloneByTag from './_initCloneByTag.js';\nimport initCloneObject from './_initCloneObject.js';\nimport isArray from './isArray.js';\nimport isBuffer from './isBuffer.js';\nimport isMap from './isMap.js';\nimport isObject from './isObject.js';\nimport isSet from './isSet.js';\nimport keys from './keys.js';\nimport keysIn from './keysIn.js';\n\n/** Used to compose bitmasks for cloning. */\nvar CLONE_DEEP_FLAG = 1,\n CLONE_FLAT_FLAG = 2,\n CLONE_SYMBOLS_FLAG = 4;\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n errorTag = '[object Error]',\n funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n objectTag = '[object Object]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n symbolTag = '[object Symbol]',\n weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]',\n float32Tag = '[object Float32Array]',\n float64Tag = '[object Float64Array]',\n int8Tag = '[object Int8Array]',\n int16Tag = '[object Int16Array]',\n int32Tag = '[object Int32Array]',\n uint8Tag = '[object Uint8Array]',\n uint8ClampedTag = '[object Uint8ClampedArray]',\n uint16Tag = '[object Uint16Array]',\n uint32Tag = '[object Uint32Array]';\n\n/** Used to identify `toStringTag` values supported by `_.clone`. */\nvar cloneableTags = {};\ncloneableTags[argsTag] = cloneableTags[arrayTag] =\ncloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] =\ncloneableTags[boolTag] = cloneableTags[dateTag] =\ncloneableTags[float32Tag] = cloneableTags[float64Tag] =\ncloneableTags[int8Tag] = cloneableTags[int16Tag] =\ncloneableTags[int32Tag] = cloneableTags[mapTag] =\ncloneableTags[numberTag] = cloneableTags[objectTag] =\ncloneableTags[regexpTag] = cloneableTags[setTag] =\ncloneableTags[stringTag] = cloneableTags[symbolTag] =\ncloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] =\ncloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true;\ncloneableTags[errorTag] = cloneableTags[funcTag] =\ncloneableTags[weakMapTag] = false;\n\n/**\n * The base implementation of `_.clone` and `_.cloneDeep` which tracks\n * traversed objects.\n *\n * @private\n * @param {*} value The value to clone.\n * @param {boolean} bitmask The bitmask flags.\n * 1 - Deep clone\n * 2 - Flatten inherited properties\n * 4 - Clone symbols\n * @param {Function} [customizer] The function to customize cloning.\n * @param {string} [key] The key of `value`.\n * @param {Object} [object] The parent object of `value`.\n * @param {Object} [stack] Tracks traversed objects and their clone counterparts.\n * @returns {*} Returns the cloned value.\n */\nfunction baseClone(value, bitmask, customizer, key, object, stack) {\n var result,\n isDeep = bitmask & CLONE_DEEP_FLAG,\n isFlat = bitmask & CLONE_FLAT_FLAG,\n isFull = bitmask & CLONE_SYMBOLS_FLAG;\n\n if (customizer) {\n result = object ? customizer(value, key, object, stack) : customizer(value);\n }\n if (result !== undefined) {\n return result;\n }\n if (!isObject(value)) {\n return value;\n }\n var isArr = isArray(value);\n if (isArr) {\n result = initCloneArray(value);\n if (!isDeep) {\n return copyArray(value, result);\n }\n } else {\n var tag = getTag(value),\n isFunc = tag == funcTag || tag == genTag;\n\n if (isBuffer(value)) {\n return cloneBuffer(value, isDeep);\n }\n if (tag == objectTag || tag == argsTag || (isFunc && !object)) {\n result = (isFlat || isFunc) ? {} : initCloneObject(value);\n if (!isDeep) {\n return isFlat\n ? copySymbolsIn(value, baseAssignIn(result, value))\n : copySymbols(value, baseAssign(result, value));\n }\n } else {\n if (!cloneableTags[tag]) {\n return object ? value : {};\n }\n result = initCloneByTag(value, tag, isDeep);\n }\n }\n // Check for circular references and return its corresponding clone.\n stack || (stack = new Stack);\n var stacked = stack.get(value);\n if (stacked) {\n return stacked;\n }\n stack.set(value, result);\n\n if (isSet(value)) {\n value.forEach(function(subValue) {\n result.add(baseClone(subValue, bitmask, customizer, subValue, value, stack));\n });\n } else if (isMap(value)) {\n value.forEach(function(subValue, key) {\n result.set(key, baseClone(subValue, bitmask, customizer, key, value, stack));\n });\n }\n\n var keysFunc = isFull\n ? (isFlat ? getAllKeysIn : getAllKeys)\n : (isFlat ? keysIn : keys);\n\n var props = isArr ? undefined : keysFunc(value);\n arrayEach(props || value, function(subValue, key) {\n if (props) {\n key = subValue;\n subValue = value[key];\n }\n // Recursively populate clone (susceptible to call stack limits).\n assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack));\n });\n return result;\n}\n\nexport default baseClone;\n","import copyObject from './_copyObject.js';\nimport getSymbolsIn from './_getSymbolsIn.js';\n\n/**\n * Copies own and inherited symbols of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy symbols from.\n * @param {Object} [object={}] The object to copy symbols to.\n * @returns {Object} Returns `object`.\n */\nfunction copySymbolsIn(source, object) {\n return copyObject(source, getSymbolsIn(source), object);\n}\n\nexport default copySymbolsIn;\n","import copyObject from './_copyObject.js';\nimport keysIn from './keysIn.js';\n\n/**\n * The base implementation of `_.assignIn` without support for multiple sources\n * or `customizer` functions.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @returns {Object} Returns `object`.\n */\nfunction baseAssignIn(object, source) {\n return object && copyObject(source, keysIn(source), object);\n}\n\nexport default baseAssignIn;\n","import copyObject from './_copyObject.js';\nimport getSymbols from './_getSymbols.js';\n\n/**\n * Copies own symbols of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy symbols from.\n * @param {Object} [object={}] The object to copy symbols to.\n * @returns {Object} Returns `object`.\n */\nfunction copySymbols(source, object) {\n return copyObject(source, getSymbols(source), object);\n}\n\nexport default copySymbols;\n","import copyObject from './_copyObject.js';\nimport keys from './keys.js';\n\n/**\n * The base implementation of `_.assign` without support for multiple sources\n * or `customizer` functions.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @returns {Object} Returns `object`.\n */\nfunction baseAssign(object, source) {\n return object && copyObject(source, keys(source), object);\n}\n\nexport default baseAssign;\n","/**\n * A specialized version of `_.forEach` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns `array`.\n */\nfunction arrayEach(array, iteratee) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n if (iteratee(array[index], index, array) === false) {\n break;\n }\n }\n return array;\n}\n\nexport default arrayEach;\n","import baseClone from './_baseClone.js';\n\n/** Used to compose bitmasks for cloning. */\nvar CLONE_DEEP_FLAG = 1,\n CLONE_SYMBOLS_FLAG = 4;\n\n/**\n * This method is like `_.clone` except that it recursively clones `value`.\n *\n * @static\n * @memberOf _\n * @since 1.0.0\n * @category Lang\n * @param {*} value The value to recursively clone.\n * @returns {*} Returns the deep cloned value.\n * @see _.clone\n * @example\n *\n * var objects = [{ 'a': 1 }, { 'b': 2 }];\n *\n * var deep = _.cloneDeep(objects);\n * console.log(deep[0] === objects[0]);\n * // => false\n */\nfunction cloneDeep(value) {\n return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG);\n}\n\nexport default cloneDeep;\n","/**\n * Performs a\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\nfunction eq(value, other) {\n return value === other || (value !== value && other !== other);\n}\n\nexport default eq;\n","import baseGetTag from './_baseGetTag.js';\nimport isObjectLike from './isObjectLike.js';\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]';\n\n/**\n * The base implementation of `_.isArguments`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n */\nfunction baseIsArguments(value) {\n return isObjectLike(value) && baseGetTag(value) == argsTag;\n}\n\nexport default baseIsArguments;\n","import baseIsArguments from './_baseIsArguments.js';\nimport isObjectLike from './isObjectLike.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Built-in value references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/**\n * Checks if `value` is likely an `arguments` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n * else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\nvar isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {\n return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&\n !propertyIsEnumerable.call(value, 'callee');\n};\n\nexport default isArguments;\n","/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\nexport default isArray;\n","import isFunction from './isFunction.js';\nimport isLength from './isLength.js';\n\n/**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\nfunction isArrayLike(value) {\n return value != null && isLength(value.length) && !isFunction(value);\n}\n\nexport default isArrayLike;\n","import root from './_root.js';\nimport stubFalse from './stubFalse.js';\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Built-in value references. */\nvar Buffer = moduleExports ? root.Buffer : undefined;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined;\n\n/**\n * Checks if `value` is a buffer.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.\n * @example\n *\n * _.isBuffer(new Buffer(2));\n * // => true\n *\n * _.isBuffer(new Uint8Array(2));\n * // => false\n */\nvar isBuffer = nativeIsBuffer || stubFalse;\n\nexport default isBuffer;\n","/**\n * This method returns `false`.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {boolean} Returns `false`.\n * @example\n *\n * _.times(2, _.stubFalse);\n * // => [false, false]\n */\nfunction stubFalse() {\n return false;\n}\n\nexport default stubFalse;\n","import MapCache from './_MapCache.js';\nimport setCacheAdd from './_setCacheAdd.js';\nimport setCacheHas from './_setCacheHas.js';\n\n/**\n *\n * Creates an array cache object to store unique values.\n *\n * @private\n * @constructor\n * @param {Array} [values] The values to cache.\n */\nfunction SetCache(values) {\n var index = -1,\n length = values == null ? 0 : values.length;\n\n this.__data__ = new MapCache;\n while (++index < length) {\n this.add(values[index]);\n }\n}\n\n// Add methods to `SetCache`.\nSetCache.prototype.add = SetCache.prototype.push = setCacheAdd;\nSetCache.prototype.has = setCacheHas;\n\nexport default SetCache;\n","/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/**\n * Adds `value` to the array cache.\n *\n * @private\n * @name add\n * @memberOf SetCache\n * @alias push\n * @param {*} value The value to cache.\n * @returns {Object} Returns the cache instance.\n */\nfunction setCacheAdd(value) {\n this.__data__.set(value, HASH_UNDEFINED);\n return this;\n}\n\nexport default setCacheAdd;\n","/**\n * Checks if `value` is in the array cache.\n *\n * @private\n * @name has\n * @memberOf SetCache\n * @param {*} value The value to search for.\n * @returns {number} Returns `true` if `value` is found, else `false`.\n */\nfunction setCacheHas(value) {\n return this.__data__.has(value);\n}\n\nexport default setCacheHas;\n","/**\n * A specialized version of `_.some` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns `true` if any element passes the predicate check,\n * else `false`.\n */\nfunction arraySome(array, predicate) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n if (predicate(array[index], index, array)) {\n return true;\n }\n }\n return false;\n}\n\nexport default arraySome;\n","import SetCache from './_SetCache.js';\nimport arraySome from './_arraySome.js';\nimport cacheHas from './_cacheHas.js';\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n COMPARE_UNORDERED_FLAG = 2;\n\n/**\n * A specialized version of `baseIsEqualDeep` for arrays with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Array} array The array to compare.\n * @param {Array} other The other array to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `array` and `other` objects.\n * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.\n */\nfunction equalArrays(array, other, bitmask, customizer, equalFunc, stack) {\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n arrLength = array.length,\n othLength = other.length;\n\n if (arrLength != othLength && !(isPartial && othLength > arrLength)) {\n return false;\n }\n // Check that cyclic values are equal.\n var arrStacked = stack.get(array);\n var othStacked = stack.get(other);\n if (arrStacked && othStacked) {\n return arrStacked == other && othStacked == array;\n }\n var index = -1,\n result = true,\n seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined;\n\n stack.set(array, other);\n stack.set(other, array);\n\n // Ignore non-index properties.\n while (++index < arrLength) {\n var arrValue = array[index],\n othValue = other[index];\n\n if (customizer) {\n var compared = isPartial\n ? customizer(othValue, arrValue, index, other, array, stack)\n : customizer(arrValue, othValue, index, array, other, stack);\n }\n if (compared !== undefined) {\n if (compared) {\n continue;\n }\n result = false;\n break;\n }\n // Recursively compare arrays (susceptible to call stack limits).\n if (seen) {\n if (!arraySome(other, function(othValue, othIndex) {\n if (!cacheHas(seen, othIndex) &&\n (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {\n return seen.push(othIndex);\n }\n })) {\n result = false;\n break;\n }\n } else if (!(\n arrValue === othValue ||\n equalFunc(arrValue, othValue, bitmask, customizer, stack)\n )) {\n result = false;\n break;\n }\n }\n stack['delete'](array);\n stack['delete'](other);\n return result;\n}\n\nexport default equalArrays;\n","/**\n * Checks if a `cache` value for `key` exists.\n *\n * @private\n * @param {Object} cache The cache to query.\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction cacheHas(cache, key) {\n return cache.has(key);\n}\n\nexport default cacheHas;\n","/**\n * Converts `map` to its key-value pairs.\n *\n * @private\n * @param {Object} map The map to convert.\n * @returns {Array} Returns the key-value pairs.\n */\nfunction mapToArray(map) {\n var index = -1,\n result = Array(map.size);\n\n map.forEach(function(value, key) {\n result[++index] = [key, value];\n });\n return result;\n}\n\nexport default mapToArray;\n","/**\n * Converts `set` to an array of its values.\n *\n * @private\n * @param {Object} set The set to convert.\n * @returns {Array} Returns the values.\n */\nfunction setToArray(set) {\n var index = -1,\n result = Array(set.size);\n\n set.forEach(function(value) {\n result[++index] = value;\n });\n return result;\n}\n\nexport default setToArray;\n","import Symbol from './_Symbol.js';\nimport Uint8Array from './_Uint8Array.js';\nimport eq from './eq.js';\nimport equalArrays from './_equalArrays.js';\nimport mapToArray from './_mapToArray.js';\nimport setToArray from './_setToArray.js';\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n COMPARE_UNORDERED_FLAG = 2;\n\n/** `Object#toString` result references. */\nvar boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n errorTag = '[object Error]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n symbolTag = '[object Symbol]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]';\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;\n\n/**\n * A specialized version of `baseIsEqualDeep` for comparing objects of\n * the same `toStringTag`.\n *\n * **Note:** This function only supports comparing values with tags of\n * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {string} tag The `toStringTag` of the objects to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {\n switch (tag) {\n case dataViewTag:\n if ((object.byteLength != other.byteLength) ||\n (object.byteOffset != other.byteOffset)) {\n return false;\n }\n object = object.buffer;\n other = other.buffer;\n\n case arrayBufferTag:\n if ((object.byteLength != other.byteLength) ||\n !equalFunc(new Uint8Array(object), new Uint8Array(other))) {\n return false;\n }\n return true;\n\n case boolTag:\n case dateTag:\n case numberTag:\n // Coerce booleans to `1` or `0` and dates to milliseconds.\n // Invalid dates are coerced to `NaN`.\n return eq(+object, +other);\n\n case errorTag:\n return object.name == other.name && object.message == other.message;\n\n case regexpTag:\n case stringTag:\n // Coerce regexes to strings and treat strings, primitives and objects,\n // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring\n // for more details.\n return object == (other + '');\n\n case mapTag:\n var convert = mapToArray;\n\n case setTag:\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG;\n convert || (convert = setToArray);\n\n if (object.size != other.size && !isPartial) {\n return false;\n }\n // Assume cyclic values are equal.\n var stacked = stack.get(object);\n if (stacked) {\n return stacked == other;\n }\n bitmask |= COMPARE_UNORDERED_FLAG;\n\n // Recursively compare objects (susceptible to call stack limits).\n stack.set(object, other);\n var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);\n stack['delete'](object);\n return result;\n\n case symbolTag:\n if (symbolValueOf) {\n return symbolValueOf.call(object) == symbolValueOf.call(other);\n }\n }\n return false;\n}\n\nexport default equalByTag;\n","import getAllKeys from './_getAllKeys.js';\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1;\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * A specialized version of `baseIsEqualDeep` for objects with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction equalObjects(object, other, bitmask, customizer, equalFunc, stack) {\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n objProps = getAllKeys(object),\n objLength = objProps.length,\n othProps = getAllKeys(other),\n othLength = othProps.length;\n\n if (objLength != othLength && !isPartial) {\n return false;\n }\n var index = objLength;\n while (index--) {\n var key = objProps[index];\n if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {\n return false;\n }\n }\n // Check that cyclic values are equal.\n var objStacked = stack.get(object);\n var othStacked = stack.get(other);\n if (objStacked && othStacked) {\n return objStacked == other && othStacked == object;\n }\n var result = true;\n stack.set(object, other);\n stack.set(other, object);\n\n var skipCtor = isPartial;\n while (++index < objLength) {\n key = objProps[index];\n var objValue = object[key],\n othValue = other[key];\n\n if (customizer) {\n var compared = isPartial\n ? customizer(othValue, objValue, key, other, object, stack)\n : customizer(objValue, othValue, key, object, other, stack);\n }\n // Recursively compare objects (susceptible to call stack limits).\n if (!(compared === undefined\n ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack))\n : compared\n )) {\n result = false;\n break;\n }\n skipCtor || (skipCtor = key == 'constructor');\n }\n if (result && !skipCtor) {\n var objCtor = object.constructor,\n othCtor = other.constructor;\n\n // Non `Object` object instances with different constructors are not equal.\n if (objCtor != othCtor &&\n ('constructor' in object && 'constructor' in other) &&\n !(typeof objCtor == 'function' && objCtor instanceof objCtor &&\n typeof othCtor == 'function' && othCtor instanceof othCtor)) {\n result = false;\n }\n }\n stack['delete'](object);\n stack['delete'](other);\n return result;\n}\n\nexport default equalObjects;\n","import Stack from './_Stack.js';\nimport equalArrays from './_equalArrays.js';\nimport equalByTag from './_equalByTag.js';\nimport equalObjects from './_equalObjects.js';\nimport getTag from './_getTag.js';\nimport isArray from './isArray.js';\nimport isBuffer from './isBuffer.js';\nimport isTypedArray from './isTypedArray.js';\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1;\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n objectTag = '[object Object]';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * A specialized version of `baseIsEqual` for arrays and objects which performs\n * deep comparisons and tracks traversed objects enabling objects with circular\n * references to be compared.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} [stack] Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {\n var objIsArr = isArray(object),\n othIsArr = isArray(other),\n objTag = objIsArr ? arrayTag : getTag(object),\n othTag = othIsArr ? arrayTag : getTag(other);\n\n objTag = objTag == argsTag ? objectTag : objTag;\n othTag = othTag == argsTag ? objectTag : othTag;\n\n var objIsObj = objTag == objectTag,\n othIsObj = othTag == objectTag,\n isSameTag = objTag == othTag;\n\n if (isSameTag && isBuffer(object)) {\n if (!isBuffer(other)) {\n return false;\n }\n objIsArr = true;\n objIsObj = false;\n }\n if (isSameTag && !objIsObj) {\n stack || (stack = new Stack);\n return (objIsArr || isTypedArray(object))\n ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)\n : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);\n }\n if (!(bitmask & COMPARE_PARTIAL_FLAG)) {\n var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),\n othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');\n\n if (objIsWrapped || othIsWrapped) {\n var objUnwrapped = objIsWrapped ? object.value() : object,\n othUnwrapped = othIsWrapped ? other.value() : other;\n\n stack || (stack = new Stack);\n return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);\n }\n }\n if (!isSameTag) {\n return false;\n }\n stack || (stack = new Stack);\n return equalObjects(object, other, bitmask, customizer, equalFunc, stack);\n}\n\nexport default baseIsEqualDeep;\n","import baseIsEqualDeep from './_baseIsEqualDeep.js';\nimport isObjectLike from './isObjectLike.js';\n\n/**\n * The base implementation of `_.isEqual` which supports partial comparisons\n * and tracks traversed objects.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @param {boolean} bitmask The bitmask flags.\n * 1 - Unordered comparison\n * 2 - Partial comparison\n * @param {Function} [customizer] The function to customize comparisons.\n * @param {Object} [stack] Tracks traversed `value` and `other` objects.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n */\nfunction baseIsEqual(value, other, bitmask, customizer, stack) {\n if (value === other) {\n return true;\n }\n if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {\n return value !== value && other !== other;\n }\n return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);\n}\n\nexport default baseIsEqual;\n","import baseIsEqual from './_baseIsEqual.js';\n\n/**\n * Performs a deep comparison between two values to determine if they are\n * equivalent.\n *\n * **Note:** This method supports comparing arrays, array buffers, booleans,\n * date objects, error objects, maps, numbers, `Object` objects, regexes,\n * sets, strings, symbols, and typed arrays. `Object` objects are compared\n * by their own, not inherited, enumerable properties. Functions and DOM\n * nodes are compared by strict equality, i.e. `===`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.isEqual(object, other);\n * // => true\n *\n * object === other;\n * // => false\n */\nfunction isEqual(value, other) {\n return baseIsEqual(value, other);\n}\n\nexport default isEqual;\n","import baseGetTag from './_baseGetTag.js';\nimport isObject from './isObject.js';\n\n/** `Object#toString` result references. */\nvar asyncTag = '[object AsyncFunction]',\n funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]',\n proxyTag = '[object Proxy]';\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n if (!isObject(value)) {\n return false;\n }\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in Safari 9 which returns 'object' for typed arrays and other constructors.\n var tag = baseGetTag(value);\n return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\n}\n\nexport default isFunction;\n","/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This method is loosely based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\nfunction isLength(value) {\n return typeof value == 'number' &&\n value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\nexport default isLength;\n","/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return value != null && (type == 'object' || type == 'function');\n}\n\nexport default isObject;\n","/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return value != null && typeof value == 'object';\n}\n\nexport default isObjectLike;\n","import baseGetTag from './_baseGetTag.js';\nimport isLength from './isLength.js';\nimport isObjectLike from './isObjectLike.js';\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n errorTag = '[object Error]',\n funcTag = '[object Function]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n objectTag = '[object Object]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]',\n float32Tag = '[object Float32Array]',\n float64Tag = '[object Float64Array]',\n int8Tag = '[object Int8Array]',\n int16Tag = '[object Int16Array]',\n int32Tag = '[object Int32Array]',\n uint8Tag = '[object Uint8Array]',\n uint8ClampedTag = '[object Uint8ClampedArray]',\n uint16Tag = '[object Uint16Array]',\n uint32Tag = '[object Uint32Array]';\n\n/** Used to identify `toStringTag` values of typed arrays. */\nvar typedArrayTags = {};\ntypedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\ntypedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\ntypedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\ntypedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\ntypedArrayTags[uint32Tag] = true;\ntypedArrayTags[argsTag] = typedArrayTags[arrayTag] =\ntypedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\ntypedArrayTags[dataViewTag] = typedArrayTags[dateTag] =\ntypedArrayTags[errorTag] = typedArrayTags[funcTag] =\ntypedArrayTags[mapTag] = typedArrayTags[numberTag] =\ntypedArrayTags[objectTag] = typedArrayTags[regexpTag] =\ntypedArrayTags[setTag] = typedArrayTags[stringTag] =\ntypedArrayTags[weakMapTag] = false;\n\n/**\n * The base implementation of `_.isTypedArray` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n */\nfunction baseIsTypedArray(value) {\n return isObjectLike(value) &&\n isLength(value.length) && !!typedArrayTags[baseGetTag(value)];\n}\n\nexport default baseIsTypedArray;\n","import baseIsTypedArray from './_baseIsTypedArray.js';\nimport baseUnary from './_baseUnary.js';\nimport nodeUtil from './_nodeUtil.js';\n\n/* Node.js helper references. */\nvar nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;\n\n/**\n * Checks if `value` is classified as a typed array.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n * @example\n *\n * _.isTypedArray(new Uint8Array);\n * // => true\n *\n * _.isTypedArray([]);\n * // => false\n */\nvar isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;\n\nexport default isTypedArray;\n","import overArg from './_overArg.js';\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeKeys = overArg(Object.keys, Object);\n\nexport default nativeKeys;\n","import isPrototype from './_isPrototype.js';\nimport nativeKeys from './_nativeKeys.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeys(object) {\n if (!isPrototype(object)) {\n return nativeKeys(object);\n }\n var result = [];\n for (var key in Object(object)) {\n if (hasOwnProperty.call(object, key) && key != 'constructor') {\n result.push(key);\n }\n }\n return result;\n}\n\nexport default baseKeys;\n","import arrayLikeKeys from './_arrayLikeKeys.js';\nimport baseKeys from './_baseKeys.js';\nimport isArrayLike from './isArrayLike.js';\n\n/**\n * Creates an array of the own enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects. See the\n * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * for more details.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keys(new Foo);\n * // => ['a', 'b'] (iteration order is not guaranteed)\n *\n * _.keys('hi');\n * // => ['0', '1']\n */\nfunction keys(object) {\n return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);\n}\n\nexport default keys;\n","import isObject from './isObject.js';\nimport isPrototype from './_isPrototype.js';\nimport nativeKeysIn from './_nativeKeysIn.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeysIn(object) {\n if (!isObject(object)) {\n return nativeKeysIn(object);\n }\n var isProto = isPrototype(object),\n result = [];\n\n for (var key in object) {\n if (!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {\n result.push(key);\n }\n }\n return result;\n}\n\nexport default baseKeysIn;\n","/**\n * This function is like\n * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * except that it includes inherited enumerable properties.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction nativeKeysIn(object) {\n var result = [];\n if (object != null) {\n for (var key in Object(object)) {\n result.push(key);\n }\n }\n return result;\n}\n\nexport default nativeKeysIn;\n","import arrayLikeKeys from './_arrayLikeKeys.js';\nimport baseKeysIn from './_baseKeysIn.js';\nimport isArrayLike from './isArrayLike.js';\n\n/**\n * Creates an array of the own and inherited enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keysIn(new Foo);\n * // => ['a', 'b', 'c'] (iteration order is not guaranteed)\n */\nfunction keysIn(object) {\n return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);\n}\n\nexport default keysIn;\n","/** Used to detect hot functions by number of calls within a span of milliseconds. */\nvar HOT_COUNT = 800,\n HOT_SPAN = 16;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeNow = Date.now;\n\n/**\n * Creates a function that'll short out and invoke `identity` instead\n * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`\n * milliseconds.\n *\n * @private\n * @param {Function} func The function to restrict.\n * @returns {Function} Returns the new shortable function.\n */\nfunction shortOut(func) {\n var count = 0,\n lastCalled = 0;\n\n return function() {\n var stamp = nativeNow(),\n remaining = HOT_SPAN - (stamp - lastCalled);\n\n lastCalled = stamp;\n if (remaining > 0) {\n if (++count >= HOT_COUNT) {\n return arguments[0];\n }\n } else {\n count = 0;\n }\n return func.apply(undefined, arguments);\n };\n}\n\nexport default shortOut;\n","import baseRest from './_baseRest.js';\nimport isIterateeCall from './_isIterateeCall.js';\n\n/**\n * Creates a function like `_.assign`.\n *\n * @private\n * @param {Function} assigner The function to assign values.\n * @returns {Function} Returns the new assigner function.\n */\nfunction createAssigner(assigner) {\n return baseRest(function(object, sources) {\n var index = -1,\n length = sources.length,\n customizer = length > 1 ? sources[length - 1] : undefined,\n guard = length > 2 ? sources[2] : undefined;\n\n customizer = (assigner.length > 3 && typeof customizer == 'function')\n ? (length--, customizer)\n : undefined;\n\n if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n customizer = length < 3 ? undefined : customizer;\n length = 1;\n }\n object = Object(object);\n while (++index < length) {\n var source = sources[index];\n if (source) {\n assigner(object, source, index, customizer);\n }\n }\n return object;\n });\n}\n\nexport default createAssigner;\n","import baseAssignValue from './_baseAssignValue.js';\nimport eq from './eq.js';\n\n/**\n * This function is like `assignValue` except that it doesn't assign\n * `undefined` values.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction assignMergeValue(object, key, value) {\n if ((value !== undefined && !eq(object[key], value)) ||\n (value === undefined && !(key in object))) {\n baseAssignValue(object, key, value);\n }\n}\n\nexport default assignMergeValue;\n","import createBaseFor from './_createBaseFor.js';\n\n/**\n * The base implementation of `baseForOwn` which iterates over `object`\n * properties returned by `keysFunc` and invokes `iteratee` for each property.\n * Iteratee functions may exit iteration early by explicitly returning `false`.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @returns {Object} Returns `object`.\n */\nvar baseFor = createBaseFor();\n\nexport default baseFor;\n","/**\n * Creates a base function for methods like `_.forIn` and `_.forOwn`.\n *\n * @private\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new base function.\n */\nfunction createBaseFor(fromRight) {\n return function(object, iteratee, keysFunc) {\n var index = -1,\n iterable = Object(object),\n props = keysFunc(object),\n length = props.length;\n\n while (length--) {\n var key = props[fromRight ? length : ++index];\n if (iteratee(iterable[key], key, iterable) === false) {\n break;\n }\n }\n return object;\n };\n}\n\nexport default createBaseFor;\n","import baseGetTag from './_baseGetTag.js';\nimport getPrototype from './_getPrototype.js';\nimport isObjectLike from './isObjectLike.js';\n\n/** `Object#toString` result references. */\nvar objectTag = '[object Object]';\n\n/** Used for built-in method references. */\nvar funcProto = Function.prototype,\n objectProto = Object.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Used to infer the `Object` constructor. */\nvar objectCtorString = funcToString.call(Object);\n\n/**\n * Checks if `value` is a plain object, that is, an object created by the\n * `Object` constructor or one with a `[[Prototype]]` of `null`.\n *\n * @static\n * @memberOf _\n * @since 0.8.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * }\n *\n * _.isPlainObject(new Foo);\n * // => false\n *\n * _.isPlainObject([1, 2, 3]);\n * // => false\n *\n * _.isPlainObject({ 'x': 0, 'y': 0 });\n * // => true\n *\n * _.isPlainObject(Object.create(null));\n * // => true\n */\nfunction isPlainObject(value) {\n if (!isObjectLike(value) || baseGetTag(value) != objectTag) {\n return false;\n }\n var proto = getPrototype(value);\n if (proto === null) {\n return true;\n }\n var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor;\n return typeof Ctor == 'function' && Ctor instanceof Ctor &&\n funcToString.call(Ctor) == objectCtorString;\n}\n\nexport default isPlainObject;\n","/**\n * Gets the value at `key`, unless `key` is \"__proto__\" or \"constructor\".\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\nfunction safeGet(object, key) {\n if (key === 'constructor' && typeof object[key] === 'function') {\n return;\n }\n\n if (key == '__proto__') {\n return;\n }\n\n return object[key];\n}\n\nexport default safeGet;\n","import assignMergeValue from './_assignMergeValue.js';\nimport cloneBuffer from './_cloneBuffer.js';\nimport cloneTypedArray from './_cloneTypedArray.js';\nimport copyArray from './_copyArray.js';\nimport initCloneObject from './_initCloneObject.js';\nimport isArguments from './isArguments.js';\nimport isArray from './isArray.js';\nimport isArrayLikeObject from './isArrayLikeObject.js';\nimport isBuffer from './isBuffer.js';\nimport isFunction from './isFunction.js';\nimport isObject from './isObject.js';\nimport isPlainObject from './isPlainObject.js';\nimport isTypedArray from './isTypedArray.js';\nimport safeGet from './_safeGet.js';\nimport toPlainObject from './toPlainObject.js';\n\n/**\n * A specialized version of `baseMerge` for arrays and objects which performs\n * deep merges and tracks traversed objects enabling objects with circular\n * references to be merged.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @param {string} key The key of the value to merge.\n * @param {number} srcIndex The index of `source`.\n * @param {Function} mergeFunc The function to merge values.\n * @param {Function} [customizer] The function to customize assigned values.\n * @param {Object} [stack] Tracks traversed source values and their merged\n * counterparts.\n */\nfunction baseMergeDeep(object, source, key, srcIndex, mergeFunc, customizer, stack) {\n var objValue = safeGet(object, key),\n srcValue = safeGet(source, key),\n stacked = stack.get(srcValue);\n\n if (stacked) {\n assignMergeValue(object, key, stacked);\n return;\n }\n var newValue = customizer\n ? customizer(objValue, srcValue, (key + ''), object, source, stack)\n : undefined;\n\n var isCommon = newValue === undefined;\n\n if (isCommon) {\n var isArr = isArray(srcValue),\n isBuff = !isArr && isBuffer(srcValue),\n isTyped = !isArr && !isBuff && isTypedArray(srcValue);\n\n newValue = srcValue;\n if (isArr || isBuff || isTyped) {\n if (isArray(objValue)) {\n newValue = objValue;\n }\n else if (isArrayLikeObject(objValue)) {\n newValue = copyArray(objValue);\n }\n else if (isBuff) {\n isCommon = false;\n newValue = cloneBuffer(srcValue, true);\n }\n else if (isTyped) {\n isCommon = false;\n newValue = cloneTypedArray(srcValue, true);\n }\n else {\n newValue = [];\n }\n }\n else if (isPlainObject(srcValue) || isArguments(srcValue)) {\n newValue = objValue;\n if (isArguments(objValue)) {\n newValue = toPlainObject(objValue);\n }\n else if (!isObject(objValue) || isFunction(objValue)) {\n newValue = initCloneObject(srcValue);\n }\n }\n else {\n isCommon = false;\n }\n }\n if (isCommon) {\n // Recursively merge objects and arrays (susceptible to call stack limits).\n stack.set(srcValue, newValue);\n mergeFunc(newValue, srcValue, srcIndex, customizer, stack);\n stack['delete'](srcValue);\n }\n assignMergeValue(object, key, newValue);\n}\n\nexport default baseMergeDeep;\n","import isArrayLike from './isArrayLike.js';\nimport isObjectLike from './isObjectLike.js';\n\n/**\n * This method is like `_.isArrayLike` except that it also checks if `value`\n * is an object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array-like object,\n * else `false`.\n * @example\n *\n * _.isArrayLikeObject([1, 2, 3]);\n * // => true\n *\n * _.isArrayLikeObject(document.body.children);\n * // => true\n *\n * _.isArrayLikeObject('abc');\n * // => false\n *\n * _.isArrayLikeObject(_.noop);\n * // => false\n */\nfunction isArrayLikeObject(value) {\n return isObjectLike(value) && isArrayLike(value);\n}\n\nexport default isArrayLikeObject;\n","import copyObject from './_copyObject.js';\nimport keysIn from './keysIn.js';\n\n/**\n * Converts `value` to a plain object flattening inherited enumerable string\n * keyed properties of `value` to own properties of the plain object.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {Object} Returns the converted plain object.\n * @example\n *\n * function Foo() {\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.assign({ 'a': 1 }, new Foo);\n * // => { 'a': 1, 'b': 2 }\n *\n * _.assign({ 'a': 1 }, _.toPlainObject(new Foo));\n * // => { 'a': 1, 'b': 2, 'c': 3 }\n */\nfunction toPlainObject(value) {\n return copyObject(value, keysIn(value));\n}\n\nexport default toPlainObject;\n","import Stack from './_Stack.js';\nimport assignMergeValue from './_assignMergeValue.js';\nimport baseFor from './_baseFor.js';\nimport baseMergeDeep from './_baseMergeDeep.js';\nimport isObject from './isObject.js';\nimport keysIn from './keysIn.js';\nimport safeGet from './_safeGet.js';\n\n/**\n * The base implementation of `_.merge` without support for multiple sources.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @param {number} srcIndex The index of `source`.\n * @param {Function} [customizer] The function to customize merged values.\n * @param {Object} [stack] Tracks traversed source values and their merged\n * counterparts.\n */\nfunction baseMerge(object, source, srcIndex, customizer, stack) {\n if (object === source) {\n return;\n }\n baseFor(source, function(srcValue, key) {\n stack || (stack = new Stack);\n if (isObject(srcValue)) {\n baseMergeDeep(object, source, key, srcIndex, baseMerge, customizer, stack);\n }\n else {\n var newValue = customizer\n ? customizer(safeGet(object, key), srcValue, (key + ''), object, source, stack)\n : undefined;\n\n if (newValue === undefined) {\n newValue = srcValue;\n }\n assignMergeValue(object, key, newValue);\n }\n }, keysIn);\n}\n\nexport default baseMerge;\n","/**\n * This method returns the first argument it receives.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @param {*} value Any value.\n * @returns {*} Returns `value`.\n * @example\n *\n * var object = { 'a': 1 };\n *\n * console.log(_.identity(object) === object);\n * // => true\n */\nfunction identity(value) {\n return value;\n}\n\nexport default identity;\n","import apply from './_apply.js';\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max;\n\n/**\n * A specialized version of `baseRest` which transforms the rest array.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @param {Function} transform The rest array transform.\n * @returns {Function} Returns the new function.\n */\nfunction overRest(func, start, transform) {\n start = nativeMax(start === undefined ? (func.length - 1) : start, 0);\n return function() {\n var args = arguments,\n index = -1,\n length = nativeMax(args.length - start, 0),\n array = Array(length);\n\n while (++index < length) {\n array[index] = args[start + index];\n }\n index = -1;\n var otherArgs = Array(start + 1);\n while (++index < start) {\n otherArgs[index] = args[index];\n }\n otherArgs[start] = transform(array);\n return apply(func, this, otherArgs);\n };\n}\n\nexport default overRest;\n","import constant from './constant.js';\nimport defineProperty from './_defineProperty.js';\nimport identity from './identity.js';\n\n/**\n * The base implementation of `setToString` without support for hot loop shorting.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The `toString` result.\n * @returns {Function} Returns `func`.\n */\nvar baseSetToString = !defineProperty ? identity : function(func, string) {\n return defineProperty(func, 'toString', {\n 'configurable': true,\n 'enumerable': false,\n 'value': constant(string),\n 'writable': true\n });\n};\n\nexport default baseSetToString;\n","/**\n * Creates a function that returns `value`.\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Util\n * @param {*} value The value to return from the new function.\n * @returns {Function} Returns the new constant function.\n * @example\n *\n * var objects = _.times(2, _.constant({ 'a': 1 }));\n *\n * console.log(objects);\n * // => [{ 'a': 1 }, { 'a': 1 }]\n *\n * console.log(objects[0] === objects[1]);\n * // => true\n */\nfunction constant(value) {\n return function() {\n return value;\n };\n}\n\nexport default constant;\n","import baseSetToString from './_baseSetToString.js';\nimport shortOut from './_shortOut.js';\n\n/**\n * Sets the `toString` method of `func` to return `string`.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The `toString` result.\n * @returns {Function} Returns `func`.\n */\nvar setToString = shortOut(baseSetToString);\n\nexport default setToString;\n","import identity from './identity.js';\nimport overRest from './_overRest.js';\nimport setToString from './_setToString.js';\n\n/**\n * The base implementation of `_.rest` which doesn't validate or coerce arguments.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @returns {Function} Returns the new function.\n */\nfunction baseRest(func, start) {\n return setToString(overRest(func, start, identity), func + '');\n}\n\nexport default baseRest;\n","/**\n * A faster alternative to `Function#apply`, this function invokes `func`\n * with the `this` binding of `thisArg` and the arguments of `args`.\n *\n * @private\n * @param {Function} func The function to invoke.\n * @param {*} thisArg The `this` binding of `func`.\n * @param {Array} args The arguments to invoke `func` with.\n * @returns {*} Returns the result of `func`.\n */\nfunction apply(func, thisArg, args) {\n switch (args.length) {\n case 0: return func.call(thisArg);\n case 1: return func.call(thisArg, args[0]);\n case 2: return func.call(thisArg, args[0], args[1]);\n case 3: return func.call(thisArg, args[0], args[1], args[2]);\n }\n return func.apply(thisArg, args);\n}\n\nexport default apply;\n","import baseMerge from './_baseMerge.js';\nimport createAssigner from './_createAssigner.js';\n\n/**\n * This method is like `_.assign` except that it recursively merges own and\n * inherited enumerable string keyed properties of source objects into the\n * destination object. Source properties that resolve to `undefined` are\n * skipped if a destination value exists. Array and plain object properties\n * are merged recursively. Other objects and value types are overridden by\n * assignment. Source objects are applied from left to right. Subsequent\n * sources overwrite property assignments of previous sources.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 0.5.0\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @example\n *\n * var object = {\n * 'a': [{ 'b': 2 }, { 'd': 4 }]\n * };\n *\n * var other = {\n * 'a': [{ 'c': 3 }, { 'e': 5 }]\n * };\n *\n * _.merge(object, other);\n * // => { 'a': [{ 'b': 2, 'c': 3 }, { 'd': 4, 'e': 5 }] }\n */\nvar merge = createAssigner(function(object, source, srcIndex) {\n baseMerge(object, source, srcIndex);\n});\n\nexport default merge;\n","import eq from './eq.js';\nimport isArrayLike from './isArrayLike.js';\nimport isIndex from './_isIndex.js';\nimport isObject from './isObject.js';\n\n/**\n * Checks if the given arguments are from an iteratee call.\n *\n * @private\n * @param {*} value The potential iteratee value argument.\n * @param {*} index The potential iteratee index or key argument.\n * @param {*} object The potential iteratee object argument.\n * @returns {boolean} Returns `true` if the arguments are from an iteratee call,\n * else `false`.\n */\nfunction isIterateeCall(value, index, object) {\n if (!isObject(object)) {\n return false;\n }\n var type = typeof index;\n if (type == 'number'\n ? (isArrayLike(object) && isIndex(index, object.length))\n : (type == 'string' && index in object)\n ) {\n return eq(object[index], value);\n }\n return false;\n}\n\nexport default isIterateeCall;\n","/**\n * This method returns a new empty array.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {Array} Returns the new empty array.\n * @example\n *\n * var arrays = _.times(2, _.stubArray);\n *\n * console.log(arrays);\n * // => [[], []]\n *\n * console.log(arrays[0] === arrays[1]);\n * // => false\n */\nfunction stubArray() {\n return [];\n}\n\nexport default stubArray;\n","enum Scope {\n TYPE = (1 << 2) - 1, // 0011 Lower two bits\n LEVEL = ((1 << 2) - 1) << 2, // 1100 Higher two bits\n\n ATTRIBUTE = (1 << 0) | LEVEL, // 1101\n BLOT = (1 << 1) | LEVEL, // 1110\n INLINE = (1 << 2) | TYPE, // 0111\n BLOCK = (1 << 3) | TYPE, // 1011\n\n BLOCK_BLOT = BLOCK & BLOT, // 1010\n INLINE_BLOT = INLINE & BLOT, // 0110\n BLOCK_ATTRIBUTE = BLOCK & ATTRIBUTE, // 1001\n INLINE_ATTRIBUTE = INLINE & ATTRIBUTE, // 0101\n\n ANY = TYPE | LEVEL,\n}\n\nexport default Scope;\n","import Scope from '../scope.js';\n\nexport interface AttributorOptions {\n scope?: Scope;\n whitelist?: string[];\n}\n\nexport default class Attributor {\n public static keys(node: HTMLElement): string[] {\n return Array.from(node.attributes).map((item: Attr) => item.name);\n }\n\n public scope: Scope;\n public whitelist: string[] | undefined;\n\n constructor(\n public readonly attrName: string,\n public readonly keyName: string,\n options: AttributorOptions = {},\n ) {\n const attributeBit = Scope.TYPE & Scope.ATTRIBUTE;\n this.scope =\n options.scope != null\n ? // Ignore type bits, force attribute bit\n (options.scope & Scope.LEVEL) | attributeBit\n : Scope.ATTRIBUTE;\n if (options.whitelist != null) {\n this.whitelist = options.whitelist;\n }\n }\n\n public add(node: HTMLElement, value: any): boolean {\n if (!this.canAdd(node, value)) {\n return false;\n }\n node.setAttribute(this.keyName, value);\n return true;\n }\n\n public canAdd(_node: HTMLElement, value: any): boolean {\n if (this.whitelist == null) {\n return true;\n }\n if (typeof value === 'string') {\n return this.whitelist.indexOf(value.replace(/[\"']/g, '')) > -1;\n } else {\n return this.whitelist.indexOf(value) > -1;\n }\n }\n\n public remove(node: HTMLElement): void {\n node.removeAttribute(this.keyName);\n }\n\n public value(node: HTMLElement): any {\n const value = node.getAttribute(this.keyName);\n if (this.canAdd(node, value) && value) {\n return value;\n }\n return '';\n }\n}\n","export default class ParchmentError extends Error {\n public message: string;\n public name: string;\n public stack!: string;\n\n constructor(message: string) {\n message = '[Parchment] ' + message;\n super(message);\n this.message = message;\n this.name = this.constructor.name;\n }\n}\n","import Attributor from './attributor/attributor.js';\nimport {\n type Blot,\n type BlotConstructor,\n type Root,\n} from './blot/abstract/blot.js';\nimport ParchmentError from './error.js';\nimport Scope from './scope.js';\n\nexport type RegistryDefinition = Attributor | BlotConstructor;\n\nexport interface RegistryInterface {\n create(scroll: Root, input: Node | string | Scope, value?: any): Blot;\n query(query: string | Node | Scope, scope: Scope): RegistryDefinition | null;\n register(...definitions: any[]): any;\n}\n\nexport default class Registry implements RegistryInterface {\n public static blots = new WeakMap();\n\n public static find(node?: Node | null, bubble = false): Blot | null {\n if (node == null) {\n return null;\n }\n if (this.blots.has(node)) {\n return this.blots.get(node) || null;\n }\n if (bubble) {\n let parentNode: Node | null = null;\n try {\n parentNode = node.parentNode;\n } catch (err) {\n // Probably hit a permission denied error.\n // A known case is in Firefox, event targets can be anonymous DIVs\n // inside an input element.\n // https://bugzilla.mozilla.org/show_bug.cgi?id=208427\n return null;\n }\n return this.find(parentNode, bubble);\n }\n return null;\n }\n\n private attributes: { [key: string]: Attributor } = {};\n private classes: { [key: string]: BlotConstructor } = {};\n private tags: { [key: string]: BlotConstructor } = {};\n private types: { [key: string]: RegistryDefinition } = {};\n\n public create(scroll: Root, input: Node | string | Scope, value?: any): Blot {\n const match = this.query(input);\n if (match == null) {\n throw new ParchmentError(`Unable to create ${input} blot`);\n }\n const blotClass = match as BlotConstructor;\n const node =\n // @ts-expect-error Fix me later\n input instanceof Node || input.nodeType === Node.TEXT_NODE\n ? input\n : blotClass.create(value);\n\n const blot = new blotClass(scroll, node as Node, value);\n Registry.blots.set(blot.domNode, blot);\n return blot;\n }\n\n public find(node: Node | null, bubble = false): Blot | null {\n return Registry.find(node, bubble);\n }\n\n public query(\n query: string | Node | Scope,\n scope: Scope = Scope.ANY,\n ): RegistryDefinition | null {\n let match;\n if (typeof query === 'string') {\n match = this.types[query] || this.attributes[query];\n // @ts-expect-error Fix me later\n } else if (query instanceof Text || query.nodeType === Node.TEXT_NODE) {\n match = this.types.text;\n } else if (typeof query === 'number') {\n if (query & Scope.LEVEL & Scope.BLOCK) {\n match = this.types.block;\n } else if (query & Scope.LEVEL & Scope.INLINE) {\n match = this.types.inline;\n }\n } else if (query instanceof Element) {\n const names = (query.getAttribute('class') || '').split(/\\s+/);\n names.some((name) => {\n match = this.classes[name];\n if (match) {\n return true;\n }\n return false;\n });\n match = match || this.tags[query.tagName];\n }\n if (match == null) {\n return null;\n }\n if (\n 'scope' in match &&\n scope & Scope.LEVEL & match.scope &&\n scope & Scope.TYPE & match.scope\n ) {\n return match;\n }\n return null;\n }\n\n public register(...definitions: RegistryDefinition[]): RegistryDefinition[] {\n return definitions.map((definition) => {\n const isBlot = 'blotName' in definition;\n const isAttr = 'attrName' in definition;\n if (!isBlot && !isAttr) {\n throw new ParchmentError('Invalid definition');\n } else if (isBlot && definition.blotName === 'abstract') {\n throw new ParchmentError('Cannot register abstract class');\n }\n const key = isBlot\n ? definition.blotName\n : isAttr\n ? definition.attrName\n : (undefined as never); // already handled by above checks\n this.types[key] = definition;\n\n if (isAttr) {\n if (typeof definition.keyName === 'string') {\n this.attributes[definition.keyName] = definition;\n }\n } else if (isBlot) {\n if (definition.className) {\n this.classes[definition.className] = definition;\n }\n if (definition.tagName) {\n if (Array.isArray(definition.tagName)) {\n definition.tagName = definition.tagName.map((tagName: string) => {\n return tagName.toUpperCase();\n });\n } else {\n definition.tagName = definition.tagName.toUpperCase();\n }\n const tagNames = Array.isArray(definition.tagName)\n ? definition.tagName\n : [definition.tagName];\n tagNames.forEach((tag: string) => {\n if (this.tags[tag] == null || definition.className == null) {\n this.tags[tag] = definition;\n }\n });\n }\n }\n return definition;\n });\n }\n}\n","import Attributor from './attributor.js';\n\nfunction match(node: HTMLElement, prefix: string): string[] {\n const className = node.getAttribute('class') || '';\n return className\n .split(/\\s+/)\n .filter((name) => name.indexOf(`${prefix}-`) === 0);\n}\n\nclass ClassAttributor extends Attributor {\n public static keys(node: HTMLElement): string[] {\n return (node.getAttribute('class') || '')\n .split(/\\s+/)\n .map((name) => name.split('-').slice(0, -1).join('-'));\n }\n\n public add(node: HTMLElement, value: any): boolean {\n if (!this.canAdd(node, value)) {\n return false;\n }\n this.remove(node);\n node.classList.add(`${this.keyName}-${value}`);\n return true;\n }\n\n public remove(node: HTMLElement): void {\n const matches = match(node, this.keyName);\n matches.forEach((name) => {\n node.classList.remove(name);\n });\n if (node.classList.length === 0) {\n node.removeAttribute('class');\n }\n }\n\n public value(node: HTMLElement): any {\n const result = match(node, this.keyName)[0] || '';\n const value = result.slice(this.keyName.length + 1); // +1 for hyphen\n return this.canAdd(node, value) ? value : '';\n }\n}\n\nexport default ClassAttributor;\n","import Attributor from './attributor.js';\n\nfunction camelize(name: string): string {\n const parts = name.split('-');\n const rest = parts\n .slice(1)\n .map((part: string) => part[0].toUpperCase() + part.slice(1))\n .join('');\n return parts[0] + rest;\n}\n\nclass StyleAttributor extends Attributor {\n public static keys(node: HTMLElement): string[] {\n return (node.getAttribute('style') || '').split(';').map((value) => {\n const arr = value.split(':');\n return arr[0].trim();\n });\n }\n\n public add(node: HTMLElement, value: any): boolean {\n if (!this.canAdd(node, value)) {\n return false;\n }\n // @ts-expect-error Fix me later\n node.style[camelize(this.keyName)] = value;\n return true;\n }\n\n public remove(node: HTMLElement): void {\n // @ts-expect-error Fix me later\n node.style[camelize(this.keyName)] = '';\n if (!node.getAttribute('style')) {\n node.removeAttribute('style');\n }\n }\n\n public value(node: HTMLElement): any {\n // @ts-expect-error Fix me later\n const value = node.style[camelize(this.keyName)];\n return this.canAdd(node, value) ? value : '';\n }\n}\n\nexport default StyleAttributor;\n","import type { Formattable } from '../blot/abstract/blot.js';\nimport Registry from '../registry.js';\nimport Scope from '../scope.js';\nimport Attributor from './attributor.js';\nimport ClassAttributor from './class.js';\nimport StyleAttributor from './style.js';\n\nclass AttributorStore {\n private attributes: { [key: string]: Attributor } = {};\n private domNode: HTMLElement;\n\n constructor(domNode: HTMLElement) {\n this.domNode = domNode;\n this.build();\n }\n\n public attribute(attribute: Attributor, value: any): void {\n // verb\n if (value) {\n if (attribute.add(this.domNode, value)) {\n if (attribute.value(this.domNode) != null) {\n this.attributes[attribute.attrName] = attribute;\n } else {\n delete this.attributes[attribute.attrName];\n }\n }\n } else {\n attribute.remove(this.domNode);\n delete this.attributes[attribute.attrName];\n }\n }\n\n public build(): void {\n this.attributes = {};\n const blot = Registry.find(this.domNode);\n if (blot == null) {\n return;\n }\n const attributes = Attributor.keys(this.domNode);\n const classes = ClassAttributor.keys(this.domNode);\n const styles = StyleAttributor.keys(this.domNode);\n attributes\n .concat(classes)\n .concat(styles)\n .forEach((name) => {\n const attr = blot.scroll.query(name, Scope.ATTRIBUTE);\n if (attr instanceof Attributor) {\n this.attributes[attr.attrName] = attr;\n }\n });\n }\n\n public copy(target: Formattable): void {\n Object.keys(this.attributes).forEach((key) => {\n const value = this.attributes[key].value(this.domNode);\n target.format(key, value);\n });\n }\n\n public move(target: Formattable): void {\n this.copy(target);\n Object.keys(this.attributes).forEach((key) => {\n this.attributes[key].remove(this.domNode);\n });\n this.attributes = {};\n }\n\n public values(): { [key: string]: any } {\n return Object.keys(this.attributes).reduce(\n (attributes: { [key: string]: any }, name: string) => {\n attributes[name] = this.attributes[name].value(this.domNode);\n return attributes;\n },\n {},\n );\n }\n}\n\nexport default AttributorStore;\n","import ParchmentError from '../../error.js';\nimport Registry from '../../registry.js';\nimport Scope from '../../scope.js';\nimport type {\n Blot,\n BlotConstructor,\n Formattable,\n Parent,\n Root,\n} from './blot.js';\n\nclass ShadowBlot implements Blot {\n public static blotName = 'abstract';\n public static className: string;\n public static requiredContainer: BlotConstructor;\n public static scope: Scope;\n public static tagName: string | string[];\n\n public static create(rawValue?: unknown): Node {\n if (this.tagName == null) {\n throw new ParchmentError('Blot definition missing tagName');\n }\n let node: HTMLElement;\n let value: string | number | undefined;\n if (Array.isArray(this.tagName)) {\n if (typeof rawValue === 'string') {\n value = rawValue.toUpperCase();\n if (parseInt(value, 10).toString() === value) {\n value = parseInt(value, 10);\n }\n } else if (typeof rawValue === 'number') {\n value = rawValue;\n }\n if (typeof value === 'number') {\n node = document.createElement(this.tagName[value - 1]);\n } else if (value && this.tagName.indexOf(value) > -1) {\n node = document.createElement(value);\n } else {\n node = document.createElement(this.tagName[0]);\n }\n } else {\n node = document.createElement(this.tagName);\n }\n if (this.className) {\n node.classList.add(this.className);\n }\n return node;\n }\n\n public prev: Blot | null;\n public next: Blot | null;\n // @ts-expect-error Fix me later\n public parent: Parent;\n\n // Hack for accessing inherited static methods\n get statics(): any {\n return this.constructor;\n }\n constructor(\n public scroll: Root,\n public domNode: Node,\n ) {\n Registry.blots.set(domNode, this);\n this.prev = null;\n this.next = null;\n }\n\n public attach(): void {\n // Nothing to do\n }\n\n public clone(): Blot {\n const domNode = this.domNode.cloneNode(false);\n return this.scroll.create(domNode);\n }\n\n public detach(): void {\n if (this.parent != null) {\n this.parent.removeChild(this);\n }\n Registry.blots.delete(this.domNode);\n }\n\n public deleteAt(index: number, length: number): void {\n const blot = this.isolate(index, length);\n blot.remove();\n }\n\n public formatAt(\n index: number,\n length: number,\n name: string,\n value: any,\n ): void {\n const blot = this.isolate(index, length);\n if (this.scroll.query(name, Scope.BLOT) != null && value) {\n blot.wrap(name, value);\n } else if (this.scroll.query(name, Scope.ATTRIBUTE) != null) {\n const parent = this.scroll.create(this.statics.scope) as Parent &\n Formattable;\n blot.wrap(parent);\n parent.format(name, value);\n }\n }\n\n public insertAt(index: number, value: string, def?: any): void {\n const blot =\n def == null\n ? this.scroll.create('text', value)\n : this.scroll.create(value, def);\n const ref = this.split(index);\n this.parent.insertBefore(blot, ref || undefined);\n }\n\n public isolate(index: number, length: number): Blot {\n const target = this.split(index);\n if (target == null) {\n throw new Error('Attempt to isolate at end');\n }\n target.split(length);\n return target;\n }\n\n public length(): number {\n return 1;\n }\n\n public offset(root: Blot = this.parent): number {\n if (this.parent == null || this === root) {\n return 0;\n }\n return this.parent.children.offset(this) + this.parent.offset(root);\n }\n\n public optimize(_context?: { [key: string]: any }): void {\n if (\n this.statics.requiredContainer &&\n !(this.parent instanceof this.statics.requiredContainer)\n ) {\n this.wrap(this.statics.requiredContainer.blotName);\n }\n }\n\n public remove(): void {\n if (this.domNode.parentNode != null) {\n this.domNode.parentNode.removeChild(this.domNode);\n }\n this.detach();\n }\n\n public replaceWith(name: string | Blot, value?: any): Blot {\n const replacement =\n typeof name === 'string' ? this.scroll.create(name, value) : name;\n if (this.parent != null) {\n this.parent.insertBefore(replacement, this.next || undefined);\n this.remove();\n }\n return replacement;\n }\n\n public split(index: number, _force?: boolean): Blot | null {\n return index === 0 ? this : this.next;\n }\n\n public update(\n _mutations: MutationRecord[],\n _context: { [key: string]: any },\n ): void {\n // Nothing to do by default\n }\n\n public wrap(name: string | Parent, value?: any): Parent {\n const wrapper =\n typeof name === 'string'\n ? (this.scroll.create(name, value) as Parent)\n : name;\n if (this.parent != null) {\n this.parent.insertBefore(wrapper, this.next || undefined);\n }\n if (typeof wrapper.appendChild !== 'function') {\n throw new ParchmentError(`Cannot wrap ${name}`);\n }\n wrapper.appendChild(this);\n return wrapper;\n }\n}\n\nexport default ShadowBlot;\n","import Scope from '../../scope.js';\nimport type { Leaf } from './blot.js';\nimport ShadowBlot from './shadow.js';\n\nclass LeafBlot extends ShadowBlot implements Leaf {\n public static scope = Scope.INLINE_BLOT;\n\n /**\n * Returns the value represented by domNode if it is this Blot's type\n * No checking that domNode can represent this Blot type is required so\n * applications needing it should check externally before calling.\n */\n public static value(_domNode: Node): any {\n return true;\n }\n\n /**\n * Given location represented by node and offset from DOM Selection Range,\n * return index to that location.\n */\n public index(node: Node, offset: number): number {\n if (\n this.domNode === node ||\n this.domNode.compareDocumentPosition(node) &\n Node.DOCUMENT_POSITION_CONTAINED_BY\n ) {\n return Math.min(offset, 1);\n }\n return -1;\n }\n\n /**\n * Given index to location within blot, return node and offset representing\n * that location, consumable by DOM Selection Range\n */\n public position(index: number, _inclusive?: boolean): [Node, number] {\n const childNodes: Node[] = Array.from(this.parent.domNode.childNodes);\n let offset = childNodes.indexOf(this.domNode);\n if (index > 0) {\n offset += 1;\n }\n return [this.parent.domNode, offset];\n }\n\n /**\n * Return value represented by this blot\n * Should not change without interaction from API or\n * user change detectable by update()\n */\n public value(): any {\n return {\n [this.statics.blotName]: this.statics.value(this.domNode) || true,\n };\n }\n}\n\nexport default LeafBlot;\n","import type LinkedNode from './linked-node.js';\n\nclass LinkedList {\n public head: T | null;\n public tail: T | null;\n public length: number;\n\n constructor() {\n this.head = null;\n this.tail = null;\n this.length = 0;\n }\n\n public append(...nodes: T[]): void {\n this.insertBefore(nodes[0], null);\n if (nodes.length > 1) {\n const rest = nodes.slice(1);\n this.append(...rest);\n }\n }\n\n public at(index: number): T | null {\n const next = this.iterator();\n let cur = next();\n while (cur && index > 0) {\n index -= 1;\n cur = next();\n }\n return cur;\n }\n\n public contains(node: T): boolean {\n const next = this.iterator();\n let cur = next();\n while (cur) {\n if (cur === node) {\n return true;\n }\n cur = next();\n }\n return false;\n }\n\n public indexOf(node: T): number {\n const next = this.iterator();\n let cur = next();\n let index = 0;\n while (cur) {\n if (cur === node) {\n return index;\n }\n index += 1;\n cur = next();\n }\n return -1;\n }\n\n public insertBefore(node: T | null, refNode: T | null): void {\n if (node == null) {\n return;\n }\n this.remove(node);\n node.next = refNode;\n if (refNode != null) {\n node.prev = refNode.prev;\n if (refNode.prev != null) {\n refNode.prev.next = node;\n }\n refNode.prev = node;\n if (refNode === this.head) {\n this.head = node;\n }\n } else if (this.tail != null) {\n this.tail.next = node;\n node.prev = this.tail;\n this.tail = node;\n } else {\n node.prev = null;\n this.head = this.tail = node;\n }\n this.length += 1;\n }\n\n public offset(target: T): number {\n let index = 0;\n let cur = this.head;\n while (cur != null) {\n if (cur === target) {\n return index;\n }\n index += cur.length();\n cur = cur.next as T;\n }\n return -1;\n }\n\n public remove(node: T): void {\n if (!this.contains(node)) {\n return;\n }\n if (node.prev != null) {\n node.prev.next = node.next;\n }\n if (node.next != null) {\n node.next.prev = node.prev;\n }\n if (node === this.head) {\n this.head = node.next as T;\n }\n if (node === this.tail) {\n this.tail = node.prev as T;\n }\n this.length -= 1;\n }\n\n public iterator(curNode: T | null = this.head): () => T | null {\n // TODO use yield when we can\n return (): T | null => {\n const ret = curNode;\n if (curNode != null) {\n curNode = curNode.next as T;\n }\n return ret;\n };\n }\n\n public find(index: number, inclusive = false): [T | null, number] {\n const next = this.iterator();\n let cur = next();\n while (cur) {\n const length = cur.length();\n if (\n index < length ||\n (inclusive &&\n index === length &&\n (cur.next == null || cur.next.length() !== 0))\n ) {\n return [cur, index];\n }\n index -= length;\n cur = next();\n }\n return [null, 0];\n }\n\n public forEach(callback: (cur: T) => void): void {\n const next = this.iterator();\n let cur = next();\n while (cur) {\n callback(cur);\n cur = next();\n }\n }\n\n public forEachAt(\n index: number,\n length: number,\n callback: (cur: T, offset: number, length: number) => void,\n ): void {\n if (length <= 0) {\n return;\n }\n const [startNode, offset] = this.find(index);\n let curIndex = index - offset;\n const next = this.iterator(startNode);\n let cur = next();\n while (cur && curIndex < index + length) {\n const curLength = cur.length();\n if (index > curIndex) {\n callback(\n cur,\n index - curIndex,\n Math.min(length, curIndex + curLength - index),\n );\n } else {\n callback(cur, 0, Math.min(curLength, index + length - curIndex));\n }\n curIndex += curLength;\n cur = next();\n }\n }\n\n public map(callback: (cur: T) => any): any[] {\n return this.reduce((memo: T[], cur: T) => {\n memo.push(callback(cur));\n return memo;\n }, []);\n }\n\n public reduce(callback: (memo: M, cur: T) => M, memo: M): M {\n const next = this.iterator();\n let cur = next();\n while (cur) {\n memo = callback(memo, cur);\n cur = next();\n }\n return memo;\n }\n}\n\nexport default LinkedList;\n","import LinkedList from '../../collection/linked-list.js';\nimport ParchmentError from '../../error.js';\nimport Scope from '../../scope.js';\nimport type { Blot, BlotConstructor, Parent, Root } from './blot.js';\nimport ShadowBlot from './shadow.js';\n\nfunction makeAttachedBlot(node: Node, scroll: Root): Blot {\n const found = scroll.find(node);\n if (found) return found;\n try {\n return scroll.create(node);\n } catch (e) {\n const blot = scroll.create(Scope.INLINE);\n Array.from(node.childNodes).forEach((child: Node) => {\n blot.domNode.appendChild(child);\n });\n if (node.parentNode) {\n node.parentNode.replaceChild(blot.domNode, node);\n }\n blot.attach();\n return blot;\n }\n}\n\nclass ParentBlot extends ShadowBlot implements Parent {\n /**\n * Whitelist array of Blots that can be direct children.\n */\n public static allowedChildren?: BlotConstructor[];\n\n /**\n * Default child blot to be inserted if this blot becomes empty.\n */\n public static defaultChild?: BlotConstructor;\n public static uiClass = '';\n\n public children!: LinkedList;\n public domNode!: HTMLElement;\n public uiNode: HTMLElement | null = null;\n\n constructor(scroll: Root, domNode: Node) {\n super(scroll, domNode);\n this.build();\n }\n\n public appendChild(other: Blot): void {\n this.insertBefore(other);\n }\n\n public attach(): void {\n super.attach();\n this.children.forEach((child) => {\n child.attach();\n });\n }\n\n public attachUI(node: HTMLElement): void {\n if (this.uiNode != null) {\n this.uiNode.remove();\n }\n this.uiNode = node;\n if (ParentBlot.uiClass) {\n this.uiNode.classList.add(ParentBlot.uiClass);\n }\n this.uiNode.setAttribute('contenteditable', 'false');\n this.domNode.insertBefore(this.uiNode, this.domNode.firstChild);\n }\n\n /**\n * Called during construction, should fill its own children LinkedList.\n */\n public build(): void {\n this.children = new LinkedList();\n // Need to be reversed for if DOM nodes already in order\n Array.from(this.domNode.childNodes)\n .filter((node: Node) => node !== this.uiNode)\n .reverse()\n .forEach((node: Node) => {\n try {\n const child = makeAttachedBlot(node, this.scroll);\n this.insertBefore(child, this.children.head || undefined);\n } catch (err) {\n if (err instanceof ParchmentError) {\n return;\n } else {\n throw err;\n }\n }\n });\n }\n\n public deleteAt(index: number, length: number): void {\n if (index === 0 && length === this.length()) {\n return this.remove();\n }\n this.children.forEachAt(index, length, (child, offset, childLength) => {\n child.deleteAt(offset, childLength);\n });\n }\n\n public descendant(\n criteria: new (...args: any[]) => T,\n index: number,\n ): [T | null, number];\n public descendant(\n criteria: (blot: Blot) => boolean,\n index: number,\n ): [Blot | null, number];\n public descendant(criteria: any, index = 0): [Blot | null, number] {\n const [child, offset] = this.children.find(index);\n if (\n (criteria.blotName == null && criteria(child)) ||\n (criteria.blotName != null && child instanceof criteria)\n ) {\n return [child as any, offset];\n } else if (child instanceof ParentBlot) {\n return child.descendant(criteria, offset);\n } else {\n return [null, -1];\n }\n }\n\n public descendants(\n criteria: new (...args: any[]) => T,\n index?: number,\n length?: number,\n ): T[];\n public descendants(\n criteria: (blot: Blot) => boolean,\n index?: number,\n length?: number,\n ): Blot[];\n public descendants(\n criteria: any,\n index = 0,\n length: number = Number.MAX_VALUE,\n ): Blot[] {\n let descendants: Blot[] = [];\n let lengthLeft = length;\n this.children.forEachAt(\n index,\n length,\n (child: Blot, childIndex: number, childLength: number) => {\n if (\n (criteria.blotName == null && criteria(child)) ||\n (criteria.blotName != null && child instanceof criteria)\n ) {\n descendants.push(child);\n }\n if (child instanceof ParentBlot) {\n descendants = descendants.concat(\n child.descendants(criteria, childIndex, lengthLeft),\n );\n }\n lengthLeft -= childLength;\n },\n );\n return descendants;\n }\n\n public detach(): void {\n this.children.forEach((child) => {\n child.detach();\n });\n super.detach();\n }\n\n public enforceAllowedChildren(): void {\n let done = false;\n this.children.forEach((child: Blot) => {\n if (done) {\n return;\n }\n const allowed = this.statics.allowedChildren.some(\n (def: BlotConstructor) => child instanceof def,\n );\n if (allowed) {\n return;\n }\n if (child.statics.scope === Scope.BLOCK_BLOT) {\n if (child.next != null) {\n this.splitAfter(child);\n }\n if (child.prev != null) {\n this.splitAfter(child.prev);\n }\n child.parent.unwrap();\n done = true;\n } else if (child instanceof ParentBlot) {\n child.unwrap();\n } else {\n child.remove();\n }\n });\n }\n\n public formatAt(\n index: number,\n length: number,\n name: string,\n value: any,\n ): void {\n this.children.forEachAt(index, length, (child, offset, childLength) => {\n child.formatAt(offset, childLength, name, value);\n });\n }\n\n public insertAt(index: number, value: string, def?: any): void {\n const [child, offset] = this.children.find(index);\n if (child) {\n child.insertAt(offset, value, def);\n } else {\n const blot =\n def == null\n ? this.scroll.create('text', value)\n : this.scroll.create(value, def);\n this.appendChild(blot);\n }\n }\n\n public insertBefore(childBlot: Blot, refBlot?: Blot | null): void {\n if (childBlot.parent != null) {\n childBlot.parent.children.remove(childBlot);\n }\n let refDomNode: Node | null = null;\n this.children.insertBefore(childBlot, refBlot || null);\n childBlot.parent = this;\n if (refBlot != null) {\n refDomNode = refBlot.domNode;\n }\n if (\n this.domNode.parentNode !== childBlot.domNode ||\n this.domNode.nextSibling !== refDomNode\n ) {\n this.domNode.insertBefore(childBlot.domNode, refDomNode);\n }\n childBlot.attach();\n }\n\n public length(): number {\n return this.children.reduce((memo, child) => {\n return memo + child.length();\n }, 0);\n }\n\n public moveChildren(targetParent: Parent, refNode?: Blot | null): void {\n this.children.forEach((child) => {\n targetParent.insertBefore(child, refNode);\n });\n }\n\n public optimize(context?: { [key: string]: any }): void {\n super.optimize(context);\n this.enforceAllowedChildren();\n if (this.uiNode != null && this.uiNode !== this.domNode.firstChild) {\n this.domNode.insertBefore(this.uiNode, this.domNode.firstChild);\n }\n if (this.children.length === 0) {\n if (this.statics.defaultChild != null) {\n const child = this.scroll.create(this.statics.defaultChild.blotName);\n this.appendChild(child);\n // TODO double check if necessary\n // child.optimize(context);\n } else {\n this.remove();\n }\n }\n }\n\n public path(index: number, inclusive = false): [Blot, number][] {\n const [child, offset] = this.children.find(index, inclusive);\n const position: [Blot, number][] = [[this, index]];\n if (child instanceof ParentBlot) {\n return position.concat(child.path(offset, inclusive));\n } else if (child != null) {\n position.push([child, offset]);\n }\n return position;\n }\n\n public removeChild(child: Blot): void {\n this.children.remove(child);\n }\n\n public replaceWith(name: string | Blot, value?: any): Blot {\n const replacement =\n typeof name === 'string' ? this.scroll.create(name, value) : name;\n if (replacement instanceof ParentBlot) {\n this.moveChildren(replacement);\n }\n return super.replaceWith(replacement);\n }\n\n public split(index: number, force = false): Blot | null {\n if (!force) {\n if (index === 0) {\n return this;\n }\n if (index === this.length()) {\n return this.next;\n }\n }\n const after = this.clone() as ParentBlot;\n if (this.parent) {\n this.parent.insertBefore(after, this.next || undefined);\n }\n this.children.forEachAt(index, this.length(), (child, offset, _length) => {\n const split = child.split(offset, force);\n if (split != null) {\n after.appendChild(split);\n }\n });\n return after;\n }\n\n public splitAfter(child: Blot): Parent {\n const after = this.clone() as ParentBlot;\n while (child.next != null) {\n after.appendChild(child.next);\n }\n if (this.parent) {\n this.parent.insertBefore(after, this.next || undefined);\n }\n return after;\n }\n\n public unwrap(): void {\n if (this.parent) {\n this.moveChildren(this.parent, this.next || undefined);\n }\n this.remove();\n }\n\n public update(\n mutations: MutationRecord[],\n _context: { [key: string]: any },\n ): void {\n const addedNodes: Node[] = [];\n const removedNodes: Node[] = [];\n mutations.forEach((mutation) => {\n if (mutation.target === this.domNode && mutation.type === 'childList') {\n addedNodes.push(...mutation.addedNodes);\n removedNodes.push(...mutation.removedNodes);\n }\n });\n removedNodes.forEach((node: Node) => {\n // Check node has actually been removed\n // One exception is Chrome does not immediately remove IFRAMEs\n // from DOM but MutationRecord is correct in its reported removal\n if (\n node.parentNode != null &&\n // @ts-expect-error Fix me later\n node.tagName !== 'IFRAME' &&\n document.body.compareDocumentPosition(node) &\n Node.DOCUMENT_POSITION_CONTAINED_BY\n ) {\n return;\n }\n const blot = this.scroll.find(node);\n if (blot == null) {\n return;\n }\n if (\n blot.domNode.parentNode == null ||\n blot.domNode.parentNode === this.domNode\n ) {\n blot.detach();\n }\n });\n addedNodes\n .filter((node) => {\n return node.parentNode === this.domNode && node !== this.uiNode;\n })\n .sort((a, b) => {\n if (a === b) {\n return 0;\n }\n if (a.compareDocumentPosition(b) & Node.DOCUMENT_POSITION_FOLLOWING) {\n return 1;\n }\n return -1;\n })\n .forEach((node) => {\n let refBlot: Blot | null = null;\n if (node.nextSibling != null) {\n refBlot = this.scroll.find(node.nextSibling);\n }\n const blot = makeAttachedBlot(node, this.scroll);\n if (blot.next !== refBlot || blot.next == null) {\n if (blot.parent != null) {\n blot.parent.removeChild(this);\n }\n this.insertBefore(blot, refBlot || undefined);\n }\n });\n this.enforceAllowedChildren();\n }\n}\n\nexport default ParentBlot;\n","import Attributor from '../attributor/attributor.js';\nimport AttributorStore from '../attributor/store.js';\nimport Scope from '../scope.js';\nimport type {\n Blot,\n BlotConstructor,\n Formattable,\n Parent,\n Root,\n} from './abstract/blot.js';\nimport LeafBlot from './abstract/leaf.js';\nimport ParentBlot from './abstract/parent.js';\n\n// Shallow object comparison\nfunction isEqual(\n obj1: Record,\n obj2: Record,\n): boolean {\n if (Object.keys(obj1).length !== Object.keys(obj2).length) {\n return false;\n }\n for (const prop in obj1) {\n if (obj1[prop] !== obj2[prop]) {\n return false;\n }\n }\n return true;\n}\n\nclass InlineBlot extends ParentBlot implements Formattable {\n public static allowedChildren: BlotConstructor[] = [InlineBlot, LeafBlot];\n public static blotName = 'inline';\n public static scope = Scope.INLINE_BLOT;\n public static tagName: string | string[] = 'SPAN';\n\n static create(value?: unknown) {\n return super.create(value) as HTMLElement;\n }\n\n public static formats(domNode: HTMLElement, scroll: Root): any {\n const match = scroll.query(InlineBlot.blotName);\n if (\n match != null &&\n domNode.tagName === (match as BlotConstructor).tagName\n ) {\n return undefined;\n } else if (typeof this.tagName === 'string') {\n return true;\n } else if (Array.isArray(this.tagName)) {\n return domNode.tagName.toLowerCase();\n }\n return undefined;\n }\n\n protected attributes: AttributorStore;\n\n constructor(scroll: Root, domNode: Node) {\n super(scroll, domNode);\n this.attributes = new AttributorStore(this.domNode);\n }\n\n public format(name: string, value: any): void {\n if (name === this.statics.blotName && !value) {\n this.children.forEach((child) => {\n if (!(child instanceof InlineBlot)) {\n child = child.wrap(InlineBlot.blotName, true);\n }\n this.attributes.copy(child as InlineBlot);\n });\n this.unwrap();\n } else {\n const format = this.scroll.query(name, Scope.INLINE);\n if (format == null) {\n return;\n }\n if (format instanceof Attributor) {\n this.attributes.attribute(format, value);\n } else if (\n value &&\n (name !== this.statics.blotName || this.formats()[name] !== value)\n ) {\n this.replaceWith(name, value);\n }\n }\n }\n\n public formats(): { [index: string]: any } {\n const formats = this.attributes.values();\n const format = this.statics.formats(this.domNode, this.scroll);\n if (format != null) {\n formats[this.statics.blotName] = format;\n }\n return formats;\n }\n\n public formatAt(\n index: number,\n length: number,\n name: string,\n value: any,\n ): void {\n if (\n this.formats()[name] != null ||\n this.scroll.query(name, Scope.ATTRIBUTE)\n ) {\n const blot = this.isolate(index, length) as InlineBlot;\n blot.format(name, value);\n } else {\n super.formatAt(index, length, name, value);\n }\n }\n\n public optimize(context: { [key: string]: any }): void {\n super.optimize(context);\n const formats = this.formats();\n if (Object.keys(formats).length === 0) {\n return this.unwrap(); // unformatted span\n }\n const next = this.next;\n if (\n next instanceof InlineBlot &&\n next.prev === this &&\n isEqual(formats, next.formats())\n ) {\n next.moveChildren(this);\n next.remove();\n }\n }\n\n public replaceWith(name: string | Blot, value?: any): Blot {\n const replacement = super.replaceWith(name, value) as InlineBlot;\n this.attributes.copy(replacement);\n return replacement;\n }\n\n public update(\n mutations: MutationRecord[],\n context: { [key: string]: any },\n ): void {\n super.update(mutations, context);\n const attributeChanged = mutations.some(\n (mutation) =>\n mutation.target === this.domNode && mutation.type === 'attributes',\n );\n if (attributeChanged) {\n this.attributes.build();\n }\n }\n\n public wrap(name: string | Parent, value?: any): Parent {\n const wrapper = super.wrap(name, value);\n if (wrapper instanceof InlineBlot) {\n this.attributes.move(wrapper);\n }\n return wrapper;\n }\n}\n\nexport default InlineBlot;\n","import Attributor from '../attributor/attributor.js';\nimport AttributorStore from '../attributor/store.js';\nimport Scope from '../scope.js';\nimport type {\n Blot,\n BlotConstructor,\n Formattable,\n Root,\n} from './abstract/blot.js';\nimport LeafBlot from './abstract/leaf.js';\nimport ParentBlot from './abstract/parent.js';\nimport InlineBlot from './inline.js';\n\nclass BlockBlot extends ParentBlot implements Formattable {\n public static blotName = 'block';\n public static scope = Scope.BLOCK_BLOT;\n public static tagName: string | string[] = 'P';\n public static allowedChildren: BlotConstructor[] = [\n InlineBlot,\n BlockBlot,\n LeafBlot,\n ];\n\n static create(value?: unknown) {\n return super.create(value) as HTMLElement;\n }\n\n public static formats(domNode: HTMLElement, scroll: Root): any {\n const match = scroll.query(BlockBlot.blotName);\n if (\n match != null &&\n domNode.tagName === (match as BlotConstructor).tagName\n ) {\n return undefined;\n } else if (typeof this.tagName === 'string') {\n return true;\n } else if (Array.isArray(this.tagName)) {\n return domNode.tagName.toLowerCase();\n }\n }\n\n protected attributes: AttributorStore;\n\n constructor(scroll: Root, domNode: Node) {\n super(scroll, domNode);\n this.attributes = new AttributorStore(this.domNode);\n }\n\n public format(name: string, value: any): void {\n const format = this.scroll.query(name, Scope.BLOCK);\n if (format == null) {\n return;\n } else if (format instanceof Attributor) {\n this.attributes.attribute(format, value);\n } else if (name === this.statics.blotName && !value) {\n this.replaceWith(BlockBlot.blotName);\n } else if (\n value &&\n (name !== this.statics.blotName || this.formats()[name] !== value)\n ) {\n this.replaceWith(name, value);\n }\n }\n\n public formats(): { [index: string]: any } {\n const formats = this.attributes.values();\n const format = this.statics.formats(this.domNode, this.scroll);\n if (format != null) {\n formats[this.statics.blotName] = format;\n }\n return formats;\n }\n\n public formatAt(\n index: number,\n length: number,\n name: string,\n value: any,\n ): void {\n if (this.scroll.query(name, Scope.BLOCK) != null) {\n this.format(name, value);\n } else {\n super.formatAt(index, length, name, value);\n }\n }\n\n public insertAt(index: number, value: string, def?: any): void {\n if (def == null || this.scroll.query(value, Scope.INLINE) != null) {\n // Insert text or inline\n super.insertAt(index, value, def);\n } else {\n const after = this.split(index);\n if (after != null) {\n const blot = this.scroll.create(value, def);\n after.parent.insertBefore(blot, after);\n } else {\n throw new Error('Attempt to insertAt after block boundaries');\n }\n }\n }\n\n public replaceWith(name: string | Blot, value?: any): Blot {\n const replacement = super.replaceWith(name, value) as BlockBlot;\n this.attributes.copy(replacement);\n return replacement;\n }\n\n public update(\n mutations: MutationRecord[],\n context: { [key: string]: any },\n ): void {\n super.update(mutations, context);\n const attributeChanged = mutations.some(\n (mutation) =>\n mutation.target === this.domNode && mutation.type === 'attributes',\n );\n if (attributeChanged) {\n this.attributes.build();\n }\n }\n}\n\nexport default BlockBlot;\n","import Scope from '../../scope.js';\nimport BlockBlot from '../block.js';\nimport ParentBlot from './parent.js';\n\nclass ContainerBlot extends ParentBlot {\n public static blotName = 'container';\n public static scope = Scope.BLOCK_BLOT;\n public static tagName: string | string[];\n\n public prev!: BlockBlot | ContainerBlot | null;\n public next!: BlockBlot | ContainerBlot | null;\n\n public checkMerge(): boolean {\n return (\n this.next !== null && this.next.statics.blotName === this.statics.blotName\n );\n }\n\n public deleteAt(index: number, length: number): void {\n super.deleteAt(index, length);\n this.enforceAllowedChildren();\n }\n\n public formatAt(\n index: number,\n length: number,\n name: string,\n value: any,\n ): void {\n super.formatAt(index, length, name, value);\n this.enforceAllowedChildren();\n }\n\n public insertAt(index: number, value: string, def?: any): void {\n super.insertAt(index, value, def);\n this.enforceAllowedChildren();\n }\n\n public optimize(context: { [key: string]: any }): void {\n super.optimize(context);\n if (this.children.length > 0 && this.next != null && this.checkMerge()) {\n this.next.moveChildren(this);\n this.next.remove();\n }\n }\n}\n\nexport default ContainerBlot;\n","import type { Formattable, Root } from './abstract/blot.js';\nimport LeafBlot from './abstract/leaf.js';\n\nclass EmbedBlot extends LeafBlot implements Formattable {\n public static formats(_domNode: HTMLElement, _scroll: Root): any {\n return undefined;\n }\n\n public format(name: string, value: any): void {\n // super.formatAt wraps, which is what we want in general,\n // but this allows subclasses to overwrite for formats\n // that just apply to particular embeds\n super.formatAt(0, this.length(), name, value);\n }\n\n public formatAt(\n index: number,\n length: number,\n name: string,\n value: any,\n ): void {\n if (index === 0 && length === this.length()) {\n this.format(name, value);\n } else {\n super.formatAt(index, length, name, value);\n }\n }\n\n public formats(): { [index: string]: any } {\n return this.statics.formats(this.domNode, this.scroll);\n }\n}\n\nexport default EmbedBlot;\n","import Registry, { type RegistryDefinition } from '../registry.js';\nimport Scope from '../scope.js';\nimport type { Blot, BlotConstructor, Root } from './abstract/blot.js';\nimport ContainerBlot from './abstract/container.js';\nimport ParentBlot from './abstract/parent.js';\nimport BlockBlot from './block.js';\n\nconst OBSERVER_CONFIG = {\n attributes: true,\n characterData: true,\n characterDataOldValue: true,\n childList: true,\n subtree: true,\n};\n\nconst MAX_OPTIMIZE_ITERATIONS = 100;\n\nclass ScrollBlot extends ParentBlot implements Root {\n public static blotName = 'scroll';\n public static defaultChild = BlockBlot;\n public static allowedChildren: BlotConstructor[] = [BlockBlot, ContainerBlot];\n public static scope = Scope.BLOCK_BLOT;\n public static tagName = 'DIV';\n\n public observer: MutationObserver;\n\n constructor(\n public registry: Registry,\n node: HTMLDivElement,\n ) {\n // @ts-expect-error scroll is the root with no parent\n super(null, node);\n this.scroll = this;\n this.build();\n this.observer = new MutationObserver((mutations: MutationRecord[]) => {\n this.update(mutations);\n });\n this.observer.observe(this.domNode, OBSERVER_CONFIG);\n this.attach();\n }\n\n public create(input: Node | string | Scope, value?: any): Blot {\n return this.registry.create(this, input, value);\n }\n\n public find(node: Node | null, bubble = false): Blot | null {\n const blot = this.registry.find(node, bubble);\n if (!blot) {\n return null;\n }\n if (blot.scroll === this) {\n return blot;\n }\n return bubble ? this.find(blot.scroll.domNode.parentNode, true) : null;\n }\n\n public query(\n query: string | Node | Scope,\n scope: Scope = Scope.ANY,\n ): RegistryDefinition | null {\n return this.registry.query(query, scope);\n }\n\n public register(...definitions: RegistryDefinition[]) {\n return this.registry.register(...definitions);\n }\n\n public build(): void {\n if (this.scroll == null) {\n return;\n }\n super.build();\n }\n\n public detach(): void {\n super.detach();\n this.observer.disconnect();\n }\n\n public deleteAt(index: number, length: number): void {\n this.update();\n if (index === 0 && length === this.length()) {\n this.children.forEach((child) => {\n child.remove();\n });\n } else {\n super.deleteAt(index, length);\n }\n }\n\n public formatAt(\n index: number,\n length: number,\n name: string,\n value: any,\n ): void {\n this.update();\n super.formatAt(index, length, name, value);\n }\n\n public insertAt(index: number, value: string, def?: any): void {\n this.update();\n super.insertAt(index, value, def);\n }\n\n public optimize(context?: { [key: string]: any }): void;\n public optimize(\n mutations: MutationRecord[],\n context: { [key: string]: any },\n ): void;\n public optimize(mutations: any = [], context: any = {}): void {\n super.optimize(context);\n const mutationsMap = context.mutationsMap || new WeakMap();\n // We must modify mutations directly, cannot make copy and then modify\n let records = Array.from(this.observer.takeRecords());\n // Array.push currently seems to be implemented by a non-tail recursive function\n // so we cannot just mutations.push.apply(mutations, this.observer.takeRecords());\n while (records.length > 0) {\n mutations.push(records.pop());\n }\n const mark = (blot: Blot | null, markParent = true): void => {\n if (blot == null || blot === this) {\n return;\n }\n if (blot.domNode.parentNode == null) {\n return;\n }\n if (!mutationsMap.has(blot.domNode)) {\n mutationsMap.set(blot.domNode, []);\n }\n if (markParent) {\n mark(blot.parent);\n }\n };\n const optimize = (blot: Blot): void => {\n // Post-order traversal\n if (!mutationsMap.has(blot.domNode)) {\n return;\n }\n if (blot instanceof ParentBlot) {\n blot.children.forEach(optimize);\n }\n mutationsMap.delete(blot.domNode);\n blot.optimize(context);\n };\n let remaining = mutations;\n for (let i = 0; remaining.length > 0; i += 1) {\n if (i >= MAX_OPTIMIZE_ITERATIONS) {\n throw new Error('[Parchment] Maximum optimize iterations reached');\n }\n remaining.forEach((mutation: MutationRecord) => {\n const blot = this.find(mutation.target, true);\n if (blot == null) {\n return;\n }\n if (blot.domNode === mutation.target) {\n if (mutation.type === 'childList') {\n mark(this.find(mutation.previousSibling, false));\n Array.from(mutation.addedNodes).forEach((node: Node) => {\n const child = this.find(node, false);\n mark(child, false);\n if (child instanceof ParentBlot) {\n child.children.forEach((grandChild: Blot) => {\n mark(grandChild, false);\n });\n }\n });\n } else if (mutation.type === 'attributes') {\n mark(blot.prev);\n }\n }\n mark(blot);\n });\n this.children.forEach(optimize);\n remaining = Array.from(this.observer.takeRecords());\n records = remaining.slice();\n while (records.length > 0) {\n mutations.push(records.pop());\n }\n }\n }\n\n public update(\n mutations?: MutationRecord[],\n context: { [key: string]: any } = {},\n ): void {\n mutations = mutations || this.observer.takeRecords();\n const mutationsMap = new WeakMap();\n mutations\n .map((mutation: MutationRecord) => {\n const blot = this.find(mutation.target, true);\n if (blot == null) {\n return null;\n }\n if (mutationsMap.has(blot.domNode)) {\n mutationsMap.get(blot.domNode).push(mutation);\n return null;\n } else {\n mutationsMap.set(blot.domNode, [mutation]);\n return blot;\n }\n })\n .forEach((blot: Blot | null) => {\n if (blot != null && blot !== this && mutationsMap.has(blot.domNode)) {\n blot.update(mutationsMap.get(blot.domNode) || [], context);\n }\n });\n context.mutationsMap = mutationsMap;\n if (mutationsMap.has(this.domNode)) {\n super.update(mutationsMap.get(this.domNode), context);\n }\n this.optimize(mutations, context);\n }\n}\n\nexport default ScrollBlot;\n","import Scope from '../scope.js';\nimport type { Blot, Leaf, Root } from './abstract/blot.js';\nimport LeafBlot from './abstract/leaf.js';\n\nclass TextBlot extends LeafBlot implements Leaf {\n public static readonly blotName = 'text';\n public static scope = Scope.INLINE_BLOT;\n\n public static create(value: string): Text {\n return document.createTextNode(value);\n }\n\n public static value(domNode: Text): string {\n return domNode.data;\n }\n\n public domNode!: Text;\n protected text: string;\n\n constructor(scroll: Root, node: Node) {\n super(scroll, node);\n this.text = this.statics.value(this.domNode);\n }\n\n public deleteAt(index: number, length: number): void {\n this.domNode.data = this.text =\n this.text.slice(0, index) + this.text.slice(index + length);\n }\n\n public index(node: Node, offset: number): number {\n if (this.domNode === node) {\n return offset;\n }\n return -1;\n }\n\n public insertAt(index: number, value: string, def?: any): void {\n if (def == null) {\n this.text = this.text.slice(0, index) + value + this.text.slice(index);\n this.domNode.data = this.text;\n } else {\n super.insertAt(index, value, def);\n }\n }\n\n public length(): number {\n return this.text.length;\n }\n\n public optimize(context: { [key: string]: any }): void {\n super.optimize(context);\n this.text = this.statics.value(this.domNode);\n if (this.text.length === 0) {\n this.remove();\n } else if (this.next instanceof TextBlot && this.next.prev === this) {\n this.insertAt(this.length(), (this.next as TextBlot).value());\n this.next.remove();\n }\n }\n\n public position(index: number, _inclusive = false): [Node, number] {\n return [this.domNode, index];\n }\n\n public split(index: number, force = false): Blot | null {\n if (!force) {\n if (index === 0) {\n return this;\n }\n if (index === this.length()) {\n return this.next;\n }\n }\n const after = this.scroll.create(this.domNode.splitText(index));\n this.parent.insertBefore(after, this.next || undefined);\n this.text = this.statics.value(this.domNode);\n return after;\n }\n\n public update(\n mutations: MutationRecord[],\n _context: { [key: string]: any },\n ): void {\n if (\n mutations.some((mutation) => {\n return (\n mutation.type === 'characterData' && mutation.target === this.domNode\n );\n })\n ) {\n this.text = this.statics.value(this.domNode);\n }\n }\n\n public value(): string {\n return this.text;\n }\n}\n\nexport default TextBlot;\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\tloaded: false,\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Flag the module as loaded\n\tmodule.loaded = true;\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = function(module) {\n\tvar getter = module && module.__esModule ?\n\t\tfunction() { return module['default']; } :\n\t\tfunction() { return module; };\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = function(exports, definition) {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }","// define __esModule on exports\n__webpack_require__.r = function(exports) {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.nmd = function(module) {\n\tmodule.paths = [];\n\tif (!module.children) module.children = [];\n\treturn module;\n};","import { ClassAttributor, Scope } from 'parchment';\n\nclass IndentAttributor extends ClassAttributor {\n add(node: HTMLElement, value: string | number) {\n let normalizedValue = 0;\n if (value === '+1' || value === '-1') {\n const indent = this.value(node) || 0;\n normalizedValue = value === '+1' ? indent + 1 : indent - 1;\n } else if (typeof value === 'number') {\n normalizedValue = value;\n }\n if (normalizedValue === 0) {\n this.remove(node);\n return true;\n }\n return super.add(node, normalizedValue.toString());\n }\n\n canAdd(node: HTMLElement, value: string) {\n return super.canAdd(node, value) || super.canAdd(node, parseInt(value, 10));\n }\n\n value(node: HTMLElement) {\n return parseInt(super.value(node), 10) || undefined; // Don't return NaN\n }\n}\n\nconst IndentClass = new IndentAttributor('indent', 'ql-indent', {\n scope: Scope.BLOCK,\n // @ts-expect-error\n whitelist: [1, 2, 3, 4, 5, 6, 7, 8],\n});\n\nexport default IndentClass;\n","import Block from '../blots/block.js';\n\nclass Blockquote extends Block {\n static blotName = 'blockquote';\n static tagName = 'blockquote';\n}\n\nexport default Blockquote;\n","import Block from '../blots/block.js';\n\nclass Header extends Block {\n static blotName = 'header';\n static tagName = ['H1', 'H2', 'H3', 'H4', 'H5', 'H6'];\n\n static formats(domNode: Element) {\n return this.tagName.indexOf(domNode.tagName) + 1;\n }\n}\n\nexport default Header;\n","import Block from '../blots/block.js';\nimport Container from '../blots/container.js';\nimport type Scroll from '../blots/scroll.js';\nimport Quill from '../core/quill.js';\n\nclass ListContainer extends Container {}\nListContainer.blotName = 'list-container';\nListContainer.tagName = 'OL';\n\nclass ListItem extends Block {\n static create(value: string) {\n const node = super.create() as HTMLElement;\n node.setAttribute('data-list', value);\n return node;\n }\n\n static formats(domNode: HTMLElement) {\n return domNode.getAttribute('data-list') || undefined;\n }\n\n static register() {\n Quill.register(ListContainer);\n }\n\n constructor(scroll: Scroll, domNode: HTMLElement) {\n super(scroll, domNode);\n const ui = domNode.ownerDocument.createElement('span');\n const listEventHandler = (e: Event) => {\n if (!scroll.isEnabled()) return;\n const format = this.statics.formats(domNode, scroll);\n if (format === 'checked') {\n this.format('list', 'unchecked');\n e.preventDefault();\n } else if (format === 'unchecked') {\n this.format('list', 'checked');\n e.preventDefault();\n }\n };\n ui.addEventListener('mousedown', listEventHandler);\n ui.addEventListener('touchstart', listEventHandler);\n this.attachUI(ui);\n }\n\n format(name: string, value: string) {\n if (name === this.statics.blotName && value) {\n this.domNode.setAttribute('data-list', value);\n } else {\n super.format(name, value);\n }\n }\n}\nListItem.blotName = 'list';\nListItem.tagName = 'LI';\n\nListContainer.allowedChildren = [ListItem];\nListItem.requiredContainer = ListContainer;\n\nexport { ListContainer, ListItem as default };\n","import Inline from '../blots/inline.js';\n\nclass Bold extends Inline {\n static blotName = 'bold';\n static tagName = ['STRONG', 'B'];\n\n static create() {\n return super.create();\n }\n\n static formats() {\n return true;\n }\n\n optimize(context: { [key: string]: any }) {\n super.optimize(context);\n if (this.domNode.tagName !== this.statics.tagName[0]) {\n this.replaceWith(this.statics.blotName);\n }\n }\n}\n\nexport default Bold;\n","import Inline from '../blots/inline.js';\n\nclass Link extends Inline {\n static blotName = 'link';\n static tagName = 'A';\n static SANITIZED_URL = 'about:blank';\n static PROTOCOL_WHITELIST = ['http', 'https', 'mailto', 'tel', 'sms'];\n\n static create(value: string) {\n const node = super.create(value) as HTMLElement;\n node.setAttribute('href', this.sanitize(value));\n node.setAttribute('rel', 'noopener noreferrer');\n node.setAttribute('target', '_blank');\n return node;\n }\n\n static formats(domNode: HTMLElement) {\n return domNode.getAttribute('href');\n }\n\n static sanitize(url: string) {\n return sanitize(url, this.PROTOCOL_WHITELIST) ? url : this.SANITIZED_URL;\n }\n\n format(name: string, value: unknown) {\n if (name !== this.statics.blotName || !value) {\n super.format(name, value);\n } else {\n // @ts-expect-error\n this.domNode.setAttribute('href', this.constructor.sanitize(value));\n }\n }\n}\n\nfunction sanitize(url: string, protocols: string[]) {\n const anchor = document.createElement('a');\n anchor.href = url;\n const protocol = anchor.href.slice(0, anchor.href.indexOf(':'));\n return protocols.indexOf(protocol) > -1;\n}\n\nexport { Link as default, sanitize };\n","import Inline from '../blots/inline.js';\n\nclass Script extends Inline {\n static blotName = 'script';\n static tagName = ['SUB', 'SUP'];\n\n static create(value: 'super' | 'sub' | (string & {})) {\n if (value === 'super') {\n return document.createElement('sup');\n }\n if (value === 'sub') {\n return document.createElement('sub');\n }\n return super.create(value);\n }\n\n static formats(domNode: HTMLElement) {\n if (domNode.tagName === 'SUB') return 'sub';\n if (domNode.tagName === 'SUP') return 'super';\n return undefined;\n }\n}\n\nexport default Script;\n","import Inline from '../blots/inline.js';\n\nclass Underline extends Inline {\n static blotName = 'underline';\n static tagName = 'U';\n}\n\nexport default Underline;\n","import Embed from '../blots/embed.js';\n\nclass Formula extends Embed {\n static blotName = 'formula';\n static className = 'ql-formula';\n static tagName = 'SPAN';\n\n static create(value: string) {\n // @ts-expect-error\n if (window.katex == null) {\n throw new Error('Formula module requires KaTeX.');\n }\n const node = super.create(value) as Element;\n if (typeof value === 'string') {\n // @ts-expect-error\n window.katex.render(value, node, {\n throwOnError: false,\n errorColor: '#f00',\n });\n node.setAttribute('data-value', value);\n }\n return node;\n }\n\n static value(domNode: Element) {\n return domNode.getAttribute('data-value');\n }\n\n html() {\n const { formula } = this.value();\n return `${formula}`;\n }\n}\n\nexport default Formula;\n","import { EmbedBlot } from 'parchment';\nimport { sanitize } from './link.js';\n\nconst ATTRIBUTES = ['alt', 'height', 'width'];\n\nclass Image extends EmbedBlot {\n static blotName = 'image';\n static tagName = 'IMG';\n\n static create(value: string) {\n const node = super.create(value) as Element;\n if (typeof value === 'string') {\n node.setAttribute('src', this.sanitize(value));\n }\n return node;\n }\n\n static formats(domNode: Element) {\n return ATTRIBUTES.reduce(\n (formats: Record, attribute) => {\n if (domNode.hasAttribute(attribute)) {\n formats[attribute] = domNode.getAttribute(attribute);\n }\n return formats;\n },\n {},\n );\n }\n\n static match(url: string) {\n return /\\.(jpe?g|gif|png)$/.test(url) || /^data:image\\/.+;base64/.test(url);\n }\n\n static sanitize(url: string) {\n return sanitize(url, ['http', 'https', 'data']) ? url : '//:0';\n }\n\n static value(domNode: Element) {\n return domNode.getAttribute('src');\n }\n\n domNode: HTMLImageElement;\n\n format(name: string, value: string) {\n if (ATTRIBUTES.indexOf(name) > -1) {\n if (value) {\n this.domNode.setAttribute(name, value);\n } else {\n this.domNode.removeAttribute(name);\n }\n } else {\n super.format(name, value);\n }\n }\n}\n\nexport default Image;\n","import { BlockEmbed } from '../blots/block.js';\nimport Link from './link.js';\n\nconst ATTRIBUTES = ['height', 'width'];\n\nclass Video extends BlockEmbed {\n static blotName = 'video';\n static className = 'ql-video';\n static tagName = 'IFRAME';\n\n static create(value: string) {\n const node = super.create(value) as Element;\n node.setAttribute('frameborder', '0');\n node.setAttribute('allowfullscreen', 'true');\n node.setAttribute('src', this.sanitize(value));\n return node;\n }\n\n static formats(domNode: Element) {\n return ATTRIBUTES.reduce(\n (formats: Record, attribute) => {\n if (domNode.hasAttribute(attribute)) {\n formats[attribute] = domNode.getAttribute(attribute);\n }\n return formats;\n },\n {},\n );\n }\n\n static sanitize(url: string) {\n return Link.sanitize(url);\n }\n\n static value(domNode: Element) {\n return domNode.getAttribute('src');\n }\n\n domNode: HTMLVideoElement;\n\n format(name: string, value: string) {\n if (ATTRIBUTES.indexOf(name) > -1) {\n if (value) {\n this.domNode.setAttribute(name, value);\n } else {\n this.domNode.removeAttribute(name);\n }\n } else {\n super.format(name, value);\n }\n }\n\n html() {\n const { video } = this.value();\n return `
    ${video}`;\n }\n}\n\nexport default Video;\n","import Delta from 'quill-delta';\nimport { ClassAttributor, Scope } from 'parchment';\nimport type { Blot, ScrollBlot } from 'parchment';\nimport Inline from '../blots/inline.js';\nimport Quill from '../core/quill.js';\nimport Module from '../core/module.js';\nimport { blockDelta } from '../blots/block.js';\nimport BreakBlot from '../blots/break.js';\nimport CursorBlot from '../blots/cursor.js';\nimport TextBlot, { escapeText } from '../blots/text.js';\nimport CodeBlock, { CodeBlockContainer } from '../formats/code.js';\nimport { traverse } from './clipboard.js';\n\nconst TokenAttributor = new ClassAttributor('code-token', 'hljs', {\n scope: Scope.INLINE,\n});\nclass CodeToken extends Inline {\n static formats(node: Element, scroll: ScrollBlot) {\n while (node != null && node !== scroll.domNode) {\n if (node.classList && node.classList.contains(CodeBlock.className)) {\n // @ts-expect-error\n return super.formats(node, scroll);\n }\n // @ts-expect-error\n node = node.parentNode;\n }\n return undefined;\n }\n\n constructor(scroll: ScrollBlot, domNode: Node, value: unknown) {\n // @ts-expect-error\n super(scroll, domNode, value);\n TokenAttributor.add(this.domNode, value);\n }\n\n format(format: string, value: unknown) {\n if (format !== CodeToken.blotName) {\n super.format(format, value);\n } else if (value) {\n TokenAttributor.add(this.domNode, value);\n } else {\n TokenAttributor.remove(this.domNode);\n this.domNode.classList.remove(this.statics.className);\n }\n }\n\n optimize(...args: unknown[]) {\n // @ts-expect-error\n super.optimize(...args);\n if (!TokenAttributor.value(this.domNode)) {\n this.unwrap();\n }\n }\n}\nCodeToken.blotName = 'code-token';\nCodeToken.className = 'ql-token';\n\nclass SyntaxCodeBlock extends CodeBlock {\n static create(value: unknown) {\n const domNode = super.create(value);\n if (typeof value === 'string') {\n domNode.setAttribute('data-language', value);\n }\n return domNode;\n }\n\n static formats(domNode: Node) {\n // @ts-expect-error\n return domNode.getAttribute('data-language') || 'plain';\n }\n\n static register() {} // Syntax module will register\n\n format(name: string, value: unknown) {\n if (name === this.statics.blotName && value) {\n // @ts-expect-error\n this.domNode.setAttribute('data-language', value);\n } else {\n super.format(name, value);\n }\n }\n\n replaceWith(name: string | Blot, value?: any) {\n this.formatAt(0, this.length(), CodeToken.blotName, false);\n return super.replaceWith(name, value);\n }\n}\n\nclass SyntaxCodeBlockContainer extends CodeBlockContainer {\n forceNext?: boolean;\n cachedText?: string | null;\n\n attach() {\n super.attach();\n this.forceNext = false;\n // @ts-expect-error\n this.scroll.emitMount(this);\n }\n\n format(name: string, value: unknown) {\n if (name === SyntaxCodeBlock.blotName) {\n this.forceNext = true;\n this.children.forEach((child) => {\n // @ts-expect-error\n child.format(name, value);\n });\n }\n }\n\n formatAt(index: number, length: number, name: string, value: unknown) {\n if (name === SyntaxCodeBlock.blotName) {\n this.forceNext = true;\n }\n super.formatAt(index, length, name, value);\n }\n\n highlight(\n highlight: (text: string, language: string) => Delta,\n forced = false,\n ) {\n if (this.children.head == null) return;\n const nodes = Array.from(this.domNode.childNodes).filter(\n (node) => node !== this.uiNode,\n );\n const text = `${nodes.map((node) => node.textContent).join('\\n')}\\n`;\n const language = SyntaxCodeBlock.formats(this.children.head.domNode);\n if (forced || this.forceNext || this.cachedText !== text) {\n if (text.trim().length > 0 || this.cachedText == null) {\n const oldDelta = this.children.reduce((delta, child) => {\n // @ts-expect-error\n return delta.concat(blockDelta(child, false));\n }, new Delta());\n const delta = highlight(text, language);\n oldDelta.diff(delta).reduce((index, { retain, attributes }) => {\n // Should be all retains\n if (!retain) return index;\n if (attributes) {\n Object.keys(attributes).forEach((format) => {\n if (\n [SyntaxCodeBlock.blotName, CodeToken.blotName].includes(format)\n ) {\n // @ts-expect-error\n this.formatAt(index, retain, format, attributes[format]);\n }\n });\n }\n // @ts-expect-error\n return index + retain;\n }, 0);\n }\n this.cachedText = text;\n this.forceNext = false;\n }\n }\n\n html(index: number, length: number) {\n const [codeBlock] = this.children.find(index);\n const language = codeBlock\n ? SyntaxCodeBlock.formats(codeBlock.domNode)\n : 'plain';\n\n return `
    \\n${escapeText(\n      this.code(index, length),\n    )}\\n
    `;\n }\n\n optimize(context: Record) {\n super.optimize(context);\n if (\n this.parent != null &&\n this.children.head != null &&\n this.uiNode != null\n ) {\n const language = SyntaxCodeBlock.formats(this.children.head.domNode);\n // @ts-expect-error\n if (language !== this.uiNode.value) {\n // @ts-expect-error\n this.uiNode.value = language;\n }\n }\n }\n}\n\nSyntaxCodeBlockContainer.allowedChildren = [SyntaxCodeBlock];\nSyntaxCodeBlock.requiredContainer = SyntaxCodeBlockContainer;\nSyntaxCodeBlock.allowedChildren = [CodeToken, CursorBlot, TextBlot, BreakBlot];\n\ninterface SyntaxOptions {\n interval: number;\n languages: { key: string; label: string }[];\n hljs: any;\n}\n\nconst highlight = (lib: any, language: string, text: string) => {\n if (typeof lib.versionString === 'string') {\n const majorVersion = lib.versionString.split('.')[0];\n if (parseInt(majorVersion, 10) >= 11) {\n return lib.highlight(text, { language }).value;\n }\n }\n return lib.highlight(language, text).value;\n};\n\nclass Syntax extends Module {\n static DEFAULTS: SyntaxOptions & { hljs: any };\n\n static register() {\n Quill.register(CodeToken, true);\n Quill.register(SyntaxCodeBlock, true);\n Quill.register(SyntaxCodeBlockContainer, true);\n }\n\n languages: Record;\n\n constructor(quill: Quill, options: Partial) {\n super(quill, options);\n if (this.options.hljs == null) {\n throw new Error(\n 'Syntax module requires highlight.js. Please include the library on the page before Quill.',\n );\n }\n // @ts-expect-error Fix me later\n this.languages = this.options.languages.reduce(\n (memo: Record, { key }) => {\n memo[key] = true;\n return memo;\n },\n {},\n );\n this.highlightBlot = this.highlightBlot.bind(this);\n this.initListener();\n this.initTimer();\n }\n\n initListener() {\n this.quill.on(Quill.events.SCROLL_BLOT_MOUNT, (blot: Blot) => {\n if (!(blot instanceof SyntaxCodeBlockContainer)) return;\n const select = this.quill.root.ownerDocument.createElement('select');\n // @ts-expect-error Fix me later\n this.options.languages.forEach(({ key, label }) => {\n const option = select.ownerDocument.createElement('option');\n option.textContent = label;\n option.setAttribute('value', key);\n select.appendChild(option);\n });\n select.addEventListener('change', () => {\n blot.format(SyntaxCodeBlock.blotName, select.value);\n this.quill.root.focus(); // Prevent scrolling\n this.highlight(blot, true);\n });\n if (blot.uiNode == null) {\n blot.attachUI(select);\n if (blot.children.head) {\n select.value = SyntaxCodeBlock.formats(blot.children.head.domNode);\n }\n }\n });\n }\n\n initTimer() {\n let timer: ReturnType | null = null;\n this.quill.on(Quill.events.SCROLL_OPTIMIZE, () => {\n if (timer) {\n clearTimeout(timer);\n }\n timer = setTimeout(() => {\n this.highlight();\n timer = null;\n }, this.options.interval);\n });\n }\n\n highlight(blot: SyntaxCodeBlockContainer | null = null, force = false) {\n if (this.quill.selection.composing) return;\n this.quill.update(Quill.sources.USER);\n const range = this.quill.getSelection();\n const blots =\n blot == null\n ? this.quill.scroll.descendants(SyntaxCodeBlockContainer)\n : [blot];\n blots.forEach((container) => {\n container.highlight(this.highlightBlot, force);\n });\n this.quill.update(Quill.sources.SILENT);\n if (range != null) {\n this.quill.setSelection(range, Quill.sources.SILENT);\n }\n }\n\n highlightBlot(text: string, language = 'plain') {\n language = this.languages[language] ? language : 'plain';\n if (language === 'plain') {\n return escapeText(text)\n .split('\\n')\n .reduce((delta, line, i) => {\n if (i !== 0) {\n delta.insert('\\n', { [CodeBlock.blotName]: language });\n }\n return delta.insert(line);\n }, new Delta());\n }\n const container = this.quill.root.ownerDocument.createElement('div');\n container.classList.add(CodeBlock.className);\n container.innerHTML = highlight(this.options.hljs, language, text);\n return traverse(\n this.quill.scroll,\n container,\n [\n (node, delta) => {\n // @ts-expect-error\n const value = TokenAttributor.value(node);\n if (value) {\n return delta.compose(\n new Delta().retain(delta.length(), {\n [CodeToken.blotName]: value,\n }),\n );\n }\n return delta;\n },\n ],\n [\n (node, delta) => {\n // @ts-expect-error\n return node.data.split('\\n').reduce((memo, nodeText, i) => {\n if (i !== 0) memo.insert('\\n', { [CodeBlock.blotName]: language });\n return memo.insert(nodeText);\n }, delta);\n },\n ],\n new WeakMap(),\n );\n }\n}\nSyntax.DEFAULTS = {\n hljs: (() => {\n return window.hljs;\n })(),\n interval: 1000,\n languages: [\n { key: 'plain', label: 'Plain' },\n { key: 'bash', label: 'Bash' },\n { key: 'cpp', label: 'C++' },\n { key: 'cs', label: 'C#' },\n { key: 'css', label: 'CSS' },\n { key: 'diff', label: 'Diff' },\n { key: 'xml', label: 'HTML/XML' },\n { key: 'java', label: 'Java' },\n { key: 'javascript', label: 'JavaScript' },\n { key: 'markdown', label: 'Markdown' },\n { key: 'php', label: 'PHP' },\n { key: 'python', label: 'Python' },\n { key: 'ruby', label: 'Ruby' },\n { key: 'sql', label: 'SQL' },\n ],\n};\n\nexport { SyntaxCodeBlock as CodeBlock, CodeToken, Syntax as default };\n","import type { LinkedList } from 'parchment';\nimport Block from '../blots/block.js';\nimport Container from '../blots/container.js';\n\nclass TableCell extends Block {\n static blotName = 'table';\n static tagName = 'TD';\n\n static create(value: string) {\n const node = super.create() as HTMLElement;\n if (value) {\n node.setAttribute('data-row', value);\n } else {\n node.setAttribute('data-row', tableId());\n }\n return node;\n }\n\n static formats(domNode: HTMLElement) {\n if (domNode.hasAttribute('data-row')) {\n return domNode.getAttribute('data-row');\n }\n return undefined;\n }\n\n next: this | null;\n\n cellOffset() {\n if (this.parent) {\n return this.parent.children.indexOf(this);\n }\n return -1;\n }\n\n format(name: string, value: string) {\n if (name === TableCell.blotName && value) {\n this.domNode.setAttribute('data-row', value);\n } else {\n super.format(name, value);\n }\n }\n\n row(): TableRow {\n return this.parent as TableRow;\n }\n\n rowOffset() {\n if (this.row()) {\n return this.row().rowOffset();\n }\n return -1;\n }\n\n table() {\n return this.row() && this.row().table();\n }\n}\n\nclass TableRow extends Container {\n static blotName = 'table-row';\n static tagName = 'TR';\n\n children: LinkedList;\n next: this | null;\n\n checkMerge() {\n // @ts-expect-error\n if (super.checkMerge() && this.next.children.head != null) {\n // @ts-expect-error\n const thisHead = this.children.head.formats();\n // @ts-expect-error\n const thisTail = this.children.tail.formats();\n // @ts-expect-error\n const nextHead = this.next.children.head.formats();\n // @ts-expect-error\n const nextTail = this.next.children.tail.formats();\n return (\n thisHead.table === thisTail.table &&\n thisHead.table === nextHead.table &&\n thisHead.table === nextTail.table\n );\n }\n return false;\n }\n\n optimize(context: { [key: string]: any }) {\n super.optimize(context);\n this.children.forEach((child) => {\n if (child.next == null) return;\n const childFormats = child.formats();\n const nextFormats = child.next.formats();\n if (childFormats.table !== nextFormats.table) {\n const next = this.splitAfter(child);\n if (next) {\n // @ts-expect-error TODO: parameters of optimize() should be a optional\n next.optimize();\n }\n // We might be able to merge with prev now\n if (this.prev) {\n // @ts-expect-error TODO: parameters of optimize() should be a optional\n this.prev.optimize();\n }\n }\n });\n }\n\n rowOffset() {\n if (this.parent) {\n return this.parent.children.indexOf(this);\n }\n return -1;\n }\n\n table() {\n return this.parent && this.parent.parent;\n }\n}\n\nclass TableBody extends Container {\n static blotName = 'table-body';\n static tagName = 'TBODY';\n\n children: LinkedList;\n}\n\nclass TableContainer extends Container {\n static blotName = 'table-container';\n static tagName = 'TABLE';\n\n children: LinkedList;\n\n balanceCells() {\n const rows = this.descendants(TableRow);\n const maxColumns = rows.reduce((max, row) => {\n return Math.max(row.children.length, max);\n }, 0);\n rows.forEach((row) => {\n new Array(maxColumns - row.children.length).fill(0).forEach(() => {\n let value;\n if (row.children.head != null) {\n value = TableCell.formats(row.children.head.domNode);\n }\n const blot = this.scroll.create(TableCell.blotName, value);\n row.appendChild(blot);\n // @ts-expect-error TODO: parameters of optimize() should be a optional\n blot.optimize(); // Add break blot\n });\n });\n }\n\n cells(column: number) {\n return this.rows().map((row) => row.children.at(column));\n }\n\n deleteColumn(index: number) {\n // @ts-expect-error\n const [body] = this.descendant(TableBody) as TableBody[];\n if (body == null || body.children.head == null) return;\n body.children.forEach((row) => {\n const cell = row.children.at(index);\n if (cell != null) {\n cell.remove();\n }\n });\n }\n\n insertColumn(index: number) {\n // @ts-expect-error\n const [body] = this.descendant(TableBody) as TableBody[];\n if (body == null || body.children.head == null) return;\n body.children.forEach((row) => {\n const ref = row.children.at(index);\n // @ts-expect-error\n const value = TableCell.formats(row.children.head.domNode);\n const cell = this.scroll.create(TableCell.blotName, value);\n row.insertBefore(cell, ref);\n });\n }\n\n insertRow(index: number) {\n // @ts-expect-error\n const [body] = this.descendant(TableBody) as TableBody[];\n if (body == null || body.children.head == null) return;\n const id = tableId();\n const row = this.scroll.create(TableRow.blotName) as TableRow;\n body.children.head.children.forEach(() => {\n const cell = this.scroll.create(TableCell.blotName, id);\n row.appendChild(cell);\n });\n const ref = body.children.at(index);\n body.insertBefore(row, ref);\n }\n\n rows() {\n const body = this.children.head;\n if (body == null) return [];\n return body.children.map((row) => row);\n }\n}\n\nTableContainer.allowedChildren = [TableBody];\nTableBody.requiredContainer = TableContainer;\n\nTableBody.allowedChildren = [TableRow];\nTableRow.requiredContainer = TableBody;\n\nTableRow.allowedChildren = [TableCell];\nTableCell.requiredContainer = TableRow;\n\nfunction tableId() {\n const id = Math.random().toString(36).slice(2, 6);\n return `row-${id}`;\n}\n\nexport { TableCell, TableRow, TableBody, TableContainer, tableId };\n","import Delta from 'quill-delta';\nimport Quill from '../core/quill.js';\nimport Module from '../core/module.js';\nimport {\n TableCell,\n TableRow,\n TableBody,\n TableContainer,\n tableId,\n} from '../formats/table.js';\n\nclass Table extends Module {\n static register() {\n Quill.register(TableCell);\n Quill.register(TableRow);\n Quill.register(TableBody);\n Quill.register(TableContainer);\n }\n\n constructor(...args: ConstructorParameters) {\n super(...args);\n this.listenBalanceCells();\n }\n\n balanceTables() {\n this.quill.scroll.descendants(TableContainer).forEach((table) => {\n table.balanceCells();\n });\n }\n\n deleteColumn() {\n const [table, , cell] = this.getTable();\n if (cell == null) return;\n // @ts-expect-error\n table.deleteColumn(cell.cellOffset());\n this.quill.update(Quill.sources.USER);\n }\n\n deleteRow() {\n const [, row] = this.getTable();\n if (row == null) return;\n row.remove();\n this.quill.update(Quill.sources.USER);\n }\n\n deleteTable() {\n const [table] = this.getTable();\n if (table == null) return;\n // @ts-expect-error\n const offset = table.offset();\n // @ts-expect-error\n table.remove();\n this.quill.update(Quill.sources.USER);\n this.quill.setSelection(offset, Quill.sources.SILENT);\n }\n\n getTable(\n range = this.quill.getSelection(),\n ): [null, null, null, -1] | [Table, TableRow, TableCell, number] {\n if (range == null) return [null, null, null, -1];\n const [cell, offset] = this.quill.getLine(range.index);\n if (cell == null || cell.statics.blotName !== TableCell.blotName) {\n return [null, null, null, -1];\n }\n const row = cell.parent;\n const table = row.parent.parent;\n // @ts-expect-error\n return [table, row, cell, offset];\n }\n\n insertColumn(offset: number) {\n const range = this.quill.getSelection();\n if (!range) return;\n const [table, row, cell] = this.getTable(range);\n if (cell == null) return;\n const column = cell.cellOffset();\n table.insertColumn(column + offset);\n this.quill.update(Quill.sources.USER);\n let shift = row.rowOffset();\n if (offset === 0) {\n shift += 1;\n }\n this.quill.setSelection(\n range.index + shift,\n range.length,\n Quill.sources.SILENT,\n );\n }\n\n insertColumnLeft() {\n this.insertColumn(0);\n }\n\n insertColumnRight() {\n this.insertColumn(1);\n }\n\n insertRow(offset: number) {\n const range = this.quill.getSelection();\n if (!range) return;\n const [table, row, cell] = this.getTable(range);\n if (cell == null) return;\n const index = row.rowOffset();\n table.insertRow(index + offset);\n this.quill.update(Quill.sources.USER);\n if (offset > 0) {\n this.quill.setSelection(range, Quill.sources.SILENT);\n } else {\n this.quill.setSelection(\n range.index + row.children.length,\n range.length,\n Quill.sources.SILENT,\n );\n }\n }\n\n insertRowAbove() {\n this.insertRow(0);\n }\n\n insertRowBelow() {\n this.insertRow(1);\n }\n\n insertTable(rows: number, columns: number) {\n const range = this.quill.getSelection();\n if (range == null) return;\n const delta = new Array(rows).fill(0).reduce((memo) => {\n const text = new Array(columns).fill('\\n').join('');\n return memo.insert(text, { table: tableId() });\n }, new Delta().retain(range.index));\n this.quill.updateContents(delta, Quill.sources.USER);\n this.quill.setSelection(range.index, Quill.sources.SILENT);\n this.balanceTables();\n }\n\n listenBalanceCells() {\n this.quill.on(\n Quill.events.SCROLL_OPTIMIZE,\n (mutations: MutationRecord[]) => {\n mutations.some((mutation) => {\n if (\n ['TD', 'TR', 'TBODY', 'TABLE'].includes(\n (mutation.target as HTMLElement).tagName,\n )\n ) {\n this.quill.once(Quill.events.TEXT_CHANGE, (delta, old, source) => {\n if (source !== Quill.sources.USER) return;\n this.balanceTables();\n });\n return true;\n }\n return false;\n });\n },\n );\n }\n}\n\nexport default Table;\n","import Delta from 'quill-delta';\nimport { EmbedBlot, Scope } from 'parchment';\nimport Quill from '../core/quill.js';\nimport logger from '../core/logger.js';\nimport Module from '../core/module.js';\nimport type { Range } from '../core/selection.js';\n\nconst debug = logger('quill:toolbar');\n\ntype Handler = (this: Toolbar, value: any) => void;\n\nexport type ToolbarConfig = Array<\n string[] | Array>\n>;\nexport interface ToolbarProps {\n container?: HTMLElement | ToolbarConfig | null;\n handlers?: Record;\n option?: number;\n module?: boolean;\n theme?: boolean;\n}\n\nclass Toolbar extends Module {\n static DEFAULTS: ToolbarProps;\n\n container?: HTMLElement | null;\n controls: [string, HTMLElement][];\n handlers: Record;\n\n constructor(quill: Quill, options: Partial) {\n super(quill, options);\n if (Array.isArray(this.options.container)) {\n const container = document.createElement('div');\n container.setAttribute('role', 'toolbar');\n addControls(container, this.options.container);\n quill.container?.parentNode?.insertBefore(container, quill.container);\n this.container = container;\n } else if (typeof this.options.container === 'string') {\n this.container = document.querySelector(this.options.container);\n } else {\n this.container = this.options.container;\n }\n if (!(this.container instanceof HTMLElement)) {\n debug.error('Container required for toolbar', this.options);\n return;\n }\n this.container.classList.add('ql-toolbar');\n this.controls = [];\n this.handlers = {};\n if (this.options.handlers) {\n Object.keys(this.options.handlers).forEach((format) => {\n const handler = this.options.handlers?.[format];\n if (handler) {\n this.addHandler(format, handler);\n }\n });\n }\n Array.from(this.container.querySelectorAll('button, select')).forEach(\n (input) => {\n // @ts-expect-error\n this.attach(input);\n },\n );\n this.quill.on(Quill.events.EDITOR_CHANGE, () => {\n const [range] = this.quill.selection.getRange(); // quill.getSelection triggers update\n this.update(range);\n });\n }\n\n addHandler(format: string, handler: Handler) {\n this.handlers[format] = handler;\n }\n\n attach(input: HTMLElement) {\n let format = Array.from(input.classList).find((className) => {\n return className.indexOf('ql-') === 0;\n });\n if (!format) return;\n format = format.slice('ql-'.length);\n if (input.tagName === 'BUTTON') {\n input.setAttribute('type', 'button');\n }\n if (\n this.handlers[format] == null &&\n this.quill.scroll.query(format) == null\n ) {\n debug.warn('ignoring attaching to nonexistent format', format, input);\n return;\n }\n const eventName = input.tagName === 'SELECT' ? 'change' : 'click';\n input.addEventListener(eventName, (e) => {\n let value;\n if (input.tagName === 'SELECT') {\n // @ts-expect-error\n if (input.selectedIndex < 0) return;\n // @ts-expect-error\n const selected = input.options[input.selectedIndex];\n if (selected.hasAttribute('selected')) {\n value = false;\n } else {\n value = selected.value || false;\n }\n } else {\n if (input.classList.contains('ql-active')) {\n value = false;\n } else {\n // @ts-expect-error\n value = input.value || !input.hasAttribute('value');\n }\n e.preventDefault();\n }\n this.quill.focus();\n const [range] = this.quill.selection.getRange();\n if (this.handlers[format] != null) {\n this.handlers[format].call(this, value);\n } else if (\n // @ts-expect-error\n this.quill.scroll.query(format).prototype instanceof EmbedBlot\n ) {\n value = prompt(`Enter ${format}`); // eslint-disable-line no-alert\n if (!value) return;\n this.quill.updateContents(\n new Delta()\n // @ts-expect-error Fix me later\n .retain(range.index)\n // @ts-expect-error Fix me later\n .delete(range.length)\n .insert({ [format]: value }),\n Quill.sources.USER,\n );\n } else {\n this.quill.format(format, value, Quill.sources.USER);\n }\n this.update(range);\n });\n this.controls.push([format, input]);\n }\n\n update(range: Range | null) {\n const formats = range == null ? {} : this.quill.getFormat(range);\n this.controls.forEach((pair) => {\n const [format, input] = pair;\n if (input.tagName === 'SELECT') {\n let option: HTMLOptionElement | null = null;\n if (range == null) {\n option = null;\n } else if (formats[format] == null) {\n option = input.querySelector('option[selected]');\n } else if (!Array.isArray(formats[format])) {\n let value = formats[format];\n if (typeof value === 'string') {\n value = value.replace(/\"/g, '\\\\\"');\n }\n option = input.querySelector(`option[value=\"${value}\"]`);\n }\n if (option == null) {\n // @ts-expect-error TODO fix me later\n input.value = ''; // TODO make configurable?\n // @ts-expect-error TODO fix me later\n input.selectedIndex = -1;\n } else {\n option.selected = true;\n }\n } else if (range == null) {\n input.classList.remove('ql-active');\n input.setAttribute('aria-pressed', 'false');\n } else if (input.hasAttribute('value')) {\n // both being null should match (default values)\n // '1' should match with 1 (headers)\n const value = formats[format] as boolean | number | string | object;\n const isActive =\n value === input.getAttribute('value') ||\n (value != null && value.toString() === input.getAttribute('value')) ||\n (value == null && !input.getAttribute('value'));\n input.classList.toggle('ql-active', isActive);\n input.setAttribute('aria-pressed', isActive.toString());\n } else {\n const isActive = formats[format] != null;\n input.classList.toggle('ql-active', isActive);\n input.setAttribute('aria-pressed', isActive.toString());\n }\n });\n }\n}\nToolbar.DEFAULTS = {};\n\nfunction addButton(container: HTMLElement, format: string, value?: string) {\n const input = document.createElement('button');\n input.setAttribute('type', 'button');\n input.classList.add(`ql-${format}`);\n input.setAttribute('aria-pressed', 'false');\n if (value != null) {\n input.value = value;\n input.setAttribute('aria-label', `${format}: ${value}`);\n } else {\n input.setAttribute('aria-label', format);\n }\n container.appendChild(input);\n}\n\nfunction addControls(\n container: HTMLElement,\n groups:\n | (string | Record)[][]\n | (string | Record)[],\n) {\n if (!Array.isArray(groups[0])) {\n // @ts-expect-error\n groups = [groups];\n }\n groups.forEach((controls: any) => {\n const group = document.createElement('span');\n group.classList.add('ql-formats');\n controls.forEach((control: any) => {\n if (typeof control === 'string') {\n addButton(group, control);\n } else {\n const format = Object.keys(control)[0];\n const value = control[format];\n if (Array.isArray(value)) {\n addSelect(group, format, value);\n } else {\n addButton(group, format, value);\n }\n }\n });\n container.appendChild(group);\n });\n}\n\nfunction addSelect(\n container: HTMLElement,\n format: string,\n values: Array,\n) {\n const input = document.createElement('select');\n input.classList.add(`ql-${format}`);\n values.forEach((value) => {\n const option = document.createElement('option');\n if (value !== false) {\n option.setAttribute('value', String(value));\n } else {\n option.setAttribute('selected', 'selected');\n }\n input.appendChild(option);\n });\n container.appendChild(input);\n}\n\nToolbar.DEFAULTS = {\n container: null,\n handlers: {\n clean() {\n const range = this.quill.getSelection();\n if (range == null) return;\n if (range.length === 0) {\n const formats = this.quill.getFormat();\n Object.keys(formats).forEach((name) => {\n // Clean functionality in existing apps only clean inline formats\n if (this.quill.scroll.query(name, Scope.INLINE) != null) {\n this.quill.format(name, false, Quill.sources.USER);\n }\n });\n } else {\n this.quill.removeFormat(range.index, range.length, Quill.sources.USER);\n }\n },\n direction(value) {\n const { align } = this.quill.getFormat();\n if (value === 'rtl' && align == null) {\n this.quill.format('align', 'right', Quill.sources.USER);\n } else if (!value && align === 'right') {\n this.quill.format('align', false, Quill.sources.USER);\n }\n this.quill.format('direction', value, Quill.sources.USER);\n },\n indent(value) {\n const range = this.quill.getSelection();\n // @ts-expect-error\n const formats = this.quill.getFormat(range);\n // @ts-expect-error\n const indent = parseInt(formats.indent || 0, 10);\n if (value === '+1' || value === '-1') {\n let modifier = value === '+1' ? 1 : -1;\n if (formats.direction === 'rtl') modifier *= -1;\n this.quill.format('indent', indent + modifier, Quill.sources.USER);\n }\n },\n link(value) {\n if (value === true) {\n value = prompt('Enter link URL:'); // eslint-disable-line no-alert\n }\n this.quill.format('link', value, Quill.sources.USER);\n },\n list(value) {\n const range = this.quill.getSelection();\n // @ts-expect-error\n const formats = this.quill.getFormat(range);\n if (value === 'check') {\n if (formats.list === 'checked' || formats.list === 'unchecked') {\n this.quill.format('list', false, Quill.sources.USER);\n } else {\n this.quill.format('list', 'unchecked', Quill.sources.USER);\n }\n } else {\n this.quill.format('list', value, Quill.sources.USER);\n }\n },\n },\n};\n\nexport { Toolbar as default, addControls };\n","import alignLeftIcon from '../assets/icons/align-left.svg';\nimport alignCenterIcon from '../assets/icons/align-center.svg';\nimport alignRightIcon from '../assets/icons/align-right.svg';\nimport alignJustifyIcon from '../assets/icons/align-justify.svg';\nimport backgroundIcon from '../assets/icons/background.svg';\nimport blockquoteIcon from '../assets/icons/blockquote.svg';\nimport boldIcon from '../assets/icons/bold.svg';\nimport cleanIcon from '../assets/icons/clean.svg';\nimport codeIcon from '../assets/icons/code.svg';\nimport colorIcon from '../assets/icons/color.svg';\nimport directionLeftToRightIcon from '../assets/icons/direction-ltr.svg';\nimport directionRightToLeftIcon from '../assets/icons/direction-rtl.svg';\nimport formulaIcon from '../assets/icons/formula.svg';\nimport headerIcon from '../assets/icons/header.svg';\nimport header2Icon from '../assets/icons/header-2.svg';\nimport header3Icon from '../assets/icons/header-3.svg';\nimport header4Icon from '../assets/icons/header-4.svg';\nimport header5Icon from '../assets/icons/header-5.svg';\nimport header6Icon from '../assets/icons/header-6.svg';\nimport italicIcon from '../assets/icons/italic.svg';\nimport imageIcon from '../assets/icons/image.svg';\nimport indentIcon from '../assets/icons/indent.svg';\nimport outdentIcon from '../assets/icons/outdent.svg';\nimport linkIcon from '../assets/icons/link.svg';\nimport listBulletIcon from '../assets/icons/list-bullet.svg';\nimport listCheckIcon from '../assets/icons/list-check.svg';\nimport listOrderedIcon from '../assets/icons/list-ordered.svg';\nimport subscriptIcon from '../assets/icons/subscript.svg';\nimport superscriptIcon from '../assets/icons/superscript.svg';\nimport strikeIcon from '../assets/icons/strike.svg';\nimport tableIcon from '../assets/icons/table.svg';\nimport underlineIcon from '../assets/icons/underline.svg';\nimport videoIcon from '../assets/icons/video.svg';\n\nexport default {\n align: {\n '': alignLeftIcon,\n center: alignCenterIcon,\n right: alignRightIcon,\n justify: alignJustifyIcon,\n },\n background: backgroundIcon,\n blockquote: blockquoteIcon,\n bold: boldIcon,\n clean: cleanIcon,\n code: codeIcon,\n 'code-block': codeIcon,\n color: colorIcon,\n direction: {\n '': directionLeftToRightIcon,\n rtl: directionRightToLeftIcon,\n },\n formula: formulaIcon,\n header: {\n '1': headerIcon,\n '2': header2Icon,\n '3': header3Icon,\n '4': header4Icon,\n '5': header5Icon,\n '6': header6Icon,\n },\n italic: italicIcon,\n image: imageIcon,\n indent: {\n '+1': indentIcon,\n '-1': outdentIcon,\n },\n link: linkIcon,\n list: {\n bullet: listBulletIcon,\n check: listCheckIcon,\n ordered: listOrderedIcon,\n },\n script: {\n sub: subscriptIcon,\n super: superscriptIcon,\n },\n strike: strikeIcon,\n table: tableIcon,\n underline: underlineIcon,\n video: videoIcon,\n};\n","import DropdownIcon from '../assets/icons/dropdown.svg';\n\nlet optionsCounter = 0;\n\nfunction toggleAriaAttribute(element: HTMLElement, attribute: string) {\n element.setAttribute(\n attribute,\n `${!(element.getAttribute(attribute) === 'true')}`,\n );\n}\n\nclass Picker {\n select: HTMLSelectElement;\n container: HTMLElement;\n label: HTMLElement;\n\n constructor(select: HTMLSelectElement) {\n this.select = select;\n this.container = document.createElement('span');\n this.buildPicker();\n this.select.style.display = 'none';\n // @ts-expect-error Fix me later\n this.select.parentNode.insertBefore(this.container, this.select);\n\n this.label.addEventListener('mousedown', () => {\n this.togglePicker();\n });\n this.label.addEventListener('keydown', (event) => {\n switch (event.key) {\n case 'Enter':\n this.togglePicker();\n break;\n case 'Escape':\n this.escape();\n event.preventDefault();\n break;\n default:\n }\n });\n this.select.addEventListener('change', this.update.bind(this));\n }\n\n togglePicker() {\n this.container.classList.toggle('ql-expanded');\n // Toggle aria-expanded and aria-hidden to make the picker accessible\n toggleAriaAttribute(this.label, 'aria-expanded');\n // @ts-expect-error\n toggleAriaAttribute(this.options, 'aria-hidden');\n }\n\n buildItem(option: HTMLOptionElement) {\n const item = document.createElement('span');\n // @ts-expect-error\n item.tabIndex = '0';\n item.setAttribute('role', 'button');\n item.classList.add('ql-picker-item');\n const value = option.getAttribute('value');\n if (value) {\n item.setAttribute('data-value', value);\n }\n if (option.textContent) {\n item.setAttribute('data-label', option.textContent);\n }\n item.addEventListener('click', () => {\n this.selectItem(item, true);\n });\n item.addEventListener('keydown', (event) => {\n switch (event.key) {\n case 'Enter':\n this.selectItem(item, true);\n event.preventDefault();\n break;\n case 'Escape':\n this.escape();\n event.preventDefault();\n break;\n default:\n }\n });\n\n return item;\n }\n\n buildLabel() {\n const label = document.createElement('span');\n label.classList.add('ql-picker-label');\n label.innerHTML = DropdownIcon;\n // @ts-expect-error\n label.tabIndex = '0';\n label.setAttribute('role', 'button');\n label.setAttribute('aria-expanded', 'false');\n this.container.appendChild(label);\n return label;\n }\n\n buildOptions() {\n const options = document.createElement('span');\n options.classList.add('ql-picker-options');\n\n // Don't want screen readers to read this until options are visible\n options.setAttribute('aria-hidden', 'true');\n // @ts-expect-error\n options.tabIndex = '-1';\n\n // Need a unique id for aria-controls\n options.id = `ql-picker-options-${optionsCounter}`;\n optionsCounter += 1;\n this.label.setAttribute('aria-controls', options.id);\n\n // @ts-expect-error\n this.options = options;\n\n Array.from(this.select.options).forEach((option) => {\n const item = this.buildItem(option);\n options.appendChild(item);\n if (option.selected === true) {\n this.selectItem(item);\n }\n });\n this.container.appendChild(options);\n }\n\n buildPicker() {\n Array.from(this.select.attributes).forEach((item) => {\n this.container.setAttribute(item.name, item.value);\n });\n this.container.classList.add('ql-picker');\n this.label = this.buildLabel();\n this.buildOptions();\n }\n\n escape() {\n // Close menu and return focus to trigger label\n this.close();\n // Need setTimeout for accessibility to ensure that the browser executes\n // focus on the next process thread and after any DOM content changes\n setTimeout(() => this.label.focus(), 1);\n }\n\n close() {\n this.container.classList.remove('ql-expanded');\n this.label.setAttribute('aria-expanded', 'false');\n // @ts-expect-error\n this.options.setAttribute('aria-hidden', 'true');\n }\n\n selectItem(item: HTMLElement | null, trigger = false) {\n const selected = this.container.querySelector('.ql-selected');\n if (item === selected) return;\n if (selected != null) {\n selected.classList.remove('ql-selected');\n }\n if (item == null) return;\n item.classList.add('ql-selected');\n // @ts-expect-error Fix me later\n this.select.selectedIndex = Array.from(item.parentNode.children).indexOf(\n item,\n );\n if (item.hasAttribute('data-value')) {\n // @ts-expect-error Fix me later\n this.label.setAttribute('data-value', item.getAttribute('data-value'));\n } else {\n this.label.removeAttribute('data-value');\n }\n if (item.hasAttribute('data-label')) {\n // @ts-expect-error Fix me later\n this.label.setAttribute('data-label', item.getAttribute('data-label'));\n } else {\n this.label.removeAttribute('data-label');\n }\n if (trigger) {\n this.select.dispatchEvent(new Event('change'));\n this.close();\n }\n }\n\n update() {\n let option;\n if (this.select.selectedIndex > -1) {\n const item =\n // @ts-expect-error Fix me later\n this.container.querySelector('.ql-picker-options').children[\n this.select.selectedIndex\n ];\n option = this.select.options[this.select.selectedIndex];\n // @ts-expect-error\n this.selectItem(item);\n } else {\n this.selectItem(null);\n }\n const isActive =\n option != null &&\n option !== this.select.querySelector('option[selected]');\n this.label.classList.toggle('ql-active', isActive);\n }\n}\n\nexport default Picker;\n","import Picker from './picker.js';\n\nclass ColorPicker extends Picker {\n constructor(select: HTMLSelectElement, label: string) {\n super(select);\n this.label.innerHTML = label;\n this.container.classList.add('ql-color-picker');\n Array.from(this.container.querySelectorAll('.ql-picker-item'))\n .slice(0, 7)\n .forEach((item) => {\n item.classList.add('ql-primary');\n });\n }\n\n buildItem(option: HTMLOptionElement) {\n const item = super.buildItem(option);\n item.style.backgroundColor = option.getAttribute('value') || '';\n return item;\n }\n\n selectItem(item: HTMLElement | null, trigger?: boolean) {\n super.selectItem(item, trigger);\n const colorLabel = this.label.querySelector('.ql-color-label');\n const value = item ? item.getAttribute('data-value') || '' : '';\n if (colorLabel) {\n if (colorLabel.tagName === 'line') {\n colorLabel.style.stroke = value;\n } else {\n colorLabel.style.fill = value;\n }\n }\n }\n}\n\nexport default ColorPicker;\n","import Picker from './picker.js';\n\nclass IconPicker extends Picker {\n defaultItem: HTMLElement | null;\n\n constructor(select: HTMLSelectElement, icons: Record) {\n super(select);\n this.container.classList.add('ql-icon-picker');\n Array.from(this.container.querySelectorAll('.ql-picker-item')).forEach(\n (item) => {\n item.innerHTML = icons[item.getAttribute('data-value') || ''];\n },\n );\n this.defaultItem = this.container.querySelector('.ql-selected');\n this.selectItem(this.defaultItem);\n }\n\n selectItem(target: HTMLElement | null, trigger?: boolean) {\n super.selectItem(target, trigger);\n const item = target || this.defaultItem;\n if (item != null) {\n if (this.label.innerHTML === item.innerHTML) return;\n this.label.innerHTML = item.innerHTML;\n }\n }\n}\n\nexport default IconPicker;\n","import type Quill from '../core.js';\nimport type { Bounds } from '../core/selection.js';\n\nconst isScrollable = (el: Element) => {\n const { overflowY } = getComputedStyle(el, null);\n return overflowY !== 'visible' && overflowY !== 'clip';\n};\n\nclass Tooltip {\n quill: Quill;\n boundsContainer: HTMLElement;\n root: HTMLDivElement;\n\n constructor(quill: Quill, boundsContainer?: HTMLElement) {\n this.quill = quill;\n this.boundsContainer = boundsContainer || document.body;\n this.root = quill.addContainer('ql-tooltip');\n // @ts-expect-error\n this.root.innerHTML = this.constructor.TEMPLATE;\n if (isScrollable(this.quill.root)) {\n this.quill.root.addEventListener('scroll', () => {\n this.root.style.marginTop = `${-1 * this.quill.root.scrollTop}px`;\n });\n }\n this.hide();\n }\n\n hide() {\n this.root.classList.add('ql-hidden');\n }\n\n position(reference: Bounds) {\n const left =\n reference.left + reference.width / 2 - this.root.offsetWidth / 2;\n // root.scrollTop should be 0 if scrollContainer !== root\n const top = reference.bottom + this.quill.root.scrollTop;\n this.root.style.left = `${left}px`;\n this.root.style.top = `${top}px`;\n this.root.classList.remove('ql-flip');\n const containerBounds = this.boundsContainer.getBoundingClientRect();\n const rootBounds = this.root.getBoundingClientRect();\n let shift = 0;\n if (rootBounds.right > containerBounds.right) {\n shift = containerBounds.right - rootBounds.right;\n this.root.style.left = `${left + shift}px`;\n }\n if (rootBounds.left < containerBounds.left) {\n shift = containerBounds.left - rootBounds.left;\n this.root.style.left = `${left + shift}px`;\n }\n if (rootBounds.bottom > containerBounds.bottom) {\n const height = rootBounds.bottom - rootBounds.top;\n const verticalShift = reference.bottom - reference.top + height;\n this.root.style.top = `${top - verticalShift}px`;\n this.root.classList.add('ql-flip');\n }\n return shift;\n }\n\n show() {\n this.root.classList.remove('ql-editing');\n this.root.classList.remove('ql-hidden');\n }\n}\n\nexport default Tooltip;\n","import { merge } from 'lodash-es';\nimport type Quill from '../core/quill.js';\nimport Emitter from '../core/emitter.js';\nimport Theme from '../core/theme.js';\nimport type { ThemeOptions } from '../core/theme.js';\nimport ColorPicker from '../ui/color-picker.js';\nimport IconPicker from '../ui/icon-picker.js';\nimport Picker from '../ui/picker.js';\nimport Tooltip from '../ui/tooltip.js';\nimport type { Range } from '../core/selection.js';\nimport type Clipboard from '../modules/clipboard.js';\nimport type History from '../modules/history.js';\nimport type Keyboard from '../modules/keyboard.js';\nimport type Uploader from '../modules/uploader.js';\nimport type Selection from '../core/selection.js';\n\nconst ALIGNS = [false, 'center', 'right', 'justify'];\n\nconst COLORS = [\n '#000000',\n '#e60000',\n '#ff9900',\n '#ffff00',\n '#008a00',\n '#0066cc',\n '#9933ff',\n '#ffffff',\n '#facccc',\n '#ffebcc',\n '#ffffcc',\n '#cce8cc',\n '#cce0f5',\n '#ebd6ff',\n '#bbbbbb',\n '#f06666',\n '#ffc266',\n '#ffff66',\n '#66b966',\n '#66a3e0',\n '#c285ff',\n '#888888',\n '#a10000',\n '#b26b00',\n '#b2b200',\n '#006100',\n '#0047b2',\n '#6b24b2',\n '#444444',\n '#5c0000',\n '#663d00',\n '#666600',\n '#003700',\n '#002966',\n '#3d1466',\n];\n\nconst FONTS = [false, 'serif', 'monospace'];\n\nconst HEADERS = ['1', '2', '3', false];\n\nconst SIZES = ['small', false, 'large', 'huge'];\n\nclass BaseTheme extends Theme {\n pickers: Picker[];\n tooltip?: Tooltip;\n\n constructor(quill: Quill, options: ThemeOptions) {\n super(quill, options);\n const listener = (e: MouseEvent) => {\n if (!document.body.contains(quill.root)) {\n document.body.removeEventListener('click', listener);\n return;\n }\n if (\n this.tooltip != null &&\n // @ts-expect-error\n !this.tooltip.root.contains(e.target) &&\n // @ts-expect-error\n document.activeElement !== this.tooltip.textbox &&\n !this.quill.hasFocus()\n ) {\n this.tooltip.hide();\n }\n if (this.pickers != null) {\n this.pickers.forEach((picker) => {\n // @ts-expect-error\n if (!picker.container.contains(e.target)) {\n picker.close();\n }\n });\n }\n };\n quill.emitter.listenDOM('click', document.body, listener);\n }\n\n addModule(name: 'clipboard'): Clipboard;\n addModule(name: 'keyboard'): Keyboard;\n addModule(name: 'uploader'): Uploader;\n addModule(name: 'history'): History;\n addModule(name: 'selection'): Selection;\n addModule(name: string): unknown;\n addModule(name: string) {\n const module = super.addModule(name);\n if (name === 'toolbar') {\n // @ts-expect-error\n this.extendToolbar(module);\n }\n return module;\n }\n\n buildButtons(\n buttons: NodeListOf,\n icons: Record | string>,\n ) {\n Array.from(buttons).forEach((button) => {\n const className = button.getAttribute('class') || '';\n className.split(/\\s+/).forEach((name) => {\n if (!name.startsWith('ql-')) return;\n name = name.slice('ql-'.length);\n if (icons[name] == null) return;\n if (name === 'direction') {\n // @ts-expect-error\n button.innerHTML = icons[name][''] + icons[name].rtl;\n } else if (typeof icons[name] === 'string') {\n // @ts-expect-error\n button.innerHTML = icons[name];\n } else {\n // @ts-expect-error\n const value = button.value || '';\n // @ts-expect-error\n if (value != null && icons[name][value]) {\n // @ts-expect-error\n button.innerHTML = icons[name][value];\n }\n }\n });\n });\n }\n\n buildPickers(\n selects: NodeListOf,\n icons: Record>,\n ) {\n this.pickers = Array.from(selects).map((select) => {\n if (select.classList.contains('ql-align')) {\n if (select.querySelector('option') == null) {\n fillSelect(select, ALIGNS);\n }\n if (typeof icons.align === 'object') {\n return new IconPicker(select, icons.align);\n }\n }\n if (\n select.classList.contains('ql-background') ||\n select.classList.contains('ql-color')\n ) {\n const format = select.classList.contains('ql-background')\n ? 'background'\n : 'color';\n if (select.querySelector('option') == null) {\n fillSelect(\n select,\n COLORS,\n format === 'background' ? '#ffffff' : '#000000',\n );\n }\n return new ColorPicker(select, icons[format] as string);\n }\n if (select.querySelector('option') == null) {\n if (select.classList.contains('ql-font')) {\n fillSelect(select, FONTS);\n } else if (select.classList.contains('ql-header')) {\n fillSelect(select, HEADERS);\n } else if (select.classList.contains('ql-size')) {\n fillSelect(select, SIZES);\n }\n }\n return new Picker(select);\n });\n const update = () => {\n this.pickers.forEach((picker) => {\n picker.update();\n });\n };\n this.quill.on(Emitter.events.EDITOR_CHANGE, update);\n }\n}\nBaseTheme.DEFAULTS = merge({}, Theme.DEFAULTS, {\n modules: {\n toolbar: {\n handlers: {\n formula() {\n this.quill.theme.tooltip.edit('formula');\n },\n image() {\n let fileInput = this.container.querySelector(\n 'input.ql-image[type=file]',\n );\n if (fileInput == null) {\n fileInput = document.createElement('input');\n fileInput.setAttribute('type', 'file');\n fileInput.setAttribute(\n 'accept',\n this.quill.uploader.options.mimetypes.join(', '),\n );\n fileInput.classList.add('ql-image');\n fileInput.addEventListener('change', () => {\n const range = this.quill.getSelection(true);\n this.quill.uploader.upload(range, fileInput.files);\n fileInput.value = '';\n });\n this.container.appendChild(fileInput);\n }\n fileInput.click();\n },\n video() {\n this.quill.theme.tooltip.edit('video');\n },\n },\n },\n },\n});\n\nclass BaseTooltip extends Tooltip {\n textbox: HTMLInputElement | null;\n linkRange?: Range;\n\n constructor(quill: Quill, boundsContainer?: HTMLElement) {\n super(quill, boundsContainer);\n this.textbox = this.root.querySelector('input[type=\"text\"]');\n this.listen();\n }\n\n listen() {\n // @ts-expect-error Fix me later\n this.textbox.addEventListener('keydown', (event) => {\n if (event.key === 'Enter') {\n this.save();\n event.preventDefault();\n } else if (event.key === 'Escape') {\n this.cancel();\n event.preventDefault();\n }\n });\n }\n\n cancel() {\n this.hide();\n this.restoreFocus();\n }\n\n edit(mode = 'link', preview: string | null = null) {\n this.root.classList.remove('ql-hidden');\n this.root.classList.add('ql-editing');\n if (this.textbox == null) return;\n\n if (preview != null) {\n this.textbox.value = preview;\n } else if (mode !== this.root.getAttribute('data-mode')) {\n this.textbox.value = '';\n }\n const bounds = this.quill.getBounds(this.quill.selection.savedRange);\n if (bounds != null) {\n this.position(bounds);\n }\n this.textbox.select();\n this.textbox.setAttribute(\n 'placeholder',\n this.textbox.getAttribute(`data-${mode}`) || '',\n );\n this.root.setAttribute('data-mode', mode);\n }\n\n restoreFocus() {\n this.quill.focus({ preventScroll: true });\n }\n\n save() {\n // @ts-expect-error Fix me later\n let { value } = this.textbox;\n switch (this.root.getAttribute('data-mode')) {\n case 'link': {\n const { scrollTop } = this.quill.root;\n if (this.linkRange) {\n this.quill.formatText(\n this.linkRange,\n 'link',\n value,\n Emitter.sources.USER,\n );\n delete this.linkRange;\n } else {\n this.restoreFocus();\n this.quill.format('link', value, Emitter.sources.USER);\n }\n this.quill.root.scrollTop = scrollTop;\n break;\n }\n case 'video': {\n value = extractVideoUrl(value);\n } // eslint-disable-next-line no-fallthrough\n case 'formula': {\n if (!value) break;\n const range = this.quill.getSelection(true);\n if (range != null) {\n const index = range.index + range.length;\n this.quill.insertEmbed(\n index,\n // @ts-expect-error Fix me later\n this.root.getAttribute('data-mode'),\n value,\n Emitter.sources.USER,\n );\n if (this.root.getAttribute('data-mode') === 'formula') {\n this.quill.insertText(index + 1, ' ', Emitter.sources.USER);\n }\n this.quill.setSelection(index + 2, Emitter.sources.USER);\n }\n break;\n }\n default:\n }\n // @ts-expect-error Fix me later\n this.textbox.value = '';\n this.hide();\n }\n}\n\nfunction extractVideoUrl(url: string) {\n let match =\n url.match(\n /^(?:(https?):\\/\\/)?(?:(?:www|m)\\.)?youtube\\.com\\/watch.*v=([a-zA-Z0-9_-]+)/,\n ) ||\n url.match(/^(?:(https?):\\/\\/)?(?:(?:www|m)\\.)?youtu\\.be\\/([a-zA-Z0-9_-]+)/);\n if (match) {\n return `${match[1] || 'https'}://www.youtube.com/embed/${\n match[2]\n }?showinfo=0`;\n }\n // eslint-disable-next-line no-cond-assign\n if ((match = url.match(/^(?:(https?):\\/\\/)?(?:www\\.)?vimeo\\.com\\/(\\d+)/))) {\n return `${match[1] || 'https'}://player.vimeo.com/video/${match[2]}/`;\n }\n return url;\n}\n\nfunction fillSelect(\n select: HTMLSelectElement,\n values: Array,\n defaultValue: unknown = false,\n) {\n values.forEach((value) => {\n const option = document.createElement('option');\n if (value === defaultValue) {\n option.setAttribute('selected', 'selected');\n } else {\n option.setAttribute('value', String(value));\n }\n select.appendChild(option);\n });\n}\n\nexport { BaseTooltip, BaseTheme as default };\n","import { merge } from 'lodash-es';\nimport Emitter from '../core/emitter.js';\nimport BaseTheme, { BaseTooltip } from './base.js';\nimport { Range } from '../core/selection.js';\nimport type { Bounds } from '../core/selection.js';\nimport icons from '../ui/icons.js';\nimport Quill from '../core/quill.js';\nimport type { ThemeOptions } from '../core/theme.js';\nimport type Toolbar from '../modules/toolbar.js';\nimport type { ToolbarConfig } from '../modules/toolbar.js';\n\nconst TOOLBAR_CONFIG: ToolbarConfig = [\n ['bold', 'italic', 'link'],\n [{ header: 1 }, { header: 2 }, 'blockquote'],\n];\n\nclass BubbleTooltip extends BaseTooltip {\n static TEMPLATE = [\n '',\n '
    ',\n '',\n '',\n '
    ',\n ].join('');\n\n constructor(quill: Quill, bounds?: HTMLElement) {\n super(quill, bounds);\n this.quill.on(\n Emitter.events.EDITOR_CHANGE,\n (type, range, oldRange, source) => {\n if (type !== Emitter.events.SELECTION_CHANGE) return;\n if (\n range != null &&\n range.length > 0 &&\n source === Emitter.sources.USER\n ) {\n this.show();\n // Lock our width so we will expand beyond our offsetParent boundaries\n this.root.style.left = '0px';\n this.root.style.width = '';\n this.root.style.width = `${this.root.offsetWidth}px`;\n const lines = this.quill.getLines(range.index, range.length);\n if (lines.length === 1) {\n const bounds = this.quill.getBounds(range);\n if (bounds != null) {\n this.position(bounds);\n }\n } else {\n const lastLine = lines[lines.length - 1];\n const index = this.quill.getIndex(lastLine);\n const length = Math.min(\n lastLine.length() - 1,\n range.index + range.length - index,\n );\n const indexBounds = this.quill.getBounds(new Range(index, length));\n if (indexBounds != null) {\n this.position(indexBounds);\n }\n }\n } else if (\n document.activeElement !== this.textbox &&\n this.quill.hasFocus()\n ) {\n this.hide();\n }\n },\n );\n }\n\n listen() {\n super.listen();\n // @ts-expect-error Fix me later\n this.root.querySelector('.ql-close').addEventListener('click', () => {\n this.root.classList.remove('ql-editing');\n });\n this.quill.on(Emitter.events.SCROLL_OPTIMIZE, () => {\n // Let selection be restored by toolbar handlers before repositioning\n setTimeout(() => {\n if (this.root.classList.contains('ql-hidden')) return;\n const range = this.quill.getSelection();\n if (range != null) {\n const bounds = this.quill.getBounds(range);\n if (bounds != null) {\n this.position(bounds);\n }\n }\n }, 1);\n });\n }\n\n cancel() {\n this.show();\n }\n\n position(reference: Bounds) {\n const shift = super.position(reference);\n const arrow = this.root.querySelector('.ql-tooltip-arrow');\n // @ts-expect-error\n arrow.style.marginLeft = '';\n if (shift !== 0) {\n // @ts-expect-error\n arrow.style.marginLeft = `${-1 * shift - arrow.offsetWidth / 2}px`;\n }\n return shift;\n }\n}\n\nclass BubbleTheme extends BaseTheme {\n tooltip: BubbleTooltip;\n\n constructor(quill: Quill, options: ThemeOptions) {\n if (\n options.modules.toolbar != null &&\n options.modules.toolbar.container == null\n ) {\n options.modules.toolbar.container = TOOLBAR_CONFIG;\n }\n super(quill, options);\n this.quill.container.classList.add('ql-bubble');\n }\n\n extendToolbar(toolbar: Toolbar) {\n // @ts-expect-error\n this.tooltip = new BubbleTooltip(this.quill, this.options.bounds);\n if (toolbar.container != null) {\n this.tooltip.root.appendChild(toolbar.container);\n this.buildButtons(toolbar.container.querySelectorAll('button'), icons);\n this.buildPickers(toolbar.container.querySelectorAll('select'), icons);\n }\n }\n}\nBubbleTheme.DEFAULTS = merge({}, BaseTheme.DEFAULTS, {\n modules: {\n toolbar: {\n handlers: {\n link(value: string) {\n if (!value) {\n this.quill.format('link', false, Quill.sources.USER);\n } else {\n // @ts-expect-error\n this.quill.theme.tooltip.edit();\n }\n },\n },\n },\n },\n} satisfies ThemeOptions);\n\nexport { BubbleTooltip, BubbleTheme as default };\n","import { merge } from 'lodash-es';\nimport Emitter from '../core/emitter.js';\nimport BaseTheme, { BaseTooltip } from './base.js';\nimport LinkBlot from '../formats/link.js';\nimport { Range } from '../core/selection.js';\nimport icons from '../ui/icons.js';\nimport Quill from '../core/quill.js';\nimport type { Context } from '../modules/keyboard.js';\nimport type Toolbar from '../modules/toolbar.js';\nimport type { ToolbarConfig } from '../modules/toolbar.js';\nimport type { ThemeOptions } from '../core/theme.js';\n\nconst TOOLBAR_CONFIG: ToolbarConfig = [\n [{ header: ['1', '2', '3', false] }],\n ['bold', 'italic', 'underline', 'link'],\n [{ list: 'ordered' }, { list: 'bullet' }],\n ['clean'],\n];\n\nclass SnowTooltip extends BaseTooltip {\n static TEMPLATE = [\n '',\n '',\n '',\n '',\n ].join('');\n\n preview = this.root.querySelector('a.ql-preview');\n\n listen() {\n super.listen();\n // @ts-expect-error Fix me later\n this.root\n .querySelector('a.ql-action')\n .addEventListener('click', (event) => {\n if (this.root.classList.contains('ql-editing')) {\n this.save();\n } else {\n // @ts-expect-error Fix me later\n this.edit('link', this.preview.textContent);\n }\n event.preventDefault();\n });\n // @ts-expect-error Fix me later\n this.root\n .querySelector('a.ql-remove')\n .addEventListener('click', (event) => {\n if (this.linkRange != null) {\n const range = this.linkRange;\n this.restoreFocus();\n this.quill.formatText(range, 'link', false, Emitter.sources.USER);\n delete this.linkRange;\n }\n event.preventDefault();\n this.hide();\n });\n this.quill.on(\n Emitter.events.SELECTION_CHANGE,\n (range, oldRange, source) => {\n if (range == null) return;\n if (range.length === 0 && source === Emitter.sources.USER) {\n const [link, offset] = this.quill.scroll.descendant(\n LinkBlot,\n range.index,\n );\n if (link != null) {\n this.linkRange = new Range(range.index - offset, link.length());\n const preview = LinkBlot.formats(link.domNode);\n // @ts-expect-error Fix me later\n this.preview.textContent = preview;\n // @ts-expect-error Fix me later\n this.preview.setAttribute('href', preview);\n this.show();\n const bounds = this.quill.getBounds(this.linkRange);\n if (bounds != null) {\n this.position(bounds);\n }\n return;\n }\n } else {\n delete this.linkRange;\n }\n this.hide();\n },\n );\n }\n\n show() {\n super.show();\n this.root.removeAttribute('data-mode');\n }\n}\n\nclass SnowTheme extends BaseTheme {\n constructor(quill: Quill, options: ThemeOptions) {\n if (\n options.modules.toolbar != null &&\n options.modules.toolbar.container == null\n ) {\n options.modules.toolbar.container = TOOLBAR_CONFIG;\n }\n super(quill, options);\n this.quill.container.classList.add('ql-snow');\n }\n\n extendToolbar(toolbar: Toolbar) {\n if (toolbar.container != null) {\n toolbar.container.classList.add('ql-snow');\n this.buildButtons(toolbar.container.querySelectorAll('button'), icons);\n this.buildPickers(toolbar.container.querySelectorAll('select'), icons);\n // @ts-expect-error\n this.tooltip = new SnowTooltip(this.quill, this.options.bounds);\n if (toolbar.container.querySelector('.ql-link')) {\n this.quill.keyboard.addBinding(\n { key: 'k', shortKey: true },\n (_range: Range, context: Context) => {\n toolbar.handlers.link.call(toolbar, !context.format.link);\n },\n );\n }\n }\n }\n}\nSnowTheme.DEFAULTS = merge({}, BaseTheme.DEFAULTS, {\n modules: {\n toolbar: {\n handlers: {\n link(value: string) {\n if (value) {\n const range = this.quill.getSelection();\n if (range == null || range.length === 0) return;\n let preview = this.quill.getText(range);\n if (\n /^\\S+@\\S+\\.\\S+$/.test(preview) &&\n preview.indexOf('mailto:') !== 0\n ) {\n preview = `mailto:${preview}`;\n }\n // @ts-expect-error\n const { tooltip } = this.quill.theme;\n tooltip.edit('link', preview);\n } else {\n this.quill.format('link', false, Quill.sources.USER);\n }\n },\n },\n },\n },\n} satisfies ThemeOptions);\n\nexport default SnowTheme;\n","import Quill from './core.js';\nimport type {\n Bounds,\n DebugLevel,\n EmitterSource,\n ExpandedQuillOptions,\n QuillOptions,\n} from './core.js';\n\nimport { AlignClass, AlignStyle } from './formats/align.js';\nimport {\n DirectionAttribute,\n DirectionClass,\n DirectionStyle,\n} from './formats/direction.js';\nimport Indent from './formats/indent.js';\n\nimport Blockquote from './formats/blockquote.js';\nimport Header from './formats/header.js';\nimport List from './formats/list.js';\n\nimport { BackgroundClass, BackgroundStyle } from './formats/background.js';\nimport { ColorClass, ColorStyle } from './formats/color.js';\nimport { FontClass, FontStyle } from './formats/font.js';\nimport { SizeClass, SizeStyle } from './formats/size.js';\n\nimport Bold from './formats/bold.js';\nimport Italic from './formats/italic.js';\nimport Link from './formats/link.js';\nimport Script from './formats/script.js';\nimport Strike from './formats/strike.js';\nimport Underline from './formats/underline.js';\n\nimport Formula from './formats/formula.js';\nimport Image from './formats/image.js';\nimport Video from './formats/video.js';\n\nimport CodeBlock, { Code as InlineCode } from './formats/code.js';\n\nimport Syntax from './modules/syntax.js';\nimport Table from './modules/table.js';\nimport Toolbar from './modules/toolbar.js';\n\nimport Icons from './ui/icons.js';\nimport Picker from './ui/picker.js';\nimport ColorPicker from './ui/color-picker.js';\nimport IconPicker from './ui/icon-picker.js';\nimport Tooltip from './ui/tooltip.js';\n\nimport BubbleTheme from './themes/bubble.js';\nimport SnowTheme from './themes/snow.js';\n\nQuill.register(\n {\n 'attributors/attribute/direction': DirectionAttribute,\n\n 'attributors/class/align': AlignClass,\n 'attributors/class/background': BackgroundClass,\n 'attributors/class/color': ColorClass,\n 'attributors/class/direction': DirectionClass,\n 'attributors/class/font': FontClass,\n 'attributors/class/size': SizeClass,\n\n 'attributors/style/align': AlignStyle,\n 'attributors/style/background': BackgroundStyle,\n 'attributors/style/color': ColorStyle,\n 'attributors/style/direction': DirectionStyle,\n 'attributors/style/font': FontStyle,\n 'attributors/style/size': SizeStyle,\n },\n true,\n);\n\nQuill.register(\n {\n 'formats/align': AlignClass,\n 'formats/direction': DirectionClass,\n 'formats/indent': Indent,\n\n 'formats/background': BackgroundStyle,\n 'formats/color': ColorStyle,\n 'formats/font': FontClass,\n 'formats/size': SizeClass,\n\n 'formats/blockquote': Blockquote,\n 'formats/code-block': CodeBlock,\n 'formats/header': Header,\n 'formats/list': List,\n\n 'formats/bold': Bold,\n 'formats/code': InlineCode,\n 'formats/italic': Italic,\n 'formats/link': Link,\n 'formats/script': Script,\n 'formats/strike': Strike,\n 'formats/underline': Underline,\n\n 'formats/formula': Formula,\n 'formats/image': Image,\n 'formats/video': Video,\n\n 'modules/syntax': Syntax,\n 'modules/table': Table,\n 'modules/toolbar': Toolbar,\n\n 'themes/bubble': BubbleTheme,\n 'themes/snow': SnowTheme,\n\n 'ui/icons': Icons,\n 'ui/picker': Picker,\n 'ui/icon-picker': IconPicker,\n 'ui/color-picker': ColorPicker,\n 'ui/tooltip': Tooltip,\n },\n true,\n);\n\nexport {\n AttributeMap,\n Delta,\n Module,\n Op,\n OpIterator,\n Parchment,\n Range,\n} from './core.js';\nexport type {\n Bounds,\n DebugLevel,\n EmitterSource,\n ExpandedQuillOptions,\n QuillOptions,\n};\n\nexport default Quill;\n","import Bold from './bold.js';\n\nclass Italic extends Bold {\n static blotName = 'italic';\n static tagName = ['EM', 'I'];\n}\n\nexport default Italic;\n","import Bold from './bold.js';\n\nclass Strike extends Bold {\n static blotName = 'strike';\n static tagName = ['S', 'STRIKE'];\n}\n\nexport default Strike;\n"],"names":["root","factory","exports","module","define","amd","self","Block","BlockBlot","cache","delta","this","blockDelta","deleteAt","index","length","super","formatAt","name","value","scroll","query","Scope","BLOCK","format","Math","min","insertAt","def","lines","split","text","shift","children","tail","block","reduce","lineIndex","line","insertBefore","blot","ref","head","Break","remove","moveChildren","target","optimize","context","path","removeChild","child","force","arguments","undefined","clone","parent","next","blotName","tagName","defaultChild","allowedChildren","Inline","EmbedBlot","TextBlot","BlockEmbed","attach","attributes","AttributorStore","domNode","Delta","insert","formats","values","attribute","BLOCK_ATTRIBUTE","pop","blocks","map","create","forEach","filter","descendants","LeafBlot","leaf","bubbleFormats","statics","scope","BLOCK_BLOT","prev","Container","ContainerBlot","Cursor","static","constructor","selection","textNode","document","createTextNode","CONTENTS","appendChild","savedLength","detach","offset","node","position","data","restore","composing","range","getNativeRange","lastChild","parentNode","prevTextBlot","prevTextLength","nextTextBlot","nextText","newText","join","mergedTextBlot","newTextNode","remapOffset","start","end","startNode","startOffset","endNode","endOffset","update","mutations","some","mutation","type","isolate","unwrap","GUARD_TEXT","Embed","contentNode","createElement","setAttribute","Array","from","childNodes","childNode","leftGuard","rightGuard","prevLength","InlineBlot","Text","compare","other","selfIndex","order","indexOf","otherIndex","BLOT","wrap","entityMap","escapeText","replace","s","isLine","isUpdatable","updateContent","Scroll","ScrollBlot","registry","_ref","emitter","batch","enable","addEventListener","e","handleDragStart","batchStart","isArray","batchEnd","emitMount","emit","Emitter","events","SCROLL_BLOT_MOUNT","emitUnmount","SCROLL_BLOT_UNMOUNT","emitEmbedUpdate","change","SCROLL_EMBED_UPDATE","first","last","enabled","endsWith","slice","embed","INLINE_BLOT","wrapper","insertContents","renderBlocks","deltaToRenderBlocks","concat","shouldInsertNewlineChar","descendant","key","insertInlineContents","newlineCharLength","lineEndIndex","AttributeMap","diff","Object","keys","refBlot","refBlotOffset","find","renderBlock","createBlock","blockEmbed","isEnabled","getAttribute","Number","MAX_VALUE","getLines","blotIndex","blotLength","lengthLeft","forEachAt","childIndex","childLength","push","SCROLL_OPTIMIZE","source","sources","USER","observer","takeRecords","_ref2","SCROLL_BEFORE_UPDATE","SCROLL_UPDATE","updateEmbedAt","b","event","preventDefault","currentBlockDelta","op","splitted","INLINE","entries","_ref3","_ref4","inlineContents","Op","History","Module","delay","maxStack","userOnly","lastRecorded","ignoreChange","stack","undo","redo","currentRange","quill","options","on","Quill","EDITOR_CHANGE","eventName","oldValue","SELECTION_CHANGE","SILENT","TEXT_CHANGE","transform","record","transformRange","keyboard","addBinding","shortKey","bind","shiftKey","test","navigator","platform","inputType","dest","item","base","getContents","inverseDelta","invert","updateContents","restoreSelection","clear","cutoff","changeDelta","oldDelta","ops","undoDelta","undoRange","timestamp","Date","now","compose","transformStack","stackItem","setSelection","deleteLength","delete","changeIndex","lastOp","attr","endsWithNewlineChange","getLastChangeIndex","remoteDelta","i","oldItem","splice","transformPosition","Uploader","native","caretRangeFromPoint","clientX","clientY","caretPositionFromPoint","createRange","setStart","offsetNode","setEnd","normalized","normalizeNative","normalizedToRange","dataTransfer","files","upload","uploads","file","mimetypes","includes","handler","call","DEFAULTS","promises","Promise","resolve","reader","FileReader","onload","result","readAsDataURL","all","then","images","image","retain","INSERT_TYPES","Input","handleBeforeInput","userAgent","COMPOSITION_BEFORE_START","handleCompositionStart","deleteRange","replaceText","getFormat","composition","isComposing","defaultPrevented","staticRange","getTargetRanges","collapsed","types","getData","getPlainTextFromInputEvent","getSelection","isMac","UINode","isListening","selectionChangeDeadline","handleArrowKeys","handleNavigationShortcuts","ParentBlot","uiNode","isRTL","getComputedStyle","ctrlKey","canMoveCaretBeforeUINode","ensureListeningToSelectionChange","listener","handleSelectionChange","once","getRangeAt","startContainer","newRange","setStartAfter","setEndAfter","removeAllRanges","addRange","register","Clipboard","Keyboard","debug","logger","_len","args","_key","querySelectorAll","instances","get","handleDOM","EventEmitter","COMPOSITION_START","COMPOSITION_BEFORE_END","COMPOSITION_END","API","domListeners","error","_len2","_key2","log","_len3","_key3","contains","listenDOM","WeakMap","levels","level","method","console","namespace","ns","newLevel","ASCII","convertListHTML","items","lastIndent","endTag","getListType","indent","rest","tag","convertHTML","previousType","isRoot","html","replaceAll","list","parts","outerHTML","innerHTML","Element","combineFormats","combined","merged","combinedValue","normalizeDelta","normalizedDelta","shiftRange","amount","Range","getDelta","applyDelta","scrollLength","deleteDelta","splitOpLines","isImplicitNewlinePrepended","isImplicitNewlineAppended","merge","isInlineEmbed","prependedLength","addedLength","deleteText","formatLine","max","cloneDeep","formatText","leaves","lineFormats","leafFormats","blots","getHTML","lineOffset","lineLength","getText","contents","insertEmbed","insertText","isBlank","removeFormat","suffixLength","suffix","selectionInfo","match","textBlot","CursorBlot","oldText","relativeSelectionInfo","oldRange","isEqual","setupListeners","queueMicrotask","handleCompositionEnd","Node","getElementRect","element","rect","getBoundingClientRect","scaleX","abs","width","offsetWidth","scaleY","height","offsetHeight","top","right","left","clientWidth","bottom","clientHeight","paddingValueToInt","number","parseInt","isNaN","getScrollDistance","targetStart","targetEnd","scrollStart","scrollEnd","scrollPaddingStart","scrollPaddingEnd","CORE_FORMATS","globalRegistry","Parchment","uiClass","bounds","modules","clipboard","history","uploader","placeholder","readOnly","theme","parchment","Theme","limit","bubble","import","imports","overwrite","attrName","warn","startsWith","container","containerOrSelector","resolveSelector","Error","quillModuleDefaults","quillDefaults","themeModuleDefaults","themeDefaults","userModuleOptions","expandModuleConfig","toolbar","config","omitUndefinedValuesFromOptions","createRegistryWithFormats","sourceRegistry","Registry","coreBlot","iterations","requiredContainer","modulesWithDefaults","moduleClass","expandConfig","trim","classList","add","set","addContainer","scrollBlotName","editor","Editor","Selection","Composition","addModule","init","toggle","lastRange","getRange","modify","convert","setContents","disable","allowReadOnlyEdits","refNode","className","blur","setRange","overload","editReadOnly","modifier","focus","preventScroll","scrollSelectionIntoView","getBounds","containerBounds","getLength","getIndex","getLeaf","getLine","getModule","getSemanticHTML","hasFocus","off","scrollRectIntoView","targetRect","ownerDocument","current","isDocumentBody","body","bounding","window","visualViewport","documentElement","style","scrollDistanceX","scrollPaddingLeft","scrollPaddingRight","scrollDistanceY","scrollPaddingTop","scrollPaddingBottom","defaultView","scrollBy","scrollLeft","scrollTop","scrolledLeft","scrolledTop","parentElement","getRootNode","host","scrollIntoView","delete1","applied","delete2","setText","selector","querySelector","expanded","obj","fromEntries","entry","lengthOrSource","pos","mouseDown","cursor","savedRange","lastNative","handleComposition","handleDragging","setTimeout","setNativeRange","triggeredByTyping","ignored","nativeRange","after","nextLine","side","rangeCount","info","isConnected","activeElement","positions","indexes","endContainer","rangeToNative","getPosition","inclusive","leafOffset","default","ModuleClass","whitelist","AlignAttribute","Attributor","AlignClass","ClassAttributor","AlignStyle","StyleAttributor","BackgroundClass","BackgroundStyle","ColorAttributor","CodeBlockContainer","code","innerText","CodeBlock","Code","component","toString","ColorClass","ColorStyle","DirectionAttribute","DirectionClass","DirectionStyle","FontClass","FontStyleAttributor","FontStyle","SizeClass","SizeStyle","normalWeightRegexp","blockTagNames","isBlockElement","ignoreRegexp","idRegexp","indentRegexp","NORMALIZERS","doc","msoList","others","listItems","parseListItem","idMatch","id","indentMatch","typeRegexp","RegExp","typeMatch","parsed","childListItems","nextElementSibling","ul","listItem","li","replaceChild","normalizeListItem","fragment","createDocumentFragment","append","normalizeFontWeight","br","previousElementSibling","normalizeEmptyLines","CLIPBOARD_CONFIG","TEXT_NODE","isPre","isBetweenInlineElements","previousSibling","nextSibling","matchNewline","deltaEndsWith","ELEMENT_NODE","prototype","applyFormat","classes","styles","ATTRIBUTE","ATTRIBUTE_ATTRIBUTORS","keyName","STYLE_ATTRIBUTORS","newDelta","fontStyle","italic","textDecoration","underline","strike","fontWeight","bold","_ref5","parseFloat","textIndent","composed","checkedAttr","table","createMatchAlias","memo","matchers","onCaptureCopy","onCapturePaste","matcher","addMatcher","normalizeHTML","normalize","normalizeExternalHTML","DOMParser","parseFromString","nodeMatches","elementMatchers","textMatchers","prepareMatching","traverse","dangerouslyPasteHTML","paste","isCut","onCopy","clipboardData","setData","normalizeURIList","urlList","url","childElementCount","firstElementChild","onPaste","pastedDelta","pair","has","matches","endText","toLowerCase","preNodes","nodeType","childrenDelta","reducedDelta","_node","HTMLParagraphElement","firstChild","SHORTKEY","evt","binding","which","bindings","handleEnter","metaKey","altKey","handleBackspace","handleDelete","prefix","handleDeleteRange","listen","keyBinding","singleBinding","keyCode","leafStart","offsetStart","leafEnd","offsetEnd","prefixText","suffixText","curContext","empty","every","curFormats","prevFormats","formatDelta","nextFormats","defaultOptions","makeFormatHandler","outdent","makeCodeBlockHandler","tab","header","row","cell","getTable","_table","tableSide","blockquote","numLines","cur","makeEmbedArrowHandler","makeTableArrowHandler","TAB","textContent","up","targetRow","targetCell","targetLine","firstFormats","lastFormats","hasOwnProperty","Events","EE","fn","addListener","TypeError","_events","_eventsCount","clearEvent","__proto__","eventNames","names","getOwnPropertySymbols","listeners","handlers","l","ee","listenerCount","a1","a2","a3","a4","a5","len","removeListener","apply","j","removeAllListeners","prefixed","DIFF_DELETE","DIFF_INSERT","DIFF_EQUAL","diff_main","text1","text2","cursor_pos","cleanup","_fix_unicode","editdiff","oldLength","newLength","oldCursor","oldBefore","oldAfter","maybeNewCursor","newCursor","newBefore","newAfter","prefixLength","oldPrefix","newPrefix","make_edit_splice","oldSuffix","newSuffix","find_cursor_edit_diff","commonlength","diff_commonPrefix","commonprefix","substring","diff_commonSuffix","commonsuffix","diffs","longtext","shorttext","hm","diff_halfMatchI_","best_longtext_a","best_longtext_b","best_shorttext_a","best_shorttext_b","seed","floor","best_common","text1_a","text1_b","text2_a","text2_b","hm1","ceil","hm2","diff_halfMatch_","mid_common","diffs_a","diffs_b","text1_length","text2_length","max_d","v_offset","v_length","v1","v2","x","front","k1start","k1end","k2start","k2end","d","k1","k1_offset","y1","x1","charAt","k2_offset","x2","diff_bisectSplit_","k2","y2","diff_bisect_","diff_compute_","unshift","diff_cleanupMerge","changes","equalities","equalitiesLength","lastequality","pointer","length_insertions1","length_deletions1","length_insertions2","length_deletions2","diff_cleanupSemanticScore_","one","two","char1","char2","nonAlphaNumeric1","nonAlphaNumericRegex_","nonAlphaNumeric2","whitespace1","whitespaceRegex_","whitespace2","lineBreak1","linebreakRegex_","lineBreak2","blankLine1","blanklineEndRegex_","blankLine2","blanklineStartRegex_","equality1","edit","equality2","commonOffset","commonString","bestEquality1","bestEdit","bestEquality2","bestScore","score","diff_cleanupSemanticLossless","deletion","insertion","overlap_length1","diff_commonOverlap_","overlap_length2","diff_cleanupSemantic","y","text1a","text2a","text1b","text2b","diffsb","pointermin","pointermax","pointermid","pointerstart","is_surrogate_pair_start","charCodeAt","text_length","best","pattern","found","pointerend","is_surrogate_pair_end","fix_unicode","count_delete","count_insert","text_delete","text_insert","previous_equality","ends_with_pair_start","stray","k","starts_with_pair_end","n","charCode","str","before","oldMiddle","newMiddle","tuples","ret","remove_empty_tuples","INSERT","DELETE","EQUAL","HASH_UNDEFINED","MAX_SAFE_INTEGER","argsTag","boolTag","dateTag","funcTag","genTag","mapTag","numberTag","objectTag","promiseTag","regexpTag","setTag","stringTag","symbolTag","weakMapTag","arrayBufferTag","dataViewTag","float32Tag","float64Tag","int8Tag","int16Tag","int32Tag","uint8Tag","uint8ClampedTag","uint16Tag","uint32Tag","reFlags","reIsHostCtor","reIsUint","cloneableTags","freeGlobal","g","freeSelf","Function","freeExports","freeModule","moduleExports","addMapEntry","addSetEntry","arrayReduce","array","iteratee","accumulator","initAccum","isHostObject","mapToArray","size","overArg","func","arg","setToArray","uid","arrayProto","funcProto","objectProto","coreJsData","maskSrcKey","exec","IE_PROTO","funcToString","objectToString","reIsNative","Buffer","Symbol","Uint8Array","getPrototype","getPrototypeOf","objectCreate","propertyIsEnumerable","nativeGetSymbols","nativeIsBuffer","isBuffer","nativeKeys","DataView","getNative","Map","Set","nativeCreate","dataViewCtorString","toSource","mapCtorString","promiseCtorString","setCtorString","weakMapCtorString","symbolProto","symbolValueOf","valueOf","Hash","ListCache","MapCache","Stack","__data__","assignValue","object","objValue","eq","assocIndexOf","baseClone","isDeep","isFull","customizer","isObject","isArr","input","initCloneArray","copyArray","getTag","isFunc","buffer","copy","cloneBuffer","isPrototype","proto","initCloneObject","copyObject","getSymbols","copySymbols","baseAssign","cloneFunc","symbol","Ctor","cloneArrayBuffer","dataView","byteOffset","byteLength","cloneDataView","typedArray","cloneTypedArray","cloneMap","regexp","lastIndex","cloneRegExp","cloneSet","initCloneByTag","stacked","props","keysFunc","symbolsFunc","arrayPush","baseGetAllKeys","getAllKeys","arrayEach","subValue","arrayBuffer","newValue","getMapData","getValue","isFunction","baseIsNative","pairs","LARGE_ARRAY_SIZE","isIndex","ArrayBuffer","ctorString","isArrayLike","isLength","inherited","isObjectLike","isArrayLikeObject","isArguments","baseTimes","String","skipIndexes","arrayLikeKeys","baseKeys","COMPARE_PARTIAL_FLAG","COMPARE_UNORDERED_FLAG","arrayTag","asyncTag","errorTag","nullTag","proxyTag","undefinedTag","typedArrayTags","freeProcess","process","nodeUtil","nodeIsTypedArray","isTypedArray","arraySome","predicate","nativeObjectToString","symToStringTag","toStringTag","SetCache","baseGetTag","isOwn","unmasked","getRawTag","baseIsArguments","baseIsEqual","bitmask","equalFunc","objIsArr","othIsArr","objTag","othTag","objIsObj","othIsObj","isSameTag","equalArrays","message","isPartial","equalByTag","objIsWrapped","othIsWrapped","objUnwrapped","othUnwrapped","objProps","objLength","skipCtor","othValue","compared","objCtor","othCtor","equalObjects","baseIsEqualDeep","arrLength","othLength","seen","arrValue","othIndex","isMasked","resIndex","arrayFilter","baseUnary","isArg","isBuff","isType","a","keepNull","attrs","baseInverted","priority","OpIterator","NULL_CHARACTER","fromCharCode","getEmbedTypeAndData","embedType","registerEmbed","unregisterEmbed","getHandler","newOp","chop","partition","passed","failed","initialValue","changeLength","elem","Infinity","iter","hasNext","nextOp","thisIter","otherIter","firstOther","peek","firstLeft","peekType","peekLength","thisOp","otherOp","action","thisData","otherData","strings","retDelta","diffResult","opLength","eachLine","newline","inverted","baseIndex","baseOp","opData","baseOpData","transformedData","nextType","retOp","substr","allocUnsafe","isNew","defineProperty","global","stubArray","require","keysIn","nodeIsMap","isMap","nodeIsSet","isSet","isFlat","arrStacked","othStacked","objStacked","isProto","count","lastCalled","assigner","iterable","objectCtorString","srcIndex","mergeFunc","srcValue","isCommon","isTyped","baseMerge","nativeMax","string","nativeNow","stamp","remaining","otherArgs","thisArg","guard","TYPE","LEVEL","INLINE_ATTRIBUTE","ANY","attributeBit","canAdd","removeAttribute","ParchmentError","tags","blotClass","inline","definitions","definition","isBlot","isAttr","toUpperCase","camelize","part","build","move","rawValue","cloneNode","_context","replaceWith","replacement","_force","_mutations","ShadowBlot","_domNode","compareDocumentPosition","DOCUMENT_POSITION_CONTAINED_BY","_inclusive","LinkedList","nodes","at","iterator","curNode","callback","curIndex","curLength","makeAttachedBlot","attachUI","reverse","err","criteria","enforceAllowedChildren","done","splitAfter","childBlot","refDomNode","targetParent","_length","addedNodes","removedNodes","sort","DOCUMENT_POSITION_FOLLOWING","obj1","obj2","prop","checkMerge","_scroll","OBSERVER_CONFIG","characterData","characterDataOldValue","childList","subtree","MutationObserver","observe","disconnect","mutationsMap","records","mark","markParent","grandChild","splitText","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","loaded","__webpack_modules__","getter","__esModule","o","enumerable","globalThis","r","nmd","paths","IndentAttributor","normalizedValue","Blockquote","Header","ListContainer","ListItem","ui","listEventHandler","Bold","Link","sanitize","PROTOCOL_WHITELIST","SANITIZED_URL","protocols","anchor","href","protocol","Script","Underline","Formula","katex","render","throwOnError","errorColor","formula","ATTRIBUTES","Image","hasAttribute","Video","video","TokenAttributor","CodeToken","SyntaxCodeBlock","SyntaxCodeBlockContainer","forceNext","highlight","forced","language","cachedText","codeBlock","BreakBlot","Syntax","hljs","languages","highlightBlot","initListener","initTimer","select","label","option","timer","clearTimeout","interval","lib","versionString","majorVersion","nodeText","TableCell","tableId","cellOffset","rowOffset","TableRow","thisHead","thisTail","nextHead","nextTail","childFormats","TableBody","TableContainer","balanceCells","rows","maxColumns","fill","cells","column","deleteColumn","insertColumn","insertRow","random","Table","listenBalanceCells","balanceTables","deleteRow","deleteTable","insertColumnLeft","insertColumnRight","insertRowAbove","insertRowBelow","insertTable","columns","old","Toolbar","groups","controls","group","control","addButton","addSelect","addControls","HTMLElement","addHandler","selectedIndex","selected","prompt","isActive","clean","direction","align","link","center","justify","background","codeIcon","color","rtl","bullet","check","ordered","script","sub","optionsCounter","toggleAriaAttribute","buildPicker","display","togglePicker","escape","buildItem","tabIndex","selectItem","buildLabel","buildOptions","close","trigger","dispatchEvent","Event","Picker","backgroundColor","colorLabel","stroke","icons","defaultItem","boundsContainer","TEMPLATE","el","overflowY","isScrollable","marginTop","hide","reference","rootBounds","verticalShift","show","ALIGNS","COLORS","FONTS","HEADERS","SIZES","BaseTheme","tooltip","textbox","pickers","picker","removeEventListener","extendToolbar","buildButtons","buttons","button","buildPickers","selects","fillSelect","IconPicker","ColorPicker","fileInput","click","BaseTooltip","Tooltip","save","cancel","restoreFocus","mode","preview","linkRange","extractVideoUrl","defaultValue","TOOLBAR_CONFIG","BubbleTooltip","lastLine","indexBounds","arrow","marginLeft","BubbleTheme","SnowTooltip","LinkBlot","SnowTheme","_range","Indent","List","InlineCode","Icons"],"sourceRoot":""} \ No newline at end of file diff --git a/public/assets/quill/dist/quill.snow.css b/public/assets/quill/dist/quill.snow.css new file mode 100644 index 0000000..c95a80e --- /dev/null +++ b/public/assets/quill/dist/quill.snow.css @@ -0,0 +1,10 @@ +/*! + * Quill Editor v2.0.3 + * https://quilljs.com + * Copyright (c) 2017-2024, Slab + * Copyright (c) 2014, Jason Chen + * Copyright (c) 2013, salesforce.com + */ +.ql-container{box-sizing:border-box;font-family:Helvetica,Arial,sans-serif;font-size:13px;height:100%;margin:0;position:relative}.ql-container.ql-disabled .ql-tooltip{visibility:hidden}.ql-container:not(.ql-disabled) li[data-list=checked] > .ql-ui,.ql-container:not(.ql-disabled) li[data-list=unchecked] > .ql-ui{cursor:pointer}.ql-clipboard{left:-100000px;height:1px;overflow-y:hidden;position:absolute;top:50%}.ql-clipboard p{margin:0;padding:0}.ql-editor{box-sizing:border-box;counter-reset:list-0 list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9;line-height:1.42;height:100%;outline:none;overflow-y:auto;padding:12px 15px;tab-size:4;-moz-tab-size:4;text-align:left;white-space:pre-wrap;word-wrap:break-word}.ql-editor > *{cursor:text}.ql-editor p,.ql-editor ol,.ql-editor pre,.ql-editor blockquote,.ql-editor h1,.ql-editor h2,.ql-editor h3,.ql-editor h4,.ql-editor h5,.ql-editor h6{margin:0;padding:0}@supports (counter-set:none){.ql-editor p,.ql-editor h1,.ql-editor h2,.ql-editor h3,.ql-editor h4,.ql-editor h5,.ql-editor h6{counter-set:list-0 list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9}}@supports not (counter-set:none){.ql-editor p,.ql-editor h1,.ql-editor h2,.ql-editor h3,.ql-editor h4,.ql-editor h5,.ql-editor h6{counter-reset:list-0 list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9}}.ql-editor table{border-collapse:collapse}.ql-editor td{border:1px solid #000;padding:2px 5px}.ql-editor ol{padding-left:1.5em}.ql-editor li{list-style-type:none;padding-left:1.5em;position:relative}.ql-editor li > .ql-ui:before{display:inline-block;margin-left:-1.5em;margin-right:.3em;text-align:right;white-space:nowrap;width:1.2em}.ql-editor li[data-list=checked] > .ql-ui,.ql-editor li[data-list=unchecked] > .ql-ui{color:#777}.ql-editor li[data-list=bullet] > .ql-ui:before{content:'\2022'}.ql-editor li[data-list=checked] > .ql-ui:before{content:'\2611'}.ql-editor li[data-list=unchecked] > .ql-ui:before{content:'\2610'}@supports (counter-set:none){.ql-editor li[data-list]{counter-set:list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9}}@supports not (counter-set:none){.ql-editor li[data-list]{counter-reset:list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9}}.ql-editor li[data-list=ordered]{counter-increment:list-0}.ql-editor li[data-list=ordered] > .ql-ui:before{content:counter(list-0, decimal) '. '}.ql-editor li[data-list=ordered].ql-indent-1{counter-increment:list-1}.ql-editor li[data-list=ordered].ql-indent-1 > .ql-ui:before{content:counter(list-1, lower-alpha) '. '}@supports (counter-set:none){.ql-editor li[data-list].ql-indent-1{counter-set:list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9}}@supports not (counter-set:none){.ql-editor li[data-list].ql-indent-1{counter-reset:list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9}}.ql-editor li[data-list=ordered].ql-indent-2{counter-increment:list-2}.ql-editor li[data-list=ordered].ql-indent-2 > .ql-ui:before{content:counter(list-2, lower-roman) '. '}@supports (counter-set:none){.ql-editor li[data-list].ql-indent-2{counter-set:list-3 list-4 list-5 list-6 list-7 list-8 list-9}}@supports not (counter-set:none){.ql-editor li[data-list].ql-indent-2{counter-reset:list-3 list-4 list-5 list-6 list-7 list-8 list-9}}.ql-editor li[data-list=ordered].ql-indent-3{counter-increment:list-3}.ql-editor li[data-list=ordered].ql-indent-3 > .ql-ui:before{content:counter(list-3, decimal) '. '}@supports (counter-set:none){.ql-editor li[data-list].ql-indent-3{counter-set:list-4 list-5 list-6 list-7 list-8 list-9}}@supports not (counter-set:none){.ql-editor li[data-list].ql-indent-3{counter-reset:list-4 list-5 list-6 list-7 list-8 list-9}}.ql-editor li[data-list=ordered].ql-indent-4{counter-increment:list-4}.ql-editor li[data-list=ordered].ql-indent-4 > .ql-ui:before{content:counter(list-4, lower-alpha) '. '}@supports (counter-set:none){.ql-editor li[data-list].ql-indent-4{counter-set:list-5 list-6 list-7 list-8 list-9}}@supports not (counter-set:none){.ql-editor li[data-list].ql-indent-4{counter-reset:list-5 list-6 list-7 list-8 list-9}}.ql-editor li[data-list=ordered].ql-indent-5{counter-increment:list-5}.ql-editor li[data-list=ordered].ql-indent-5 > .ql-ui:before{content:counter(list-5, lower-roman) '. '}@supports (counter-set:none){.ql-editor li[data-list].ql-indent-5{counter-set:list-6 list-7 list-8 list-9}}@supports not (counter-set:none){.ql-editor li[data-list].ql-indent-5{counter-reset:list-6 list-7 list-8 list-9}}.ql-editor li[data-list=ordered].ql-indent-6{counter-increment:list-6}.ql-editor li[data-list=ordered].ql-indent-6 > .ql-ui:before{content:counter(list-6, decimal) '. '}@supports (counter-set:none){.ql-editor li[data-list].ql-indent-6{counter-set:list-7 list-8 list-9}}@supports not (counter-set:none){.ql-editor li[data-list].ql-indent-6{counter-reset:list-7 list-8 list-9}}.ql-editor li[data-list=ordered].ql-indent-7{counter-increment:list-7}.ql-editor li[data-list=ordered].ql-indent-7 > .ql-ui:before{content:counter(list-7, lower-alpha) '. '}@supports (counter-set:none){.ql-editor li[data-list].ql-indent-7{counter-set:list-8 list-9}}@supports not (counter-set:none){.ql-editor li[data-list].ql-indent-7{counter-reset:list-8 list-9}}.ql-editor li[data-list=ordered].ql-indent-8{counter-increment:list-8}.ql-editor li[data-list=ordered].ql-indent-8 > .ql-ui:before{content:counter(list-8, lower-roman) '. '}@supports (counter-set:none){.ql-editor li[data-list].ql-indent-8{counter-set:list-9}}@supports not (counter-set:none){.ql-editor li[data-list].ql-indent-8{counter-reset:list-9}}.ql-editor li[data-list=ordered].ql-indent-9{counter-increment:list-9}.ql-editor li[data-list=ordered].ql-indent-9 > .ql-ui:before{content:counter(list-9, decimal) '. '}.ql-editor .ql-indent-1:not(.ql-direction-rtl){padding-left:3em}.ql-editor li.ql-indent-1:not(.ql-direction-rtl){padding-left:4.5em}.ql-editor .ql-indent-1.ql-direction-rtl.ql-align-right{padding-right:3em}.ql-editor li.ql-indent-1.ql-direction-rtl.ql-align-right{padding-right:4.5em}.ql-editor .ql-indent-2:not(.ql-direction-rtl){padding-left:6em}.ql-editor li.ql-indent-2:not(.ql-direction-rtl){padding-left:7.5em}.ql-editor .ql-indent-2.ql-direction-rtl.ql-align-right{padding-right:6em}.ql-editor li.ql-indent-2.ql-direction-rtl.ql-align-right{padding-right:7.5em}.ql-editor .ql-indent-3:not(.ql-direction-rtl){padding-left:9em}.ql-editor li.ql-indent-3:not(.ql-direction-rtl){padding-left:10.5em}.ql-editor .ql-indent-3.ql-direction-rtl.ql-align-right{padding-right:9em}.ql-editor li.ql-indent-3.ql-direction-rtl.ql-align-right{padding-right:10.5em}.ql-editor .ql-indent-4:not(.ql-direction-rtl){padding-left:12em}.ql-editor li.ql-indent-4:not(.ql-direction-rtl){padding-left:13.5em}.ql-editor .ql-indent-4.ql-direction-rtl.ql-align-right{padding-right:12em}.ql-editor li.ql-indent-4.ql-direction-rtl.ql-align-right{padding-right:13.5em}.ql-editor .ql-indent-5:not(.ql-direction-rtl){padding-left:15em}.ql-editor li.ql-indent-5:not(.ql-direction-rtl){padding-left:16.5em}.ql-editor .ql-indent-5.ql-direction-rtl.ql-align-right{padding-right:15em}.ql-editor li.ql-indent-5.ql-direction-rtl.ql-align-right{padding-right:16.5em}.ql-editor .ql-indent-6:not(.ql-direction-rtl){padding-left:18em}.ql-editor li.ql-indent-6:not(.ql-direction-rtl){padding-left:19.5em}.ql-editor .ql-indent-6.ql-direction-rtl.ql-align-right{padding-right:18em}.ql-editor li.ql-indent-6.ql-direction-rtl.ql-align-right{padding-right:19.5em}.ql-editor .ql-indent-7:not(.ql-direction-rtl){padding-left:21em}.ql-editor li.ql-indent-7:not(.ql-direction-rtl){padding-left:22.5em}.ql-editor .ql-indent-7.ql-direction-rtl.ql-align-right{padding-right:21em}.ql-editor li.ql-indent-7.ql-direction-rtl.ql-align-right{padding-right:22.5em}.ql-editor .ql-indent-8:not(.ql-direction-rtl){padding-left:24em}.ql-editor li.ql-indent-8:not(.ql-direction-rtl){padding-left:25.5em}.ql-editor .ql-indent-8.ql-direction-rtl.ql-align-right{padding-right:24em}.ql-editor li.ql-indent-8.ql-direction-rtl.ql-align-right{padding-right:25.5em}.ql-editor .ql-indent-9:not(.ql-direction-rtl){padding-left:27em}.ql-editor li.ql-indent-9:not(.ql-direction-rtl){padding-left:28.5em}.ql-editor .ql-indent-9.ql-direction-rtl.ql-align-right{padding-right:27em}.ql-editor li.ql-indent-9.ql-direction-rtl.ql-align-right{padding-right:28.5em}.ql-editor li.ql-direction-rtl{padding-right:1.5em}.ql-editor li.ql-direction-rtl > .ql-ui:before{margin-left:.3em;margin-right:-1.5em;text-align:left}.ql-editor table{table-layout:fixed;width:100%}.ql-editor table td{outline:none}.ql-editor .ql-code-block-container{font-family:monospace}.ql-editor .ql-video{display:block;max-width:100%}.ql-editor .ql-video.ql-align-center{margin:0 auto}.ql-editor .ql-video.ql-align-right{margin:0 0 0 auto}.ql-editor .ql-bg-black{background-color:#000}.ql-editor .ql-bg-red{background-color:#e60000}.ql-editor .ql-bg-orange{background-color:#f90}.ql-editor .ql-bg-yellow{background-color:#ff0}.ql-editor .ql-bg-green{background-color:#008a00}.ql-editor .ql-bg-blue{background-color:#06c}.ql-editor .ql-bg-purple{background-color:#93f}.ql-editor .ql-color-white{color:#fff}.ql-editor .ql-color-red{color:#e60000}.ql-editor .ql-color-orange{color:#f90}.ql-editor .ql-color-yellow{color:#ff0}.ql-editor .ql-color-green{color:#008a00}.ql-editor .ql-color-blue{color:#06c}.ql-editor .ql-color-purple{color:#93f}.ql-editor .ql-font-serif{font-family:Georgia,Times New Roman,serif}.ql-editor .ql-font-monospace{font-family:Monaco,Courier New,monospace}.ql-editor .ql-size-small{font-size:.75em}.ql-editor .ql-size-large{font-size:1.5em}.ql-editor .ql-size-huge{font-size:2.5em}.ql-editor .ql-direction-rtl{direction:rtl;text-align:inherit}.ql-editor .ql-align-center{text-align:center}.ql-editor .ql-align-justify{text-align:justify}.ql-editor .ql-align-right{text-align:right}.ql-editor .ql-ui{position:absolute}.ql-editor.ql-blank::before{color:rgba(0,0,0,0.6);content:attr(data-placeholder);font-style:italic;left:15px;pointer-events:none;position:absolute;right:15px}.ql-snow.ql-toolbar:after,.ql-snow .ql-toolbar:after{clear:both;content:'';display:table}.ql-snow.ql-toolbar button,.ql-snow .ql-toolbar button{background:none;border:none;cursor:pointer;display:inline-block;float:left;height:24px;padding:3px 5px;width:28px}.ql-snow.ql-toolbar button svg,.ql-snow .ql-toolbar button svg{float:left;height:100%}.ql-snow.ql-toolbar button:active:hover,.ql-snow .ql-toolbar button:active:hover{outline:none}.ql-snow.ql-toolbar input.ql-image[type=file],.ql-snow .ql-toolbar input.ql-image[type=file]{display:none}.ql-snow.ql-toolbar button:hover,.ql-snow .ql-toolbar button:hover,.ql-snow.ql-toolbar button:focus,.ql-snow .ql-toolbar button:focus,.ql-snow.ql-toolbar button.ql-active,.ql-snow .ql-toolbar button.ql-active,.ql-snow.ql-toolbar .ql-picker-label:hover,.ql-snow .ql-toolbar .ql-picker-label:hover,.ql-snow.ql-toolbar .ql-picker-label.ql-active,.ql-snow .ql-toolbar .ql-picker-label.ql-active,.ql-snow.ql-toolbar .ql-picker-item:hover,.ql-snow .ql-toolbar .ql-picker-item:hover,.ql-snow.ql-toolbar .ql-picker-item.ql-selected,.ql-snow .ql-toolbar .ql-picker-item.ql-selected{color:#06c}.ql-snow.ql-toolbar button:hover .ql-fill,.ql-snow .ql-toolbar button:hover .ql-fill,.ql-snow.ql-toolbar button:focus .ql-fill,.ql-snow .ql-toolbar button:focus .ql-fill,.ql-snow.ql-toolbar button.ql-active .ql-fill,.ql-snow .ql-toolbar button.ql-active .ql-fill,.ql-snow.ql-toolbar .ql-picker-label:hover .ql-fill,.ql-snow .ql-toolbar .ql-picker-label:hover .ql-fill,.ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-fill,.ql-snow .ql-toolbar .ql-picker-label.ql-active .ql-fill,.ql-snow.ql-toolbar .ql-picker-item:hover .ql-fill,.ql-snow .ql-toolbar .ql-picker-item:hover .ql-fill,.ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-fill,.ql-snow .ql-toolbar .ql-picker-item.ql-selected .ql-fill,.ql-snow.ql-toolbar button:hover .ql-stroke.ql-fill,.ql-snow .ql-toolbar button:hover .ql-stroke.ql-fill,.ql-snow.ql-toolbar button:focus .ql-stroke.ql-fill,.ql-snow .ql-toolbar button:focus .ql-stroke.ql-fill,.ql-snow.ql-toolbar button.ql-active .ql-stroke.ql-fill,.ql-snow .ql-toolbar button.ql-active .ql-stroke.ql-fill,.ql-snow.ql-toolbar .ql-picker-label:hover .ql-stroke.ql-fill,.ql-snow .ql-toolbar .ql-picker-label:hover .ql-stroke.ql-fill,.ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-stroke.ql-fill,.ql-snow .ql-toolbar .ql-picker-label.ql-active .ql-stroke.ql-fill,.ql-snow.ql-toolbar .ql-picker-item:hover .ql-stroke.ql-fill,.ql-snow .ql-toolbar .ql-picker-item:hover .ql-stroke.ql-fill,.ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-stroke.ql-fill,.ql-snow .ql-toolbar .ql-picker-item.ql-selected .ql-stroke.ql-fill{fill:#06c}.ql-snow.ql-toolbar button:hover .ql-stroke,.ql-snow .ql-toolbar button:hover .ql-stroke,.ql-snow.ql-toolbar button:focus .ql-stroke,.ql-snow .ql-toolbar button:focus .ql-stroke,.ql-snow.ql-toolbar button.ql-active .ql-stroke,.ql-snow .ql-toolbar button.ql-active .ql-stroke,.ql-snow.ql-toolbar .ql-picker-label:hover .ql-stroke,.ql-snow .ql-toolbar .ql-picker-label:hover .ql-stroke,.ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-stroke,.ql-snow .ql-toolbar .ql-picker-label.ql-active .ql-stroke,.ql-snow.ql-toolbar .ql-picker-item:hover .ql-stroke,.ql-snow .ql-toolbar .ql-picker-item:hover .ql-stroke,.ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-stroke,.ql-snow .ql-toolbar .ql-picker-item.ql-selected .ql-stroke,.ql-snow.ql-toolbar button:hover .ql-stroke-miter,.ql-snow .ql-toolbar button:hover .ql-stroke-miter,.ql-snow.ql-toolbar button:focus .ql-stroke-miter,.ql-snow .ql-toolbar button:focus .ql-stroke-miter,.ql-snow.ql-toolbar button.ql-active .ql-stroke-miter,.ql-snow .ql-toolbar button.ql-active .ql-stroke-miter,.ql-snow.ql-toolbar .ql-picker-label:hover .ql-stroke-miter,.ql-snow .ql-toolbar .ql-picker-label:hover .ql-stroke-miter,.ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-stroke-miter,.ql-snow .ql-toolbar .ql-picker-label.ql-active .ql-stroke-miter,.ql-snow.ql-toolbar .ql-picker-item:hover .ql-stroke-miter,.ql-snow .ql-toolbar .ql-picker-item:hover .ql-stroke-miter,.ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-stroke-miter,.ql-snow .ql-toolbar .ql-picker-item.ql-selected .ql-stroke-miter{stroke:#06c}@media (pointer:coarse){.ql-snow.ql-toolbar button:hover:not(.ql-active),.ql-snow .ql-toolbar button:hover:not(.ql-active){color:#444}.ql-snow.ql-toolbar button:hover:not(.ql-active) .ql-fill,.ql-snow .ql-toolbar button:hover:not(.ql-active) .ql-fill,.ql-snow.ql-toolbar button:hover:not(.ql-active) .ql-stroke.ql-fill,.ql-snow .ql-toolbar button:hover:not(.ql-active) .ql-stroke.ql-fill{fill:#444}.ql-snow.ql-toolbar button:hover:not(.ql-active) .ql-stroke,.ql-snow .ql-toolbar button:hover:not(.ql-active) .ql-stroke,.ql-snow.ql-toolbar button:hover:not(.ql-active) .ql-stroke-miter,.ql-snow .ql-toolbar button:hover:not(.ql-active) .ql-stroke-miter{stroke:#444}}.ql-snow{box-sizing:border-box}.ql-snow *{box-sizing:border-box}.ql-snow .ql-hidden{display:none}.ql-snow .ql-out-bottom,.ql-snow .ql-out-top{visibility:hidden}.ql-snow .ql-tooltip{position:absolute;transform:translateY(10px)}.ql-snow .ql-tooltip a{cursor:pointer;text-decoration:none}.ql-snow .ql-tooltip.ql-flip{transform:translateY(-10px)}.ql-snow .ql-formats{display:inline-block;vertical-align:middle}.ql-snow .ql-formats:after{clear:both;content:'';display:table}.ql-snow .ql-stroke{fill:none;stroke:#444;stroke-linecap:round;stroke-linejoin:round;stroke-width:2}.ql-snow .ql-stroke-miter{fill:none;stroke:#444;stroke-miterlimit:10;stroke-width:2}.ql-snow .ql-fill,.ql-snow .ql-stroke.ql-fill{fill:#444}.ql-snow .ql-empty{fill:none}.ql-snow .ql-even{fill-rule:evenodd}.ql-snow .ql-thin,.ql-snow .ql-stroke.ql-thin{stroke-width:1}.ql-snow .ql-transparent{opacity:.4}.ql-snow .ql-direction svg:last-child{display:none}.ql-snow .ql-direction.ql-active svg:last-child{display:inline}.ql-snow .ql-direction.ql-active svg:first-child{display:none}.ql-snow .ql-editor h1{font-size:2em}.ql-snow .ql-editor h2{font-size:1.5em}.ql-snow .ql-editor h3{font-size:1.17em}.ql-snow .ql-editor h4{font-size:1em}.ql-snow .ql-editor h5{font-size:.83em}.ql-snow .ql-editor h6{font-size:.67em}.ql-snow .ql-editor a{text-decoration:underline}.ql-snow .ql-editor blockquote{border-left:4px solid #ccc;margin-bottom:5px;margin-top:5px;padding-left:16px}.ql-snow .ql-editor code,.ql-snow .ql-editor .ql-code-block-container{background-color:#f0f0f0;border-radius:3px}.ql-snow .ql-editor .ql-code-block-container{margin-bottom:5px;margin-top:5px;padding:5px 10px}.ql-snow .ql-editor code{font-size:85%;padding:2px 4px}.ql-snow .ql-editor .ql-code-block-container{background-color:#23241f;color:#f8f8f2;overflow:visible}.ql-snow .ql-editor img{max-width:100%}.ql-snow .ql-picker{color:#444;display:inline-block;float:left;font-size:14px;font-weight:500;height:24px;position:relative;vertical-align:middle}.ql-snow .ql-picker-label{cursor:pointer;display:inline-block;height:100%;padding-left:8px;padding-right:2px;position:relative;width:100%}.ql-snow .ql-picker-label::before{display:inline-block;line-height:22px}.ql-snow .ql-picker-options{background-color:#fff;display:none;min-width:100%;padding:4px 8px;position:absolute;white-space:nowrap}.ql-snow .ql-picker-options .ql-picker-item{cursor:pointer;display:block;padding-bottom:5px;padding-top:5px}.ql-snow .ql-picker.ql-expanded .ql-picker-label{color:#ccc;z-index:2}.ql-snow .ql-picker.ql-expanded .ql-picker-label .ql-fill{fill:#ccc}.ql-snow .ql-picker.ql-expanded .ql-picker-label .ql-stroke{stroke:#ccc}.ql-snow .ql-picker.ql-expanded .ql-picker-options{display:block;margin-top:-1px;top:100%;z-index:1}.ql-snow .ql-color-picker,.ql-snow .ql-icon-picker{width:28px}.ql-snow .ql-color-picker .ql-picker-label,.ql-snow .ql-icon-picker .ql-picker-label{padding:2px 4px}.ql-snow .ql-color-picker .ql-picker-label svg,.ql-snow .ql-icon-picker .ql-picker-label svg{right:4px}.ql-snow .ql-icon-picker .ql-picker-options{padding:4px 0}.ql-snow .ql-icon-picker .ql-picker-item{height:24px;width:24px;padding:2px 4px}.ql-snow .ql-color-picker .ql-picker-options{padding:3px 5px;width:152px}.ql-snow .ql-color-picker .ql-picker-item{border:1px solid transparent;float:left;height:16px;margin:2px;padding:0;width:16px}.ql-snow .ql-picker:not(.ql-color-picker):not(.ql-icon-picker) svg{position:absolute;margin-top:-9px;right:0;top:50%;width:18px}.ql-snow .ql-picker.ql-header .ql-picker-label[data-label]:not([data-label=''])::before,.ql-snow .ql-picker.ql-font .ql-picker-label[data-label]:not([data-label=''])::before,.ql-snow .ql-picker.ql-size .ql-picker-label[data-label]:not([data-label=''])::before,.ql-snow .ql-picker.ql-header .ql-picker-item[data-label]:not([data-label=''])::before,.ql-snow .ql-picker.ql-font .ql-picker-item[data-label]:not([data-label=''])::before,.ql-snow .ql-picker.ql-size .ql-picker-item[data-label]:not([data-label=''])::before{content:attr(data-label)}.ql-snow .ql-picker.ql-header{width:98px}.ql-snow .ql-picker.ql-header .ql-picker-label::before,.ql-snow .ql-picker.ql-header .ql-picker-item::before{content:'Normal'}.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="1"]::before,.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="1"]::before{content:'Heading 1'}.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="2"]::before,.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="2"]::before{content:'Heading 2'}.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="3"]::before,.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="3"]::before{content:'Heading 3'}.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="4"]::before,.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="4"]::before{content:'Heading 4'}.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="5"]::before,.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="5"]::before{content:'Heading 5'}.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="6"]::before,.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="6"]::before{content:'Heading 6'}.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="1"]::before{font-size:2em}.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="2"]::before{font-size:1.5em}.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="3"]::before{font-size:1.17em}.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="4"]::before{font-size:1em}.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="5"]::before{font-size:.83em}.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="6"]::before{font-size:.67em}.ql-snow .ql-picker.ql-font{width:108px}.ql-snow .ql-picker.ql-font .ql-picker-label::before,.ql-snow .ql-picker.ql-font .ql-picker-item::before{content:'Sans Serif'}.ql-snow .ql-picker.ql-font .ql-picker-label[data-value=serif]::before,.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=serif]::before{content:'Serif'}.ql-snow .ql-picker.ql-font .ql-picker-label[data-value=monospace]::before,.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=monospace]::before{content:'Monospace'}.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=serif]::before{font-family:Georgia,Times New Roman,serif}.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=monospace]::before{font-family:Monaco,Courier New,monospace}.ql-snow .ql-picker.ql-size{width:98px}.ql-snow .ql-picker.ql-size .ql-picker-label::before,.ql-snow .ql-picker.ql-size .ql-picker-item::before{content:'Normal'}.ql-snow .ql-picker.ql-size .ql-picker-label[data-value=small]::before,.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=small]::before{content:'Small'}.ql-snow .ql-picker.ql-size .ql-picker-label[data-value=large]::before,.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=large]::before{content:'Large'}.ql-snow .ql-picker.ql-size .ql-picker-label[data-value=huge]::before,.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=huge]::before{content:'Huge'}.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=small]::before{font-size:10px}.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=large]::before{font-size:18px}.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=huge]::before{font-size:32px}.ql-snow .ql-color-picker.ql-background .ql-picker-item{background-color:#fff}.ql-snow .ql-color-picker.ql-color .ql-picker-item{background-color:#000}.ql-code-block-container{position:relative}.ql-code-block-container .ql-ui{right:5px;top:5px}.ql-toolbar.ql-snow{border:1px solid #ccc;box-sizing:border-box;font-family:'Helvetica Neue','Helvetica','Arial',sans-serif;padding:8px}.ql-toolbar.ql-snow .ql-formats{margin-right:15px}.ql-toolbar.ql-snow .ql-picker-label{border:1px solid transparent}.ql-toolbar.ql-snow .ql-picker-options{border:1px solid transparent;box-shadow:rgba(0,0,0,0.2) 0 2px 8px}.ql-toolbar.ql-snow .ql-picker.ql-expanded .ql-picker-label{border-color:#ccc}.ql-toolbar.ql-snow .ql-picker.ql-expanded .ql-picker-options{border-color:#ccc}.ql-toolbar.ql-snow .ql-color-picker .ql-picker-item.ql-selected,.ql-toolbar.ql-snow .ql-color-picker .ql-picker-item:hover{border-color:#000}.ql-toolbar.ql-snow + .ql-container.ql-snow{border-top:0}.ql-snow .ql-tooltip{background-color:#fff;border:1px solid #ccc;box-shadow:0 0 5px #ddd;color:#444;padding:5px 12px;white-space:nowrap}.ql-snow .ql-tooltip::before{content:"Visit URL:";line-height:26px;margin-right:8px}.ql-snow .ql-tooltip input[type=text]{display:none;border:1px solid #ccc;font-size:13px;height:26px;margin:0;padding:3px 5px;width:170px}.ql-snow .ql-tooltip a.ql-preview{display:inline-block;max-width:200px;overflow-x:hidden;text-overflow:ellipsis;vertical-align:top}.ql-snow .ql-tooltip a.ql-action::after{border-right:1px solid #ccc;content:'Edit';margin-left:16px;padding-right:8px}.ql-snow .ql-tooltip a.ql-remove::before{content:'Remove';margin-left:8px}.ql-snow .ql-tooltip a{line-height:26px}.ql-snow .ql-tooltip.ql-editing a.ql-preview,.ql-snow .ql-tooltip.ql-editing a.ql-remove{display:none}.ql-snow .ql-tooltip.ql-editing input[type=text]{display:inline-block}.ql-snow .ql-tooltip.ql-editing a.ql-action::after{border-right:0;content:'Save';padding-right:0}.ql-snow .ql-tooltip[data-mode=link]::before{content:"Enter link:"}.ql-snow .ql-tooltip[data-mode=formula]::before{content:"Enter formula:"}.ql-snow .ql-tooltip[data-mode=video]::before{content:"Enter video:"}.ql-snow a{color:#06c}.ql-container.ql-snow{border:1px solid #ccc} + +/*# sourceMappingURL=quill.snow.css.map*/ \ No newline at end of file diff --git a/public/assets/quill/dist/quill.snow.css.map b/public/assets/quill/dist/quill.snow.css.map new file mode 100644 index 0000000..2cc7be8 --- /dev/null +++ b/public/assets/quill/dist/quill.snow.css.map @@ -0,0 +1 @@ +{"version":3,"file":"quill.snow.css","mappings":"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","sources":["webpack://Quill/./src/assets/core.styl","webpack://Quill/./src/assets/base.styl","webpack://Quill/./src/assets/snow/toolbar.styl","webpack://Quill/./src/assets/snow/tooltip.styl","webpack://Quill/./src/assets/snow.styl"],"sourcesContent":["// Styles necessary for Quill\n\nLIST_STYLE = decimal lower-alpha lower-roman\nLIST_STYLE_WIDTH = 1.2em\nLIST_STYLE_MARGIN = 0.3em\nLIST_STYLE_OUTER_WIDTH = LIST_STYLE_MARGIN + LIST_STYLE_WIDTH\nMAX_INDENT = 9\n\nresets(arr)\n unquote('list-' + join(' list-', arr))\n\n.ql-container\n box-sizing: border-box\n font-family: Helvetica, Arial, sans-serif\n font-size: 13px\n height: 100%\n margin: 0px\n position: relative\n\n.ql-container.ql-disabled\n .ql-tooltip\n visibility: hidden\n\n.ql-container:not(.ql-disabled)\n li[data-list=checked],\n li[data-list=unchecked]\n > .ql-ui\n cursor: pointer\n\n.ql-clipboard\n left: -100000px\n height: 1px\n overflow-y: hidden\n position: absolute\n top: 50%\n p\n margin: 0\n padding: 0\n\n.ql-editor\n box-sizing: border-box\n counter-reset: resets(0..MAX_INDENT)\n line-height: 1.42\n height: 100%\n outline: none\n overflow-y: auto\n padding: 12px 15px\n tab-size: 4\n -moz-tab-size: 4\n text-align: left\n white-space: pre-wrap\n word-wrap: break-word\n > *\n cursor: text\n\n p, ol, pre, blockquote, h1, h2, h3, h4, h5, h6\n margin: 0\n padding: 0\n p, h1, h2, h3, h4, h5, h6\n @supports (counter-set: none)\n counter-set: resets(0..MAX_INDENT)\n @supports not (counter-set: none)\n counter-reset: resets(0..MAX_INDENT)\n table\n border-collapse: collapse\n td\n border: 1px solid #000\n padding: 2px 5px\n ol\n padding-left: 1.5em\n li\n list-style-type: none\n padding-left: LIST_STYLE_OUTER_WIDTH\n position: relative\n\n > .ql-ui:before\n display: inline-block\n margin-left: -1*LIST_STYLE_OUTER_WIDTH\n margin-right: LIST_STYLE_MARGIN\n text-align: right\n white-space: nowrap\n width: LIST_STYLE_WIDTH\n\n li[data-list=checked],\n li[data-list=unchecked]\n > .ql-ui\n color: #777\n\n li[data-list=bullet] > .ql-ui:before\n content: '\\2022'\n li[data-list=checked] > .ql-ui:before\n content: '\\2611'\n li[data-list=unchecked] > .ql-ui:before\n content: '\\2610'\n\n li[data-list]\n @supports (counter-set: none)\n counter-set: resets(1..MAX_INDENT)\n @supports not (counter-set: none)\n counter-reset: resets(1..MAX_INDENT)\n\n li[data-list=ordered]\n counter-increment: list-0\n > .ql-ui:before\n content: unquote('counter(list-0, ' + LIST_STYLE[0] + ')') '. '\n for num in (1..MAX_INDENT)\n li[data-list=ordered].ql-indent-{num}\n counter-increment: unquote('list-' + num)\n > .ql-ui:before\n content: unquote('counter(list-' + num + ', ' + LIST_STYLE[num%3] + ')') '. '\n if (num < MAX_INDENT)\n li[data-list].ql-indent-{num}\n @supports (counter-set: none)\n counter-set: resets((num+1)..MAX_INDENT)\n @supports not (counter-set: none)\n counter-reset: resets((num+1)..MAX_INDENT)\n\n for num in (1..MAX_INDENT)\n .ql-indent-{num}:not(.ql-direction-rtl)\n padding-left: (3*num)em\n li.ql-indent-{num}:not(.ql-direction-rtl)\n padding-left: (3*num + LIST_STYLE_OUTER_WIDTH)em\n .ql-indent-{num}.ql-direction-rtl.ql-align-right\n padding-right: (3*num)em\n li.ql-indent-{num}.ql-direction-rtl.ql-align-right\n padding-right: (3*num + LIST_STYLE_OUTER_WIDTH)em\n\n li.ql-direction-rtl\n padding-right: LIST_STYLE_OUTER_WIDTH\n > .ql-ui:before\n margin-left: LIST_STYLE_MARGIN\n margin-right: -1*LIST_STYLE_OUTER_WIDTH\n text-align: left\n\n table\n table-layout: fixed\n width: 100%\n td\n outline: none\n\n .ql-code-block-container\n font-family: monospace\n\n .ql-video\n display: block\n max-width: 100%\n .ql-video.ql-align-center\n margin: 0 auto\n .ql-video.ql-align-right\n margin: 0 0 0 auto\n\n .ql-bg-black\n background-color: rgb(0,0,0)\n .ql-bg-red\n background-color: rgb(230,0,0)\n .ql-bg-orange\n background-color: rgb(255,153,0)\n .ql-bg-yellow\n background-color: rgb(255,255,0)\n .ql-bg-green\n background-color: rgb(0,138,0)\n .ql-bg-blue\n background-color: rgb(0,102,204)\n .ql-bg-purple\n background-color: rgb(153,51,255)\n\n .ql-color-white\n color: rgb(255,255,255)\n .ql-color-red\n color: rgb(230,0,0)\n .ql-color-orange\n color: rgb(255,153,0)\n .ql-color-yellow\n color: rgb(255,255,0)\n .ql-color-green\n color: rgb(0,138,0)\n .ql-color-blue\n color: rgb(0,102,204)\n .ql-color-purple\n color: rgb(153,51,255)\n\n .ql-font-serif\n font-family: Georgia, Times New Roman, serif\n .ql-font-monospace\n font-family: Monaco, Courier New, monospace\n\n .ql-size-small\n font-size: 0.75em\n .ql-size-large\n font-size: 1.5em\n .ql-size-huge\n font-size: 2.5em\n\n .ql-direction-rtl\n direction: rtl\n text-align: inherit\n\n .ql-align-center\n text-align: center\n .ql-align-justify\n text-align: justify\n .ql-align-right\n text-align: right\n\n .ql-ui\n position: absolute\n\n.ql-editor.ql-blank::before\n color: rgba(0,0,0,0.6)\n content: attr(data-placeholder)\n font-style: italic\n left: 15px\n pointer-events: none\n position: absolute\n right: 15px\n","// Styles shared between snow and bubble\n\ncontrolHeight = 24px\ninputPaddingWidth = 5px\ninputPaddingHeight = 3px\n\ncolorItemMargin = 2px\ncolorItemSize = 16px\ncolorItemsPerRow = 7\n\n\n.ql-{themeName}.ql-toolbar, .ql-{themeName} .ql-toolbar\n &:after\n clear: both\n content: ''\n display: table\n\n button\n background: none\n border: none\n cursor: pointer\n display: inline-block\n float: left\n height: controlHeight\n padding: inputPaddingHeight inputPaddingWidth\n width: controlHeight + (inputPaddingWidth - inputPaddingHeight)*2\n\n svg\n float: left\n height: 100%\n\n &:active:hover\n outline: none\n\n input.ql-image[type=file]\n display: none\n\n button:hover, button:focus, button.ql-active,\n .ql-picker-label:hover, .ql-picker-label.ql-active,\n .ql-picker-item:hover, .ql-picker-item.ql-selected\n color: activeColor\n .ql-fill, .ql-stroke.ql-fill\n fill: activeColor\n .ql-stroke, .ql-stroke-miter\n stroke: activeColor\n\n// Fix for iOS not losing hover on touch\n@media (pointer: coarse)\n .ql-{themeName}.ql-toolbar, .ql-{themeName} .ql-toolbar\n button:hover:not(.ql-active)\n color: inactiveColor\n .ql-fill, .ql-stroke.ql-fill\n fill: inactiveColor\n .ql-stroke, .ql-stroke-miter\n stroke: inactiveColor\n\n.ql-{themeName}\n box-sizing: border-box\n *\n box-sizing: border-box\n\n .ql-hidden\n display: none\n .ql-out-bottom, .ql-out-top\n visibility: hidden\n\n .ql-tooltip\n position: absolute\n transform: translateY(10px)\n a\n cursor: pointer\n text-decoration: none\n .ql-tooltip.ql-flip\n transform: translateY(-10px)\n\n .ql-formats\n &:after\n clear: both\n content: ''\n display: table\n display: inline-block\n vertical-align: middle\n\n .ql-stroke\n fill: none\n stroke: inactiveColor\n stroke-linecap: round\n stroke-linejoin: round\n stroke-width: 2\n .ql-stroke-miter\n fill: none\n stroke: inactiveColor\n stroke-miterlimit: 10\n stroke-width: 2\n\n .ql-fill, .ql-stroke.ql-fill\n fill: inactiveColor\n\n .ql-empty\n fill: none\n .ql-even\n fill-rule: evenodd\n .ql-thin, .ql-stroke.ql-thin\n stroke-width: 1\n .ql-transparent\n opacity: 0.4\n\n .ql-direction\n svg:last-child\n display: none\n .ql-direction.ql-active\n svg:last-child\n display: inline\n svg:first-child\n display: none\n\n .ql-editor\n h1\n font-size: 2em\n h2\n font-size: 1.5em\n h3\n font-size: 1.17em\n h4\n font-size: 1em\n h5\n font-size: 0.83em\n h6\n font-size: 0.67em\n a\n text-decoration: underline\n blockquote\n border-left: 4px solid #ccc\n margin-bottom: 5px\n margin-top: 5px\n padding-left: 16px\n code, .ql-code-block-container\n background-color: #f0f0f0\n border-radius: 3px\n .ql-code-block-container\n margin-bottom: 5px\n margin-top: 5px\n padding: 5px 10px\n code\n font-size: 85%\n padding: 2px 4px\n .ql-code-block-container\n background-color: #23241f\n color: #f8f8f2\n overflow: visible\n img\n max-width: 100%\n\n .ql-picker\n color: inactiveColor\n display: inline-block\n float: left\n font-size: 14px\n font-weight: 500\n height: controlHeight\n position: relative\n vertical-align: middle\n .ql-picker-label\n cursor: pointer\n display: inline-block\n height: 100%\n padding-left: 8px\n padding-right: 2px\n position: relative\n width: 100%\n &::before\n display: inline-block\n line-height: 22px\n .ql-picker-options\n background-color: backgroundColor\n display: none\n min-width: 100%\n padding: 4px 8px\n position: absolute\n white-space: nowrap\n .ql-picker-item\n cursor: pointer\n display: block\n padding-bottom: 5px\n padding-top: 5px\n .ql-picker.ql-expanded\n .ql-picker-label\n color: borderColor\n z-index: 2\n .ql-fill\n fill: borderColor\n .ql-stroke\n stroke: borderColor\n .ql-picker-options\n display: block\n margin-top: -1px\n top: 100%\n z-index: 1\n\n .ql-color-picker, .ql-icon-picker\n width: controlHeight + 4\n .ql-picker-label\n padding: 2px 4px\n svg\n right: 4px\n .ql-icon-picker\n .ql-picker-options\n padding: 4px 0px\n .ql-picker-item\n height: controlHeight\n width: controlHeight\n padding: 2px 4px\n .ql-color-picker\n .ql-picker-options\n padding: inputPaddingHeight inputPaddingWidth\n width: (colorItemSize + 2*colorItemMargin) * colorItemsPerRow + 2*inputPaddingWidth + 2 // +2 for the border\n .ql-picker-item\n border: 1px solid transparent\n float: left\n height: colorItemSize\n margin: colorItemMargin\n padding: 0px\n width: colorItemSize\n\n .ql-picker:not(.ql-color-picker):not(.ql-icon-picker)\n svg\n position: absolute\n margin-top: -9px\n right: 0\n top: 50%\n width: 18px\n\n .ql-picker.ql-header, .ql-picker.ql-font, .ql-picker.ql-size\n .ql-picker-label[data-label]:not([data-label='']),\n .ql-picker-item[data-label]:not([data-label=''])\n &::before\n content: attr(data-label)\n\n .ql-picker.ql-header\n width: 98px\n .ql-picker-label::before,\n .ql-picker-item::before\n content: 'Normal'\n for num in (1..6)\n .ql-picker-label[data-value=\\\"{num}\\\"]::before,\n .ql-picker-item[data-value=\\\"{num}\\\"]::before\n content: 'Heading ' + num\n .ql-picker-item[data-value=\"1\"]::before\n font-size: 2em\n .ql-picker-item[data-value=\"2\"]::before\n font-size: 1.5em\n .ql-picker-item[data-value=\"3\"]::before\n font-size: 1.17em\n .ql-picker-item[data-value=\"4\"]::before\n font-size: 1em\n .ql-picker-item[data-value=\"5\"]::before\n font-size: 0.83em\n .ql-picker-item[data-value=\"6\"]::before\n font-size: 0.67em\n\n .ql-picker.ql-font\n width: 108px\n .ql-picker-label::before,\n .ql-picker-item::before\n content: 'Sans Serif'\n .ql-picker-label[data-value=serif]::before,\n .ql-picker-item[data-value=serif]::before\n content: 'Serif'\n .ql-picker-label[data-value=monospace]::before,\n .ql-picker-item[data-value=monospace]::before\n content: 'Monospace'\n .ql-picker-item[data-value=serif]::before\n font-family: Georgia, Times New Roman, serif\n .ql-picker-item[data-value=monospace]::before\n font-family: Monaco, Courier New, monospace\n\n .ql-picker.ql-size\n width: 98px\n .ql-picker-label::before,\n .ql-picker-item::before\n content: 'Normal'\n .ql-picker-label[data-value=small]::before,\n .ql-picker-item[data-value=small]::before\n content: 'Small'\n .ql-picker-label[data-value=large]::before,\n .ql-picker-item[data-value=large]::before\n content: 'Large'\n .ql-picker-label[data-value=huge]::before,\n .ql-picker-item[data-value=huge]::before\n content: 'Huge'\n .ql-picker-item[data-value=small]::before\n font-size: 10px\n .ql-picker-item[data-value=large]::before\n font-size: 18px\n .ql-picker-item[data-value=huge]::before\n font-size: 32px\n\n .ql-color-picker.ql-background\n .ql-picker-item\n background-color: #fff\n .ql-color-picker.ql-color\n .ql-picker-item\n background-color: #000\n\n.ql-code-block-container\n position: relative\n .ql-ui\n right: 5px\n top: 5px\n",".ql-toolbar.ql-snow\n border: 1px solid borderColor\n box-sizing: border-box\n font-family: 'Helvetica Neue', 'Helvetica', 'Arial', sans-serif\n padding: 8px\n\n .ql-formats\n margin-right: 15px\n\n .ql-picker-label\n border: 1px solid transparent\n .ql-picker-options\n border: 1px solid transparent\n box-shadow: rgba(0,0,0,0.2) 0 2px 8px\n .ql-picker.ql-expanded\n .ql-picker-label\n border-color: borderColor\n .ql-picker-options\n border-color: borderColor\n\n .ql-color-picker\n .ql-picker-item.ql-selected, .ql-picker-item:hover\n border-color: #000\n\n.ql-toolbar.ql-snow + .ql-container.ql-snow\n border-top: 0px;\n","tooltipMargin = 8px\n\n.ql-snow\n .ql-tooltip\n background-color: #fff\n border: 1px solid borderColor\n box-shadow: 0px 0px 5px shadowColor\n color: textColor\n padding: 5px 12px\n white-space: nowrap\n &::before\n content: \"Visit URL:\"\n line-height: 26px\n margin-right: tooltipMargin\n input[type=text]\n display: none\n border: 1px solid borderColor\n font-size: 13px\n height: 26px\n margin: 0px\n padding: 3px 5px\n width: 170px\n a.ql-preview\n display: inline-block\n max-width: 200px\n overflow-x: hidden\n text-overflow: ellipsis\n vertical-align: top\n a.ql-action::after\n border-right: 1px solid borderColor\n content: 'Edit'\n margin-left: tooltipMargin*2\n padding-right: tooltipMargin\n a.ql-remove::before\n content: 'Remove'\n margin-left: tooltipMargin\n a\n line-height: 26px\n .ql-tooltip.ql-editing\n a.ql-preview, a.ql-remove\n display: none\n input[type=text]\n display: inline-block\n a.ql-action::after\n border-right: 0px\n content: 'Save'\n padding-right: 0px\n .ql-tooltip[data-mode=link]::before\n content: \"Enter link:\"\n .ql-tooltip[data-mode=formula]::before\n content: \"Enter formula:\"\n .ql-tooltip[data-mode=video]::before\n content: \"Enter video:\"\n","themeName = 'snow'\nactiveColor = #06c\nborderColor = #ccc\nbackgroundColor = #fff\ninactiveColor = #444\nshadowColor = #ddd\ntextColor = #444\n\n@import './core'\n@import './base'\n@import './snow/*'\n\n.ql-snow\n a\n color: activeColor\n\n.ql-container.ql-snow\n border: 1px solid borderColor\n"],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/public/assets/quill/formats/align.d.ts b/public/assets/quill/formats/align.d.ts new file mode 100644 index 0000000..6190e18 --- /dev/null +++ b/public/assets/quill/formats/align.d.ts @@ -0,0 +1,5 @@ +import { Attributor, ClassAttributor, StyleAttributor } from 'parchment'; +declare const AlignAttribute: Attributor; +declare const AlignClass: ClassAttributor; +declare const AlignStyle: StyleAttributor; +export { AlignAttribute, AlignClass, AlignStyle }; diff --git a/public/assets/quill/formats/align.js b/public/assets/quill/formats/align.js new file mode 100644 index 0000000..7cfa7f0 --- /dev/null +++ b/public/assets/quill/formats/align.js @@ -0,0 +1,10 @@ +import { Attributor, ClassAttributor, Scope, StyleAttributor } from 'parchment'; +const config = { + scope: Scope.BLOCK, + whitelist: ['right', 'center', 'justify'] +}; +const AlignAttribute = new Attributor('align', 'align', config); +const AlignClass = new ClassAttributor('align', 'ql-align', config); +const AlignStyle = new StyleAttributor('align', 'text-align', config); +export { AlignAttribute, AlignClass, AlignStyle }; +//# sourceMappingURL=align.js.map \ No newline at end of file diff --git a/public/assets/quill/formats/align.js.map b/public/assets/quill/formats/align.js.map new file mode 100644 index 0000000..80c605a --- /dev/null +++ b/public/assets/quill/formats/align.js.map @@ -0,0 +1 @@ +{"version":3,"file":"align.js","names":["Attributor","ClassAttributor","Scope","StyleAttributor","config","scope","BLOCK","whitelist","AlignAttribute","AlignClass","AlignStyle"],"sources":["../../src/formats/align.ts"],"sourcesContent":["import { Attributor, ClassAttributor, Scope, StyleAttributor } from 'parchment';\n\nconst config = {\n scope: Scope.BLOCK,\n whitelist: ['right', 'center', 'justify'],\n};\n\nconst AlignAttribute = new Attributor('align', 'align', config);\nconst AlignClass = new ClassAttributor('align', 'ql-align', config);\nconst AlignStyle = new StyleAttributor('align', 'text-align', config);\n\nexport { AlignAttribute, AlignClass, AlignStyle };\n"],"mappings":"AAAA,SAASA,UAAU,EAAEC,eAAe,EAAEC,KAAK,EAAEC,eAAe,QAAQ,WAAW;AAE/E,MAAMC,MAAM,GAAG;EACbC,KAAK,EAAEH,KAAK,CAACI,KAAK;EAClBC,SAAS,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,SAAS;AAC1C,CAAC;AAED,MAAMC,cAAc,GAAG,IAAIR,UAAU,CAAC,OAAO,EAAE,OAAO,EAAEI,MAAM,CAAC;AAC/D,MAAMK,UAAU,GAAG,IAAIR,eAAe,CAAC,OAAO,EAAE,UAAU,EAAEG,MAAM,CAAC;AACnE,MAAMM,UAAU,GAAG,IAAIP,eAAe,CAAC,OAAO,EAAE,YAAY,EAAEC,MAAM,CAAC;AAErE,SAASI,cAAc,EAAEC,UAAU,EAAEC,UAAU","ignoreList":[]} \ No newline at end of file diff --git a/public/assets/quill/formats/background.d.ts b/public/assets/quill/formats/background.d.ts new file mode 100644 index 0000000..607d248 --- /dev/null +++ b/public/assets/quill/formats/background.d.ts @@ -0,0 +1,5 @@ +import { ClassAttributor } from 'parchment'; +import { ColorAttributor } from './color.js'; +declare const BackgroundClass: ClassAttributor; +declare const BackgroundStyle: ColorAttributor; +export { BackgroundClass, BackgroundStyle }; diff --git a/public/assets/quill/formats/background.js b/public/assets/quill/formats/background.js new file mode 100644 index 0000000..9fc4208 --- /dev/null +++ b/public/assets/quill/formats/background.js @@ -0,0 +1,10 @@ +import { ClassAttributor, Scope } from 'parchment'; +import { ColorAttributor } from './color.js'; +const BackgroundClass = new ClassAttributor('background', 'ql-bg', { + scope: Scope.INLINE +}); +const BackgroundStyle = new ColorAttributor('background', 'background-color', { + scope: Scope.INLINE +}); +export { BackgroundClass, BackgroundStyle }; +//# sourceMappingURL=background.js.map \ No newline at end of file diff --git a/public/assets/quill/formats/background.js.map b/public/assets/quill/formats/background.js.map new file mode 100644 index 0000000..5bbda22 --- /dev/null +++ b/public/assets/quill/formats/background.js.map @@ -0,0 +1 @@ +{"version":3,"file":"background.js","names":["ClassAttributor","Scope","ColorAttributor","BackgroundClass","scope","INLINE","BackgroundStyle"],"sources":["../../src/formats/background.ts"],"sourcesContent":["import { ClassAttributor, Scope } from 'parchment';\nimport { ColorAttributor } from './color.js';\n\nconst BackgroundClass = new ClassAttributor('background', 'ql-bg', {\n scope: Scope.INLINE,\n});\nconst BackgroundStyle = new ColorAttributor('background', 'background-color', {\n scope: Scope.INLINE,\n});\n\nexport { BackgroundClass, BackgroundStyle };\n"],"mappings":"AAAA,SAASA,eAAe,EAAEC,KAAK,QAAQ,WAAW;AAClD,SAASC,eAAe,QAAQ,YAAY;AAE5C,MAAMC,eAAe,GAAG,IAAIH,eAAe,CAAC,YAAY,EAAE,OAAO,EAAE;EACjEI,KAAK,EAAEH,KAAK,CAACI;AACf,CAAC,CAAC;AACF,MAAMC,eAAe,GAAG,IAAIJ,eAAe,CAAC,YAAY,EAAE,kBAAkB,EAAE;EAC5EE,KAAK,EAAEH,KAAK,CAACI;AACf,CAAC,CAAC;AAEF,SAASF,eAAe,EAAEG,eAAe","ignoreList":[]} \ No newline at end of file diff --git a/public/assets/quill/formats/blockquote.d.ts b/public/assets/quill/formats/blockquote.d.ts new file mode 100644 index 0000000..b59049f --- /dev/null +++ b/public/assets/quill/formats/blockquote.d.ts @@ -0,0 +1,6 @@ +import Block from '../blots/block.js'; +declare class Blockquote extends Block { + static blotName: string; + static tagName: string; +} +export default Blockquote; diff --git a/public/assets/quill/formats/blockquote.js b/public/assets/quill/formats/blockquote.js new file mode 100644 index 0000000..d734ccd --- /dev/null +++ b/public/assets/quill/formats/blockquote.js @@ -0,0 +1,7 @@ +import Block from '../blots/block.js'; +class Blockquote extends Block { + static blotName = 'blockquote'; + static tagName = 'blockquote'; +} +export default Blockquote; +//# sourceMappingURL=blockquote.js.map \ No newline at end of file diff --git a/public/assets/quill/formats/blockquote.js.map b/public/assets/quill/formats/blockquote.js.map new file mode 100644 index 0000000..c497702 --- /dev/null +++ b/public/assets/quill/formats/blockquote.js.map @@ -0,0 +1 @@ +{"version":3,"file":"blockquote.js","names":["Block","Blockquote","blotName","tagName"],"sources":["../../src/formats/blockquote.ts"],"sourcesContent":["import Block from '../blots/block.js';\n\nclass Blockquote extends Block {\n static blotName = 'blockquote';\n static tagName = 'blockquote';\n}\n\nexport default Blockquote;\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,mBAAmB;AAErC,MAAMC,UAAU,SAASD,KAAK,CAAC;EAC7B,OAAOE,QAAQ,GAAG,YAAY;EAC9B,OAAOC,OAAO,GAAG,YAAY;AAC/B;AAEA,eAAeF,UAAU","ignoreList":[]} \ No newline at end of file diff --git a/public/assets/quill/formats/bold.d.ts b/public/assets/quill/formats/bold.d.ts new file mode 100644 index 0000000..5f823ae --- /dev/null +++ b/public/assets/quill/formats/bold.d.ts @@ -0,0 +1,11 @@ +import Inline from '../blots/inline.js'; +declare class Bold extends Inline { + static blotName: string; + static tagName: string[]; + static create(): HTMLElement; + static formats(): boolean; + optimize(context: { + [key: string]: any; + }): void; +} +export default Bold; diff --git a/public/assets/quill/formats/bold.js b/public/assets/quill/formats/bold.js new file mode 100644 index 0000000..6463e42 --- /dev/null +++ b/public/assets/quill/formats/bold.js @@ -0,0 +1,19 @@ +import Inline from '../blots/inline.js'; +class Bold extends Inline { + static blotName = 'bold'; + static tagName = ['STRONG', 'B']; + static create() { + return super.create(); + } + static formats() { + return true; + } + optimize(context) { + super.optimize(context); + if (this.domNode.tagName !== this.statics.tagName[0]) { + this.replaceWith(this.statics.blotName); + } + } +} +export default Bold; +//# sourceMappingURL=bold.js.map \ No newline at end of file diff --git a/public/assets/quill/formats/bold.js.map b/public/assets/quill/formats/bold.js.map new file mode 100644 index 0000000..e354a1f --- /dev/null +++ b/public/assets/quill/formats/bold.js.map @@ -0,0 +1 @@ +{"version":3,"file":"bold.js","names":["Inline","Bold","blotName","tagName","create","formats","optimize","context","domNode","statics","replaceWith"],"sources":["../../src/formats/bold.ts"],"sourcesContent":["import Inline from '../blots/inline.js';\n\nclass Bold extends Inline {\n static blotName = 'bold';\n static tagName = ['STRONG', 'B'];\n\n static create() {\n return super.create();\n }\n\n static formats() {\n return true;\n }\n\n optimize(context: { [key: string]: any }) {\n super.optimize(context);\n if (this.domNode.tagName !== this.statics.tagName[0]) {\n this.replaceWith(this.statics.blotName);\n }\n }\n}\n\nexport default Bold;\n"],"mappings":"AAAA,OAAOA,MAAM,MAAM,oBAAoB;AAEvC,MAAMC,IAAI,SAASD,MAAM,CAAC;EACxB,OAAOE,QAAQ,GAAG,MAAM;EACxB,OAAOC,OAAO,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC;EAEhC,OAAOC,MAAMA,CAAA,EAAG;IACd,OAAO,KAAK,CAACA,MAAM,CAAC,CAAC;EACvB;EAEA,OAAOC,OAAOA,CAAA,EAAG;IACf,OAAO,IAAI;EACb;EAEAC,QAAQA,CAACC,OAA+B,EAAE;IACxC,KAAK,CAACD,QAAQ,CAACC,OAAO,CAAC;IACvB,IAAI,IAAI,CAACC,OAAO,CAACL,OAAO,KAAK,IAAI,CAACM,OAAO,CAACN,OAAO,CAAC,CAAC,CAAC,EAAE;MACpD,IAAI,CAACO,WAAW,CAAC,IAAI,CAACD,OAAO,CAACP,QAAQ,CAAC;IACzC;EACF;AACF;AAEA,eAAeD,IAAI","ignoreList":[]} \ No newline at end of file diff --git a/public/assets/quill/formats/code.d.ts b/public/assets/quill/formats/code.d.ts new file mode 100644 index 0000000..664eb6c --- /dev/null +++ b/public/assets/quill/formats/code.d.ts @@ -0,0 +1,15 @@ +import Block from '../blots/block.js'; +import Inline from '../blots/inline.js'; +import Container from '../blots/container.js'; +declare class CodeBlockContainer extends Container { + static create(value: string): Element; + code(index: number, length: number): string; + html(index: number, length: number): string; +} +declare class CodeBlock extends Block { + static TAB: string; + static register(): void; +} +declare class Code extends Inline { +} +export { Code, CodeBlockContainer, CodeBlock as default }; diff --git a/public/assets/quill/formats/code.js b/public/assets/quill/formats/code.js new file mode 100644 index 0000000..bba329d --- /dev/null +++ b/public/assets/quill/formats/code.js @@ -0,0 +1,44 @@ +import Block from '../blots/block.js'; +import Break from '../blots/break.js'; +import Cursor from '../blots/cursor.js'; +import Inline from '../blots/inline.js'; +import TextBlot, { escapeText } from '../blots/text.js'; +import Container from '../blots/container.js'; +import Quill from '../core/quill.js'; +class CodeBlockContainer extends Container { + static create(value) { + const domNode = super.create(value); + domNode.setAttribute('spellcheck', 'false'); + return domNode; + } + code(index, length) { + return this.children + // @ts-expect-error + .map(child => child.length() <= 1 ? '' : child.domNode.innerText).join('\n').slice(index, index + length); + } + html(index, length) { + // `\n`s are needed in order to support empty lines at the beginning and the end. + // https://html.spec.whatwg.org/multipage/syntax.html#element-restrictions + return `
    \n${escapeText(this.code(index, length))}\n
    `; + } +} +class CodeBlock extends Block { + static TAB = ' '; + static register() { + Quill.register(CodeBlockContainer); + } +} +class Code extends Inline {} +Code.blotName = 'code'; +Code.tagName = 'CODE'; +CodeBlock.blotName = 'code-block'; +CodeBlock.className = 'ql-code-block'; +CodeBlock.tagName = 'DIV'; +CodeBlockContainer.blotName = 'code-block-container'; +CodeBlockContainer.className = 'ql-code-block-container'; +CodeBlockContainer.tagName = 'DIV'; +CodeBlockContainer.allowedChildren = [CodeBlock]; +CodeBlock.allowedChildren = [TextBlot, Break, Cursor]; +CodeBlock.requiredContainer = CodeBlockContainer; +export { Code, CodeBlockContainer, CodeBlock as default }; +//# sourceMappingURL=code.js.map \ No newline at end of file diff --git a/public/assets/quill/formats/code.js.map b/public/assets/quill/formats/code.js.map new file mode 100644 index 0000000..29f2450 --- /dev/null +++ b/public/assets/quill/formats/code.js.map @@ -0,0 +1 @@ +{"version":3,"file":"code.js","names":["Block","Break","Cursor","Inline","TextBlot","escapeText","Container","Quill","CodeBlockContainer","create","value","domNode","setAttribute","code","index","length","children","map","child","innerText","join","slice","html","CodeBlock","TAB","register","Code","blotName","tagName","className","allowedChildren","requiredContainer","default"],"sources":["../../src/formats/code.ts"],"sourcesContent":["import Block from '../blots/block.js';\nimport Break from '../blots/break.js';\nimport Cursor from '../blots/cursor.js';\nimport Inline from '../blots/inline.js';\nimport TextBlot, { escapeText } from '../blots/text.js';\nimport Container from '../blots/container.js';\nimport Quill from '../core/quill.js';\n\nclass CodeBlockContainer extends Container {\n static create(value: string) {\n const domNode = super.create(value) as Element;\n domNode.setAttribute('spellcheck', 'false');\n return domNode;\n }\n\n code(index: number, length: number) {\n return (\n this.children\n // @ts-expect-error\n .map((child) => (child.length() <= 1 ? '' : child.domNode.innerText))\n .join('\\n')\n .slice(index, index + length)\n );\n }\n\n html(index: number, length: number) {\n // `\\n`s are needed in order to support empty lines at the beginning and the end.\n // https://html.spec.whatwg.org/multipage/syntax.html#element-restrictions\n return `
    \\n${escapeText(this.code(index, length))}\\n
    `;\n }\n}\n\nclass CodeBlock extends Block {\n static TAB = ' ';\n\n static register() {\n Quill.register(CodeBlockContainer);\n }\n}\n\nclass Code extends Inline {}\nCode.blotName = 'code';\nCode.tagName = 'CODE';\n\nCodeBlock.blotName = 'code-block';\nCodeBlock.className = 'ql-code-block';\nCodeBlock.tagName = 'DIV';\nCodeBlockContainer.blotName = 'code-block-container';\nCodeBlockContainer.className = 'ql-code-block-container';\nCodeBlockContainer.tagName = 'DIV';\n\nCodeBlockContainer.allowedChildren = [CodeBlock];\n\nCodeBlock.allowedChildren = [TextBlot, Break, Cursor];\nCodeBlock.requiredContainer = CodeBlockContainer;\n\nexport { Code, CodeBlockContainer, CodeBlock as default };\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,mBAAmB;AACrC,OAAOC,KAAK,MAAM,mBAAmB;AACrC,OAAOC,MAAM,MAAM,oBAAoB;AACvC,OAAOC,MAAM,MAAM,oBAAoB;AACvC,OAAOC,QAAQ,IAAIC,UAAU,QAAQ,kBAAkB;AACvD,OAAOC,SAAS,MAAM,uBAAuB;AAC7C,OAAOC,KAAK,MAAM,kBAAkB;AAEpC,MAAMC,kBAAkB,SAASF,SAAS,CAAC;EACzC,OAAOG,MAAMA,CAACC,KAAa,EAAE;IAC3B,MAAMC,OAAO,GAAG,KAAK,CAACF,MAAM,CAACC,KAAK,CAAY;IAC9CC,OAAO,CAACC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC;IAC3C,OAAOD,OAAO;EAChB;EAEAE,IAAIA,CAACC,KAAa,EAAEC,MAAc,EAAE;IAClC,OACE,IAAI,CAACC;IACH;IAAA,CACCC,GAAG,CAAEC,KAAK,IAAMA,KAAK,CAACH,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAGG,KAAK,CAACP,OAAO,CAACQ,SAAU,CAAC,CACpEC,IAAI,CAAC,IAAI,CAAC,CACVC,KAAK,CAACP,KAAK,EAAEA,KAAK,GAAGC,MAAM,CAAC;EAEnC;EAEAO,IAAIA,CAACR,KAAa,EAAEC,MAAc,EAAE;IAClC;IACA;IACA,OAAQ,UAASV,UAAU,CAAC,IAAI,CAACQ,IAAI,CAACC,KAAK,EAAEC,MAAM,CAAC,CAAE,UAAS;EACjE;AACF;AAEA,MAAMQ,SAAS,SAASvB,KAAK,CAAC;EAC5B,OAAOwB,GAAG,GAAG,IAAI;EAEjB,OAAOC,QAAQA,CAAA,EAAG;IAChBlB,KAAK,CAACkB,QAAQ,CAACjB,kBAAkB,CAAC;EACpC;AACF;AAEA,MAAMkB,IAAI,SAASvB,MAAM,CAAC;AAC1BuB,IAAI,CAACC,QAAQ,GAAG,MAAM;AACtBD,IAAI,CAACE,OAAO,GAAG,MAAM;AAErBL,SAAS,CAACI,QAAQ,GAAG,YAAY;AACjCJ,SAAS,CAACM,SAAS,GAAG,eAAe;AACrCN,SAAS,CAACK,OAAO,GAAG,KAAK;AACzBpB,kBAAkB,CAACmB,QAAQ,GAAG,sBAAsB;AACpDnB,kBAAkB,CAACqB,SAAS,GAAG,yBAAyB;AACxDrB,kBAAkB,CAACoB,OAAO,GAAG,KAAK;AAElCpB,kBAAkB,CAACsB,eAAe,GAAG,CAACP,SAAS,CAAC;AAEhDA,SAAS,CAACO,eAAe,GAAG,CAAC1B,QAAQ,EAAEH,KAAK,EAAEC,MAAM,CAAC;AACrDqB,SAAS,CAACQ,iBAAiB,GAAGvB,kBAAkB;AAEhD,SAASkB,IAAI,EAAElB,kBAAkB,EAAEe,SAAS,IAAIS,OAAO","ignoreList":[]} \ No newline at end of file diff --git a/public/assets/quill/formats/color.d.ts b/public/assets/quill/formats/color.d.ts new file mode 100644 index 0000000..5ec6d02 --- /dev/null +++ b/public/assets/quill/formats/color.d.ts @@ -0,0 +1,7 @@ +import { ClassAttributor, StyleAttributor } from 'parchment'; +declare class ColorAttributor extends StyleAttributor { + value(domNode: HTMLElement): string; +} +declare const ColorClass: ClassAttributor; +declare const ColorStyle: ColorAttributor; +export { ColorAttributor, ColorClass, ColorStyle }; diff --git a/public/assets/quill/formats/color.js b/public/assets/quill/formats/color.js new file mode 100644 index 0000000..ad91647 --- /dev/null +++ b/public/assets/quill/formats/color.js @@ -0,0 +1,18 @@ +import { ClassAttributor, Scope, StyleAttributor } from 'parchment'; +class ColorAttributor extends StyleAttributor { + value(domNode) { + let value = super.value(domNode); + if (!value.startsWith('rgb(')) return value; + value = value.replace(/^[^\d]+/, '').replace(/[^\d]+$/, ''); + const hex = value.split(',').map(component => `00${parseInt(component, 10).toString(16)}`.slice(-2)).join(''); + return `#${hex}`; + } +} +const ColorClass = new ClassAttributor('color', 'ql-color', { + scope: Scope.INLINE +}); +const ColorStyle = new ColorAttributor('color', 'color', { + scope: Scope.INLINE +}); +export { ColorAttributor, ColorClass, ColorStyle }; +//# sourceMappingURL=color.js.map \ No newline at end of file diff --git a/public/assets/quill/formats/color.js.map b/public/assets/quill/formats/color.js.map new file mode 100644 index 0000000..2447994 --- /dev/null +++ b/public/assets/quill/formats/color.js.map @@ -0,0 +1 @@ +{"version":3,"file":"color.js","names":["ClassAttributor","Scope","StyleAttributor","ColorAttributor","value","domNode","startsWith","replace","hex","split","map","component","parseInt","toString","slice","join","ColorClass","scope","INLINE","ColorStyle"],"sources":["../../src/formats/color.ts"],"sourcesContent":["import { ClassAttributor, Scope, StyleAttributor } from 'parchment';\n\nclass ColorAttributor extends StyleAttributor {\n value(domNode: HTMLElement) {\n let value = super.value(domNode) as string;\n if (!value.startsWith('rgb(')) return value;\n value = value.replace(/^[^\\d]+/, '').replace(/[^\\d]+$/, '');\n const hex = value\n .split(',')\n .map((component) => `00${parseInt(component, 10).toString(16)}`.slice(-2))\n .join('');\n return `#${hex}`;\n }\n}\n\nconst ColorClass = new ClassAttributor('color', 'ql-color', {\n scope: Scope.INLINE,\n});\nconst ColorStyle = new ColorAttributor('color', 'color', {\n scope: Scope.INLINE,\n});\n\nexport { ColorAttributor, ColorClass, ColorStyle };\n"],"mappings":"AAAA,SAASA,eAAe,EAAEC,KAAK,EAAEC,eAAe,QAAQ,WAAW;AAEnE,MAAMC,eAAe,SAASD,eAAe,CAAC;EAC5CE,KAAKA,CAACC,OAAoB,EAAE;IAC1B,IAAID,KAAK,GAAG,KAAK,CAACA,KAAK,CAACC,OAAO,CAAW;IAC1C,IAAI,CAACD,KAAK,CAACE,UAAU,CAAC,MAAM,CAAC,EAAE,OAAOF,KAAK;IAC3CA,KAAK,GAAGA,KAAK,CAACG,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAACA,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC;IAC3D,MAAMC,GAAG,GAAGJ,KAAK,CACdK,KAAK,CAAC,GAAG,CAAC,CACVC,GAAG,CAAEC,SAAS,IAAM,KAAIC,QAAQ,CAACD,SAAS,EAAE,EAAE,CAAC,CAACE,QAAQ,CAAC,EAAE,CAAE,EAAC,CAACC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CACzEC,IAAI,CAAC,EAAE,CAAC;IACX,OAAQ,IAAGP,GAAI,EAAC;EAClB;AACF;AAEA,MAAMQ,UAAU,GAAG,IAAIhB,eAAe,CAAC,OAAO,EAAE,UAAU,EAAE;EAC1DiB,KAAK,EAAEhB,KAAK,CAACiB;AACf,CAAC,CAAC;AACF,MAAMC,UAAU,GAAG,IAAIhB,eAAe,CAAC,OAAO,EAAE,OAAO,EAAE;EACvDc,KAAK,EAAEhB,KAAK,CAACiB;AACf,CAAC,CAAC;AAEF,SAASf,eAAe,EAAEa,UAAU,EAAEG,UAAU","ignoreList":[]} \ No newline at end of file diff --git a/public/assets/quill/formats/direction.d.ts b/public/assets/quill/formats/direction.d.ts new file mode 100644 index 0000000..b4bdae6 --- /dev/null +++ b/public/assets/quill/formats/direction.d.ts @@ -0,0 +1,5 @@ +import { Attributor, ClassAttributor, StyleAttributor } from 'parchment'; +declare const DirectionAttribute: Attributor; +declare const DirectionClass: ClassAttributor; +declare const DirectionStyle: StyleAttributor; +export { DirectionAttribute, DirectionClass, DirectionStyle }; diff --git a/public/assets/quill/formats/direction.js b/public/assets/quill/formats/direction.js new file mode 100644 index 0000000..ac31944 --- /dev/null +++ b/public/assets/quill/formats/direction.js @@ -0,0 +1,10 @@ +import { Attributor, ClassAttributor, Scope, StyleAttributor } from 'parchment'; +const config = { + scope: Scope.BLOCK, + whitelist: ['rtl'] +}; +const DirectionAttribute = new Attributor('direction', 'dir', config); +const DirectionClass = new ClassAttributor('direction', 'ql-direction', config); +const DirectionStyle = new StyleAttributor('direction', 'direction', config); +export { DirectionAttribute, DirectionClass, DirectionStyle }; +//# sourceMappingURL=direction.js.map \ No newline at end of file diff --git a/public/assets/quill/formats/direction.js.map b/public/assets/quill/formats/direction.js.map new file mode 100644 index 0000000..5ccd652 --- /dev/null +++ b/public/assets/quill/formats/direction.js.map @@ -0,0 +1 @@ +{"version":3,"file":"direction.js","names":["Attributor","ClassAttributor","Scope","StyleAttributor","config","scope","BLOCK","whitelist","DirectionAttribute","DirectionClass","DirectionStyle"],"sources":["../../src/formats/direction.ts"],"sourcesContent":["import { Attributor, ClassAttributor, Scope, StyleAttributor } from 'parchment';\n\nconst config = {\n scope: Scope.BLOCK,\n whitelist: ['rtl'],\n};\n\nconst DirectionAttribute = new Attributor('direction', 'dir', config);\nconst DirectionClass = new ClassAttributor('direction', 'ql-direction', config);\nconst DirectionStyle = new StyleAttributor('direction', 'direction', config);\n\nexport { DirectionAttribute, DirectionClass, DirectionStyle };\n"],"mappings":"AAAA,SAASA,UAAU,EAAEC,eAAe,EAAEC,KAAK,EAAEC,eAAe,QAAQ,WAAW;AAE/E,MAAMC,MAAM,GAAG;EACbC,KAAK,EAAEH,KAAK,CAACI,KAAK;EAClBC,SAAS,EAAE,CAAC,KAAK;AACnB,CAAC;AAED,MAAMC,kBAAkB,GAAG,IAAIR,UAAU,CAAC,WAAW,EAAE,KAAK,EAAEI,MAAM,CAAC;AACrE,MAAMK,cAAc,GAAG,IAAIR,eAAe,CAAC,WAAW,EAAE,cAAc,EAAEG,MAAM,CAAC;AAC/E,MAAMM,cAAc,GAAG,IAAIP,eAAe,CAAC,WAAW,EAAE,WAAW,EAAEC,MAAM,CAAC;AAE5E,SAASI,kBAAkB,EAAEC,cAAc,EAAEC,cAAc","ignoreList":[]} \ No newline at end of file diff --git a/public/assets/quill/formats/font.d.ts b/public/assets/quill/formats/font.d.ts new file mode 100644 index 0000000..0edd8aa --- /dev/null +++ b/public/assets/quill/formats/font.d.ts @@ -0,0 +1,7 @@ +import { ClassAttributor, StyleAttributor } from 'parchment'; +declare const FontClass: ClassAttributor; +declare class FontStyleAttributor extends StyleAttributor { + value(node: HTMLElement): any; +} +declare const FontStyle: FontStyleAttributor; +export { FontStyle, FontClass }; diff --git a/public/assets/quill/formats/font.js b/public/assets/quill/formats/font.js new file mode 100644 index 0000000..e858fb0 --- /dev/null +++ b/public/assets/quill/formats/font.js @@ -0,0 +1,14 @@ +import { ClassAttributor, Scope, StyleAttributor } from 'parchment'; +const config = { + scope: Scope.INLINE, + whitelist: ['serif', 'monospace'] +}; +const FontClass = new ClassAttributor('font', 'ql-font', config); +class FontStyleAttributor extends StyleAttributor { + value(node) { + return super.value(node).replace(/["']/g, ''); + } +} +const FontStyle = new FontStyleAttributor('font', 'font-family', config); +export { FontStyle, FontClass }; +//# sourceMappingURL=font.js.map \ No newline at end of file diff --git a/public/assets/quill/formats/font.js.map b/public/assets/quill/formats/font.js.map new file mode 100644 index 0000000..3d72d1b --- /dev/null +++ b/public/assets/quill/formats/font.js.map @@ -0,0 +1 @@ +{"version":3,"file":"font.js","names":["ClassAttributor","Scope","StyleAttributor","config","scope","INLINE","whitelist","FontClass","FontStyleAttributor","value","node","replace","FontStyle"],"sources":["../../src/formats/font.ts"],"sourcesContent":["import { ClassAttributor, Scope, StyleAttributor } from 'parchment';\n\nconst config = {\n scope: Scope.INLINE,\n whitelist: ['serif', 'monospace'],\n};\n\nconst FontClass = new ClassAttributor('font', 'ql-font', config);\n\nclass FontStyleAttributor extends StyleAttributor {\n value(node: HTMLElement) {\n return super.value(node).replace(/[\"']/g, '');\n }\n}\n\nconst FontStyle = new FontStyleAttributor('font', 'font-family', config);\n\nexport { FontStyle, FontClass };\n"],"mappings":"AAAA,SAASA,eAAe,EAAEC,KAAK,EAAEC,eAAe,QAAQ,WAAW;AAEnE,MAAMC,MAAM,GAAG;EACbC,KAAK,EAAEH,KAAK,CAACI,MAAM;EACnBC,SAAS,EAAE,CAAC,OAAO,EAAE,WAAW;AAClC,CAAC;AAED,MAAMC,SAAS,GAAG,IAAIP,eAAe,CAAC,MAAM,EAAE,SAAS,EAAEG,MAAM,CAAC;AAEhE,MAAMK,mBAAmB,SAASN,eAAe,CAAC;EAChDO,KAAKA,CAACC,IAAiB,EAAE;IACvB,OAAO,KAAK,CAACD,KAAK,CAACC,IAAI,CAAC,CAACC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;EAC/C;AACF;AAEA,MAAMC,SAAS,GAAG,IAAIJ,mBAAmB,CAAC,MAAM,EAAE,aAAa,EAAEL,MAAM,CAAC;AAExE,SAASS,SAAS,EAAEL,SAAS","ignoreList":[]} \ No newline at end of file diff --git a/public/assets/quill/formats/formula.d.ts b/public/assets/quill/formats/formula.d.ts new file mode 100644 index 0000000..f6f3540 --- /dev/null +++ b/public/assets/quill/formats/formula.d.ts @@ -0,0 +1,10 @@ +import Embed from '../blots/embed.js'; +declare class Formula extends Embed { + static blotName: string; + static className: string; + static tagName: string; + static create(value: string): Element; + static value(domNode: Element): string | null; + html(): string; +} +export default Formula; diff --git a/public/assets/quill/formats/formula.js b/public/assets/quill/formats/formula.js new file mode 100644 index 0000000..1c1b1a5 --- /dev/null +++ b/public/assets/quill/formats/formula.js @@ -0,0 +1,33 @@ +import Embed from '../blots/embed.js'; +class Formula extends Embed { + static blotName = 'formula'; + static className = 'ql-formula'; + static tagName = 'SPAN'; + static create(value) { + // @ts-expect-error + if (window.katex == null) { + throw new Error('Formula module requires KaTeX.'); + } + const node = super.create(value); + if (typeof value === 'string') { + // @ts-expect-error + window.katex.render(value, node, { + throwOnError: false, + errorColor: '#f00' + }); + node.setAttribute('data-value', value); + } + return node; + } + static value(domNode) { + return domNode.getAttribute('data-value'); + } + html() { + const { + formula + } = this.value(); + return `${formula}`; + } +} +export default Formula; +//# sourceMappingURL=formula.js.map \ No newline at end of file diff --git a/public/assets/quill/formats/formula.js.map b/public/assets/quill/formats/formula.js.map new file mode 100644 index 0000000..8c13f39 --- /dev/null +++ b/public/assets/quill/formats/formula.js.map @@ -0,0 +1 @@ +{"version":3,"file":"formula.js","names":["Embed","Formula","blotName","className","tagName","create","value","window","katex","Error","node","render","throwOnError","errorColor","setAttribute","domNode","getAttribute","html","formula"],"sources":["../../src/formats/formula.ts"],"sourcesContent":["import Embed from '../blots/embed.js';\n\nclass Formula extends Embed {\n static blotName = 'formula';\n static className = 'ql-formula';\n static tagName = 'SPAN';\n\n static create(value: string) {\n // @ts-expect-error\n if (window.katex == null) {\n throw new Error('Formula module requires KaTeX.');\n }\n const node = super.create(value) as Element;\n if (typeof value === 'string') {\n // @ts-expect-error\n window.katex.render(value, node, {\n throwOnError: false,\n errorColor: '#f00',\n });\n node.setAttribute('data-value', value);\n }\n return node;\n }\n\n static value(domNode: Element) {\n return domNode.getAttribute('data-value');\n }\n\n html() {\n const { formula } = this.value();\n return `${formula}`;\n }\n}\n\nexport default Formula;\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,mBAAmB;AAErC,MAAMC,OAAO,SAASD,KAAK,CAAC;EAC1B,OAAOE,QAAQ,GAAG,SAAS;EAC3B,OAAOC,SAAS,GAAG,YAAY;EAC/B,OAAOC,OAAO,GAAG,MAAM;EAEvB,OAAOC,MAAMA,CAACC,KAAa,EAAE;IAC3B;IACA,IAAIC,MAAM,CAACC,KAAK,IAAI,IAAI,EAAE;MACxB,MAAM,IAAIC,KAAK,CAAC,gCAAgC,CAAC;IACnD;IACA,MAAMC,IAAI,GAAG,KAAK,CAACL,MAAM,CAACC,KAAK,CAAY;IAC3C,IAAI,OAAOA,KAAK,KAAK,QAAQ,EAAE;MAC7B;MACAC,MAAM,CAACC,KAAK,CAACG,MAAM,CAACL,KAAK,EAAEI,IAAI,EAAE;QAC/BE,YAAY,EAAE,KAAK;QACnBC,UAAU,EAAE;MACd,CAAC,CAAC;MACFH,IAAI,CAACI,YAAY,CAAC,YAAY,EAAER,KAAK,CAAC;IACxC;IACA,OAAOI,IAAI;EACb;EAEA,OAAOJ,KAAKA,CAACS,OAAgB,EAAE;IAC7B,OAAOA,OAAO,CAACC,YAAY,CAAC,YAAY,CAAC;EAC3C;EAEAC,IAAIA,CAAA,EAAG;IACL,MAAM;MAAEC;IAAQ,CAAC,GAAG,IAAI,CAACZ,KAAK,CAAC,CAAC;IAChC,OAAQ,SAAQY,OAAQ,SAAQ;EAClC;AACF;AAEA,eAAejB,OAAO","ignoreList":[]} \ No newline at end of file diff --git a/public/assets/quill/formats/header.d.ts b/public/assets/quill/formats/header.d.ts new file mode 100644 index 0000000..3e13bfa --- /dev/null +++ b/public/assets/quill/formats/header.d.ts @@ -0,0 +1,7 @@ +import Block from '../blots/block.js'; +declare class Header extends Block { + static blotName: string; + static tagName: string[]; + static formats(domNode: Element): number; +} +export default Header; diff --git a/public/assets/quill/formats/header.js b/public/assets/quill/formats/header.js new file mode 100644 index 0000000..c18c522 --- /dev/null +++ b/public/assets/quill/formats/header.js @@ -0,0 +1,10 @@ +import Block from '../blots/block.js'; +class Header extends Block { + static blotName = 'header'; + static tagName = ['H1', 'H2', 'H3', 'H4', 'H5', 'H6']; + static formats(domNode) { + return this.tagName.indexOf(domNode.tagName) + 1; + } +} +export default Header; +//# sourceMappingURL=header.js.map \ No newline at end of file diff --git a/public/assets/quill/formats/header.js.map b/public/assets/quill/formats/header.js.map new file mode 100644 index 0000000..e44c80b --- /dev/null +++ b/public/assets/quill/formats/header.js.map @@ -0,0 +1 @@ +{"version":3,"file":"header.js","names":["Block","Header","blotName","tagName","formats","domNode","indexOf"],"sources":["../../src/formats/header.ts"],"sourcesContent":["import Block from '../blots/block.js';\n\nclass Header extends Block {\n static blotName = 'header';\n static tagName = ['H1', 'H2', 'H3', 'H4', 'H5', 'H6'];\n\n static formats(domNode: Element) {\n return this.tagName.indexOf(domNode.tagName) + 1;\n }\n}\n\nexport default Header;\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,mBAAmB;AAErC,MAAMC,MAAM,SAASD,KAAK,CAAC;EACzB,OAAOE,QAAQ,GAAG,QAAQ;EAC1B,OAAOC,OAAO,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;EAErD,OAAOC,OAAOA,CAACC,OAAgB,EAAE;IAC/B,OAAO,IAAI,CAACF,OAAO,CAACG,OAAO,CAACD,OAAO,CAACF,OAAO,CAAC,GAAG,CAAC;EAClD;AACF;AAEA,eAAeF,MAAM","ignoreList":[]} \ No newline at end of file diff --git a/public/assets/quill/formats/image.d.ts b/public/assets/quill/formats/image.d.ts new file mode 100644 index 0000000..2fa0166 --- /dev/null +++ b/public/assets/quill/formats/image.d.ts @@ -0,0 +1,13 @@ +import { EmbedBlot } from 'parchment'; +declare class Image extends EmbedBlot { + static blotName: string; + static tagName: string; + static create(value: string): Element; + static formats(domNode: Element): Record; + static match(url: string): boolean; + static sanitize(url: string): string; + static value(domNode: Element): string | null; + domNode: HTMLImageElement; + format(name: string, value: string): void; +} +export default Image; diff --git a/public/assets/quill/formats/image.js b/public/assets/quill/formats/image.js new file mode 100644 index 0000000..c047886 --- /dev/null +++ b/public/assets/quill/formats/image.js @@ -0,0 +1,44 @@ +import { EmbedBlot } from 'parchment'; +import { sanitize } from './link.js'; +const ATTRIBUTES = ['alt', 'height', 'width']; +class Image extends EmbedBlot { + static blotName = 'image'; + static tagName = 'IMG'; + static create(value) { + const node = super.create(value); + if (typeof value === 'string') { + node.setAttribute('src', this.sanitize(value)); + } + return node; + } + static formats(domNode) { + return ATTRIBUTES.reduce((formats, attribute) => { + if (domNode.hasAttribute(attribute)) { + formats[attribute] = domNode.getAttribute(attribute); + } + return formats; + }, {}); + } + static match(url) { + return /\.(jpe?g|gif|png)$/.test(url) || /^data:image\/.+;base64/.test(url); + } + static sanitize(url) { + return sanitize(url, ['http', 'https', 'data']) ? url : '//:0'; + } + static value(domNode) { + return domNode.getAttribute('src'); + } + format(name, value) { + if (ATTRIBUTES.indexOf(name) > -1) { + if (value) { + this.domNode.setAttribute(name, value); + } else { + this.domNode.removeAttribute(name); + } + } else { + super.format(name, value); + } + } +} +export default Image; +//# sourceMappingURL=image.js.map \ No newline at end of file diff --git a/public/assets/quill/formats/image.js.map b/public/assets/quill/formats/image.js.map new file mode 100644 index 0000000..8603008 --- /dev/null +++ b/public/assets/quill/formats/image.js.map @@ -0,0 +1 @@ +{"version":3,"file":"image.js","names":["EmbedBlot","sanitize","ATTRIBUTES","Image","blotName","tagName","create","value","node","setAttribute","formats","domNode","reduce","attribute","hasAttribute","getAttribute","match","url","test","format","name","indexOf","removeAttribute"],"sources":["../../src/formats/image.ts"],"sourcesContent":["import { EmbedBlot } from 'parchment';\nimport { sanitize } from './link.js';\n\nconst ATTRIBUTES = ['alt', 'height', 'width'];\n\nclass Image extends EmbedBlot {\n static blotName = 'image';\n static tagName = 'IMG';\n\n static create(value: string) {\n const node = super.create(value) as Element;\n if (typeof value === 'string') {\n node.setAttribute('src', this.sanitize(value));\n }\n return node;\n }\n\n static formats(domNode: Element) {\n return ATTRIBUTES.reduce(\n (formats: Record, attribute) => {\n if (domNode.hasAttribute(attribute)) {\n formats[attribute] = domNode.getAttribute(attribute);\n }\n return formats;\n },\n {},\n );\n }\n\n static match(url: string) {\n return /\\.(jpe?g|gif|png)$/.test(url) || /^data:image\\/.+;base64/.test(url);\n }\n\n static sanitize(url: string) {\n return sanitize(url, ['http', 'https', 'data']) ? url : '//:0';\n }\n\n static value(domNode: Element) {\n return domNode.getAttribute('src');\n }\n\n domNode: HTMLImageElement;\n\n format(name: string, value: string) {\n if (ATTRIBUTES.indexOf(name) > -1) {\n if (value) {\n this.domNode.setAttribute(name, value);\n } else {\n this.domNode.removeAttribute(name);\n }\n } else {\n super.format(name, value);\n }\n }\n}\n\nexport default Image;\n"],"mappings":"AAAA,SAASA,SAAS,QAAQ,WAAW;AACrC,SAASC,QAAQ,QAAQ,WAAW;AAEpC,MAAMC,UAAU,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,CAAC;AAE7C,MAAMC,KAAK,SAASH,SAAS,CAAC;EAC5B,OAAOI,QAAQ,GAAG,OAAO;EACzB,OAAOC,OAAO,GAAG,KAAK;EAEtB,OAAOC,MAAMA,CAACC,KAAa,EAAE;IAC3B,MAAMC,IAAI,GAAG,KAAK,CAACF,MAAM,CAACC,KAAK,CAAY;IAC3C,IAAI,OAAOA,KAAK,KAAK,QAAQ,EAAE;MAC7BC,IAAI,CAACC,YAAY,CAAC,KAAK,EAAE,IAAI,CAACR,QAAQ,CAACM,KAAK,CAAC,CAAC;IAChD;IACA,OAAOC,IAAI;EACb;EAEA,OAAOE,OAAOA,CAACC,OAAgB,EAAE;IAC/B,OAAOT,UAAU,CAACU,MAAM,CACtB,CAACF,OAAsC,EAAEG,SAAS,KAAK;MACrD,IAAIF,OAAO,CAACG,YAAY,CAACD,SAAS,CAAC,EAAE;QACnCH,OAAO,CAACG,SAAS,CAAC,GAAGF,OAAO,CAACI,YAAY,CAACF,SAAS,CAAC;MACtD;MACA,OAAOH,OAAO;IAChB,CAAC,EACD,CAAC,CACH,CAAC;EACH;EAEA,OAAOM,KAAKA,CAACC,GAAW,EAAE;IACxB,OAAO,oBAAoB,CAACC,IAAI,CAACD,GAAG,CAAC,IAAI,wBAAwB,CAACC,IAAI,CAACD,GAAG,CAAC;EAC7E;EAEA,OAAOhB,QAAQA,CAACgB,GAAW,EAAE;IAC3B,OAAOhB,QAAQ,CAACgB,GAAG,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,GAAGA,GAAG,GAAG,MAAM;EAChE;EAEA,OAAOV,KAAKA,CAACI,OAAgB,EAAE;IAC7B,OAAOA,OAAO,CAACI,YAAY,CAAC,KAAK,CAAC;EACpC;EAIAI,MAAMA,CAACC,IAAY,EAAEb,KAAa,EAAE;IAClC,IAAIL,UAAU,CAACmB,OAAO,CAACD,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE;MACjC,IAAIb,KAAK,EAAE;QACT,IAAI,CAACI,OAAO,CAACF,YAAY,CAACW,IAAI,EAAEb,KAAK,CAAC;MACxC,CAAC,MAAM;QACL,IAAI,CAACI,OAAO,CAACW,eAAe,CAACF,IAAI,CAAC;MACpC;IACF,CAAC,MAAM;MACL,KAAK,CAACD,MAAM,CAACC,IAAI,EAAEb,KAAK,CAAC;IAC3B;EACF;AACF;AAEA,eAAeJ,KAAK","ignoreList":[]} \ No newline at end of file diff --git a/public/assets/quill/formats/indent.d.ts b/public/assets/quill/formats/indent.d.ts new file mode 100644 index 0000000..8bdd902 --- /dev/null +++ b/public/assets/quill/formats/indent.d.ts @@ -0,0 +1,8 @@ +import { ClassAttributor } from 'parchment'; +declare class IndentAttributor extends ClassAttributor { + add(node: HTMLElement, value: string | number): boolean; + canAdd(node: HTMLElement, value: string): boolean; + value(node: HTMLElement): number | undefined; +} +declare const IndentClass: IndentAttributor; +export default IndentClass; diff --git a/public/assets/quill/formats/indent.js b/public/assets/quill/formats/indent.js new file mode 100644 index 0000000..0a76cb1 --- /dev/null +++ b/public/assets/quill/formats/indent.js @@ -0,0 +1,30 @@ +import { ClassAttributor, Scope } from 'parchment'; +class IndentAttributor extends ClassAttributor { + add(node, value) { + let normalizedValue = 0; + if (value === '+1' || value === '-1') { + const indent = this.value(node) || 0; + normalizedValue = value === '+1' ? indent + 1 : indent - 1; + } else if (typeof value === 'number') { + normalizedValue = value; + } + if (normalizedValue === 0) { + this.remove(node); + return true; + } + return super.add(node, normalizedValue.toString()); + } + canAdd(node, value) { + return super.canAdd(node, value) || super.canAdd(node, parseInt(value, 10)); + } + value(node) { + return parseInt(super.value(node), 10) || undefined; // Don't return NaN + } +} +const IndentClass = new IndentAttributor('indent', 'ql-indent', { + scope: Scope.BLOCK, + // @ts-expect-error + whitelist: [1, 2, 3, 4, 5, 6, 7, 8] +}); +export default IndentClass; +//# sourceMappingURL=indent.js.map \ No newline at end of file diff --git a/public/assets/quill/formats/indent.js.map b/public/assets/quill/formats/indent.js.map new file mode 100644 index 0000000..c038b3f --- /dev/null +++ b/public/assets/quill/formats/indent.js.map @@ -0,0 +1 @@ +{"version":3,"file":"indent.js","names":["ClassAttributor","Scope","IndentAttributor","add","node","value","normalizedValue","indent","remove","toString","canAdd","parseInt","undefined","IndentClass","scope","BLOCK","whitelist"],"sources":["../../src/formats/indent.ts"],"sourcesContent":["import { ClassAttributor, Scope } from 'parchment';\n\nclass IndentAttributor extends ClassAttributor {\n add(node: HTMLElement, value: string | number) {\n let normalizedValue = 0;\n if (value === '+1' || value === '-1') {\n const indent = this.value(node) || 0;\n normalizedValue = value === '+1' ? indent + 1 : indent - 1;\n } else if (typeof value === 'number') {\n normalizedValue = value;\n }\n if (normalizedValue === 0) {\n this.remove(node);\n return true;\n }\n return super.add(node, normalizedValue.toString());\n }\n\n canAdd(node: HTMLElement, value: string) {\n return super.canAdd(node, value) || super.canAdd(node, parseInt(value, 10));\n }\n\n value(node: HTMLElement) {\n return parseInt(super.value(node), 10) || undefined; // Don't return NaN\n }\n}\n\nconst IndentClass = new IndentAttributor('indent', 'ql-indent', {\n scope: Scope.BLOCK,\n // @ts-expect-error\n whitelist: [1, 2, 3, 4, 5, 6, 7, 8],\n});\n\nexport default IndentClass;\n"],"mappings":"AAAA,SAASA,eAAe,EAAEC,KAAK,QAAQ,WAAW;AAElD,MAAMC,gBAAgB,SAASF,eAAe,CAAC;EAC7CG,GAAGA,CAACC,IAAiB,EAAEC,KAAsB,EAAE;IAC7C,IAAIC,eAAe,GAAG,CAAC;IACvB,IAAID,KAAK,KAAK,IAAI,IAAIA,KAAK,KAAK,IAAI,EAAE;MACpC,MAAME,MAAM,GAAG,IAAI,CAACF,KAAK,CAACD,IAAI,CAAC,IAAI,CAAC;MACpCE,eAAe,GAAGD,KAAK,KAAK,IAAI,GAAGE,MAAM,GAAG,CAAC,GAAGA,MAAM,GAAG,CAAC;IAC5D,CAAC,MAAM,IAAI,OAAOF,KAAK,KAAK,QAAQ,EAAE;MACpCC,eAAe,GAAGD,KAAK;IACzB;IACA,IAAIC,eAAe,KAAK,CAAC,EAAE;MACzB,IAAI,CAACE,MAAM,CAACJ,IAAI,CAAC;MACjB,OAAO,IAAI;IACb;IACA,OAAO,KAAK,CAACD,GAAG,CAACC,IAAI,EAAEE,eAAe,CAACG,QAAQ,CAAC,CAAC,CAAC;EACpD;EAEAC,MAAMA,CAACN,IAAiB,EAAEC,KAAa,EAAE;IACvC,OAAO,KAAK,CAACK,MAAM,CAACN,IAAI,EAAEC,KAAK,CAAC,IAAI,KAAK,CAACK,MAAM,CAACN,IAAI,EAAEO,QAAQ,CAACN,KAAK,EAAE,EAAE,CAAC,CAAC;EAC7E;EAEAA,KAAKA,CAACD,IAAiB,EAAE;IACvB,OAAOO,QAAQ,CAAC,KAAK,CAACN,KAAK,CAACD,IAAI,CAAC,EAAE,EAAE,CAAC,IAAIQ,SAAS,CAAC,CAAC;EACvD;AACF;AAEA,MAAMC,WAAW,GAAG,IAAIX,gBAAgB,CAAC,QAAQ,EAAE,WAAW,EAAE;EAC9DY,KAAK,EAAEb,KAAK,CAACc,KAAK;EAClB;EACAC,SAAS,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;AACpC,CAAC,CAAC;AAEF,eAAeH,WAAW","ignoreList":[]} \ No newline at end of file diff --git a/public/assets/quill/formats/italic.d.ts b/public/assets/quill/formats/italic.d.ts new file mode 100644 index 0000000..341a15d --- /dev/null +++ b/public/assets/quill/formats/italic.d.ts @@ -0,0 +1,6 @@ +import Bold from './bold.js'; +declare class Italic extends Bold { + static blotName: string; + static tagName: string[]; +} +export default Italic; diff --git a/public/assets/quill/formats/italic.js b/public/assets/quill/formats/italic.js new file mode 100644 index 0000000..96d6de3 --- /dev/null +++ b/public/assets/quill/formats/italic.js @@ -0,0 +1,7 @@ +import Bold from './bold.js'; +class Italic extends Bold { + static blotName = 'italic'; + static tagName = ['EM', 'I']; +} +export default Italic; +//# sourceMappingURL=italic.js.map \ No newline at end of file diff --git a/public/assets/quill/formats/italic.js.map b/public/assets/quill/formats/italic.js.map new file mode 100644 index 0000000..6f067f4 --- /dev/null +++ b/public/assets/quill/formats/italic.js.map @@ -0,0 +1 @@ +{"version":3,"file":"italic.js","names":["Bold","Italic","blotName","tagName"],"sources":["../../src/formats/italic.ts"],"sourcesContent":["import Bold from './bold.js';\n\nclass Italic extends Bold {\n static blotName = 'italic';\n static tagName = ['EM', 'I'];\n}\n\nexport default Italic;\n"],"mappings":"AAAA,OAAOA,IAAI,MAAM,WAAW;AAE5B,MAAMC,MAAM,SAASD,IAAI,CAAC;EACxB,OAAOE,QAAQ,GAAG,QAAQ;EAC1B,OAAOC,OAAO,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC;AAC9B;AAEA,eAAeF,MAAM","ignoreList":[]} \ No newline at end of file diff --git a/public/assets/quill/formats/link.d.ts b/public/assets/quill/formats/link.d.ts new file mode 100644 index 0000000..a8e4f2d --- /dev/null +++ b/public/assets/quill/formats/link.d.ts @@ -0,0 +1,13 @@ +import Inline from '../blots/inline.js'; +declare class Link extends Inline { + static blotName: string; + static tagName: string; + static SANITIZED_URL: string; + static PROTOCOL_WHITELIST: string[]; + static create(value: string): HTMLElement; + static formats(domNode: HTMLElement): string | null; + static sanitize(url: string): string; + format(name: string, value: unknown): void; +} +declare function sanitize(url: string, protocols: string[]): boolean; +export { Link as default, sanitize }; diff --git a/public/assets/quill/formats/link.js b/public/assets/quill/formats/link.js new file mode 100644 index 0000000..57be4bf --- /dev/null +++ b/public/assets/quill/formats/link.js @@ -0,0 +1,36 @@ +import Inline from '../blots/inline.js'; +class Link extends Inline { + static blotName = 'link'; + static tagName = 'A'; + static SANITIZED_URL = 'about:blank'; + static PROTOCOL_WHITELIST = ['http', 'https', 'mailto', 'tel', 'sms']; + static create(value) { + const node = super.create(value); + node.setAttribute('href', this.sanitize(value)); + node.setAttribute('rel', 'noopener noreferrer'); + node.setAttribute('target', '_blank'); + return node; + } + static formats(domNode) { + return domNode.getAttribute('href'); + } + static sanitize(url) { + return sanitize(url, this.PROTOCOL_WHITELIST) ? url : this.SANITIZED_URL; + } + format(name, value) { + if (name !== this.statics.blotName || !value) { + super.format(name, value); + } else { + // @ts-expect-error + this.domNode.setAttribute('href', this.constructor.sanitize(value)); + } + } +} +function sanitize(url, protocols) { + const anchor = document.createElement('a'); + anchor.href = url; + const protocol = anchor.href.slice(0, anchor.href.indexOf(':')); + return protocols.indexOf(protocol) > -1; +} +export { Link as default, sanitize }; +//# sourceMappingURL=link.js.map \ No newline at end of file diff --git a/public/assets/quill/formats/link.js.map b/public/assets/quill/formats/link.js.map new file mode 100644 index 0000000..6935698 --- /dev/null +++ b/public/assets/quill/formats/link.js.map @@ -0,0 +1 @@ +{"version":3,"file":"link.js","names":["Inline","Link","blotName","tagName","SANITIZED_URL","PROTOCOL_WHITELIST","create","value","node","setAttribute","sanitize","formats","domNode","getAttribute","url","format","name","statics","constructor","protocols","anchor","document","createElement","href","protocol","slice","indexOf","default"],"sources":["../../src/formats/link.ts"],"sourcesContent":["import Inline from '../blots/inline.js';\n\nclass Link extends Inline {\n static blotName = 'link';\n static tagName = 'A';\n static SANITIZED_URL = 'about:blank';\n static PROTOCOL_WHITELIST = ['http', 'https', 'mailto', 'tel', 'sms'];\n\n static create(value: string) {\n const node = super.create(value) as HTMLElement;\n node.setAttribute('href', this.sanitize(value));\n node.setAttribute('rel', 'noopener noreferrer');\n node.setAttribute('target', '_blank');\n return node;\n }\n\n static formats(domNode: HTMLElement) {\n return domNode.getAttribute('href');\n }\n\n static sanitize(url: string) {\n return sanitize(url, this.PROTOCOL_WHITELIST) ? url : this.SANITIZED_URL;\n }\n\n format(name: string, value: unknown) {\n if (name !== this.statics.blotName || !value) {\n super.format(name, value);\n } else {\n // @ts-expect-error\n this.domNode.setAttribute('href', this.constructor.sanitize(value));\n }\n }\n}\n\nfunction sanitize(url: string, protocols: string[]) {\n const anchor = document.createElement('a');\n anchor.href = url;\n const protocol = anchor.href.slice(0, anchor.href.indexOf(':'));\n return protocols.indexOf(protocol) > -1;\n}\n\nexport { Link as default, sanitize };\n"],"mappings":"AAAA,OAAOA,MAAM,MAAM,oBAAoB;AAEvC,MAAMC,IAAI,SAASD,MAAM,CAAC;EACxB,OAAOE,QAAQ,GAAG,MAAM;EACxB,OAAOC,OAAO,GAAG,GAAG;EACpB,OAAOC,aAAa,GAAG,aAAa;EACpC,OAAOC,kBAAkB,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,CAAC;EAErE,OAAOC,MAAMA,CAACC,KAAa,EAAE;IAC3B,MAAMC,IAAI,GAAG,KAAK,CAACF,MAAM,CAACC,KAAK,CAAgB;IAC/CC,IAAI,CAACC,YAAY,CAAC,MAAM,EAAE,IAAI,CAACC,QAAQ,CAACH,KAAK,CAAC,CAAC;IAC/CC,IAAI,CAACC,YAAY,CAAC,KAAK,EAAE,qBAAqB,CAAC;IAC/CD,IAAI,CAACC,YAAY,CAAC,QAAQ,EAAE,QAAQ,CAAC;IACrC,OAAOD,IAAI;EACb;EAEA,OAAOG,OAAOA,CAACC,OAAoB,EAAE;IACnC,OAAOA,OAAO,CAACC,YAAY,CAAC,MAAM,CAAC;EACrC;EAEA,OAAOH,QAAQA,CAACI,GAAW,EAAE;IAC3B,OAAOJ,QAAQ,CAACI,GAAG,EAAE,IAAI,CAACT,kBAAkB,CAAC,GAAGS,GAAG,GAAG,IAAI,CAACV,aAAa;EAC1E;EAEAW,MAAMA,CAACC,IAAY,EAAET,KAAc,EAAE;IACnC,IAAIS,IAAI,KAAK,IAAI,CAACC,OAAO,CAACf,QAAQ,IAAI,CAACK,KAAK,EAAE;MAC5C,KAAK,CAACQ,MAAM,CAACC,IAAI,EAAET,KAAK,CAAC;IAC3B,CAAC,MAAM;MACL;MACA,IAAI,CAACK,OAAO,CAACH,YAAY,CAAC,MAAM,EAAE,IAAI,CAACS,WAAW,CAACR,QAAQ,CAACH,KAAK,CAAC,CAAC;IACrE;EACF;AACF;AAEA,SAASG,QAAQA,CAACI,GAAW,EAAEK,SAAmB,EAAE;EAClD,MAAMC,MAAM,GAAGC,QAAQ,CAACC,aAAa,CAAC,GAAG,CAAC;EAC1CF,MAAM,CAACG,IAAI,GAAGT,GAAG;EACjB,MAAMU,QAAQ,GAAGJ,MAAM,CAACG,IAAI,CAACE,KAAK,CAAC,CAAC,EAAEL,MAAM,CAACG,IAAI,CAACG,OAAO,CAAC,GAAG,CAAC,CAAC;EAC/D,OAAOP,SAAS,CAACO,OAAO,CAACF,QAAQ,CAAC,GAAG,CAAC,CAAC;AACzC;AAEA,SAASvB,IAAI,IAAI0B,OAAO,EAAEjB,QAAQ","ignoreList":[]} \ No newline at end of file diff --git a/public/assets/quill/formats/list.d.ts b/public/assets/quill/formats/list.d.ts new file mode 100644 index 0000000..dceecff --- /dev/null +++ b/public/assets/quill/formats/list.d.ts @@ -0,0 +1,13 @@ +import Block from '../blots/block.js'; +import Container from '../blots/container.js'; +import type Scroll from '../blots/scroll.js'; +declare class ListContainer extends Container { +} +declare class ListItem extends Block { + static create(value: string): HTMLElement; + static formats(domNode: HTMLElement): string | undefined; + static register(): void; + constructor(scroll: Scroll, domNode: HTMLElement); + format(name: string, value: string): void; +} +export { ListContainer, ListItem as default }; diff --git a/public/assets/quill/formats/list.js b/public/assets/quill/formats/list.js new file mode 100644 index 0000000..f0ba12e --- /dev/null +++ b/public/assets/quill/formats/list.js @@ -0,0 +1,50 @@ +import Block from '../blots/block.js'; +import Container from '../blots/container.js'; +import Quill from '../core/quill.js'; +class ListContainer extends Container {} +ListContainer.blotName = 'list-container'; +ListContainer.tagName = 'OL'; +class ListItem extends Block { + static create(value) { + const node = super.create(); + node.setAttribute('data-list', value); + return node; + } + static formats(domNode) { + return domNode.getAttribute('data-list') || undefined; + } + static register() { + Quill.register(ListContainer); + } + constructor(scroll, domNode) { + super(scroll, domNode); + const ui = domNode.ownerDocument.createElement('span'); + const listEventHandler = e => { + if (!scroll.isEnabled()) return; + const format = this.statics.formats(domNode, scroll); + if (format === 'checked') { + this.format('list', 'unchecked'); + e.preventDefault(); + } else if (format === 'unchecked') { + this.format('list', 'checked'); + e.preventDefault(); + } + }; + ui.addEventListener('mousedown', listEventHandler); + ui.addEventListener('touchstart', listEventHandler); + this.attachUI(ui); + } + format(name, value) { + if (name === this.statics.blotName && value) { + this.domNode.setAttribute('data-list', value); + } else { + super.format(name, value); + } + } +} +ListItem.blotName = 'list'; +ListItem.tagName = 'LI'; +ListContainer.allowedChildren = [ListItem]; +ListItem.requiredContainer = ListContainer; +export { ListContainer, ListItem as default }; +//# sourceMappingURL=list.js.map \ No newline at end of file diff --git a/public/assets/quill/formats/list.js.map b/public/assets/quill/formats/list.js.map new file mode 100644 index 0000000..6a9a8bd --- /dev/null +++ b/public/assets/quill/formats/list.js.map @@ -0,0 +1 @@ +{"version":3,"file":"list.js","names":["Block","Container","Quill","ListContainer","blotName","tagName","ListItem","create","value","node","setAttribute","formats","domNode","getAttribute","undefined","register","constructor","scroll","ui","ownerDocument","createElement","listEventHandler","e","isEnabled","format","statics","preventDefault","addEventListener","attachUI","name","allowedChildren","requiredContainer","default"],"sources":["../../src/formats/list.ts"],"sourcesContent":["import Block from '../blots/block.js';\nimport Container from '../blots/container.js';\nimport type Scroll from '../blots/scroll.js';\nimport Quill from '../core/quill.js';\n\nclass ListContainer extends Container {}\nListContainer.blotName = 'list-container';\nListContainer.tagName = 'OL';\n\nclass ListItem extends Block {\n static create(value: string) {\n const node = super.create() as HTMLElement;\n node.setAttribute('data-list', value);\n return node;\n }\n\n static formats(domNode: HTMLElement) {\n return domNode.getAttribute('data-list') || undefined;\n }\n\n static register() {\n Quill.register(ListContainer);\n }\n\n constructor(scroll: Scroll, domNode: HTMLElement) {\n super(scroll, domNode);\n const ui = domNode.ownerDocument.createElement('span');\n const listEventHandler = (e: Event) => {\n if (!scroll.isEnabled()) return;\n const format = this.statics.formats(domNode, scroll);\n if (format === 'checked') {\n this.format('list', 'unchecked');\n e.preventDefault();\n } else if (format === 'unchecked') {\n this.format('list', 'checked');\n e.preventDefault();\n }\n };\n ui.addEventListener('mousedown', listEventHandler);\n ui.addEventListener('touchstart', listEventHandler);\n this.attachUI(ui);\n }\n\n format(name: string, value: string) {\n if (name === this.statics.blotName && value) {\n this.domNode.setAttribute('data-list', value);\n } else {\n super.format(name, value);\n }\n }\n}\nListItem.blotName = 'list';\nListItem.tagName = 'LI';\n\nListContainer.allowedChildren = [ListItem];\nListItem.requiredContainer = ListContainer;\n\nexport { ListContainer, ListItem as default };\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,mBAAmB;AACrC,OAAOC,SAAS,MAAM,uBAAuB;AAE7C,OAAOC,KAAK,MAAM,kBAAkB;AAEpC,MAAMC,aAAa,SAASF,SAAS,CAAC;AACtCE,aAAa,CAACC,QAAQ,GAAG,gBAAgB;AACzCD,aAAa,CAACE,OAAO,GAAG,IAAI;AAE5B,MAAMC,QAAQ,SAASN,KAAK,CAAC;EAC3B,OAAOO,MAAMA,CAACC,KAAa,EAAE;IAC3B,MAAMC,IAAI,GAAG,KAAK,CAACF,MAAM,CAAC,CAAgB;IAC1CE,IAAI,CAACC,YAAY,CAAC,WAAW,EAAEF,KAAK,CAAC;IACrC,OAAOC,IAAI;EACb;EAEA,OAAOE,OAAOA,CAACC,OAAoB,EAAE;IACnC,OAAOA,OAAO,CAACC,YAAY,CAAC,WAAW,CAAC,IAAIC,SAAS;EACvD;EAEA,OAAOC,QAAQA,CAAA,EAAG;IAChBb,KAAK,CAACa,QAAQ,CAACZ,aAAa,CAAC;EAC/B;EAEAa,WAAWA,CAACC,MAAc,EAAEL,OAAoB,EAAE;IAChD,KAAK,CAACK,MAAM,EAAEL,OAAO,CAAC;IACtB,MAAMM,EAAE,GAAGN,OAAO,CAACO,aAAa,CAACC,aAAa,CAAC,MAAM,CAAC;IACtD,MAAMC,gBAAgB,GAAIC,CAAQ,IAAK;MACrC,IAAI,CAACL,MAAM,CAACM,SAAS,CAAC,CAAC,EAAE;MACzB,MAAMC,MAAM,GAAG,IAAI,CAACC,OAAO,CAACd,OAAO,CAACC,OAAO,EAAEK,MAAM,CAAC;MACpD,IAAIO,MAAM,KAAK,SAAS,EAAE;QACxB,IAAI,CAACA,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC;QAChCF,CAAC,CAACI,cAAc,CAAC,CAAC;MACpB,CAAC,MAAM,IAAIF,MAAM,KAAK,WAAW,EAAE;QACjC,IAAI,CAACA,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC;QAC9BF,CAAC,CAACI,cAAc,CAAC,CAAC;MACpB;IACF,CAAC;IACDR,EAAE,CAACS,gBAAgB,CAAC,WAAW,EAAEN,gBAAgB,CAAC;IAClDH,EAAE,CAACS,gBAAgB,CAAC,YAAY,EAAEN,gBAAgB,CAAC;IACnD,IAAI,CAACO,QAAQ,CAACV,EAAE,CAAC;EACnB;EAEAM,MAAMA,CAACK,IAAY,EAAErB,KAAa,EAAE;IAClC,IAAIqB,IAAI,KAAK,IAAI,CAACJ,OAAO,CAACrB,QAAQ,IAAII,KAAK,EAAE;MAC3C,IAAI,CAACI,OAAO,CAACF,YAAY,CAAC,WAAW,EAAEF,KAAK,CAAC;IAC/C,CAAC,MAAM;MACL,KAAK,CAACgB,MAAM,CAACK,IAAI,EAAErB,KAAK,CAAC;IAC3B;EACF;AACF;AACAF,QAAQ,CAACF,QAAQ,GAAG,MAAM;AAC1BE,QAAQ,CAACD,OAAO,GAAG,IAAI;AAEvBF,aAAa,CAAC2B,eAAe,GAAG,CAACxB,QAAQ,CAAC;AAC1CA,QAAQ,CAACyB,iBAAiB,GAAG5B,aAAa;AAE1C,SAASA,aAAa,EAAEG,QAAQ,IAAI0B,OAAO","ignoreList":[]} \ No newline at end of file diff --git a/public/assets/quill/formats/script.d.ts b/public/assets/quill/formats/script.d.ts new file mode 100644 index 0000000..e46b0bc --- /dev/null +++ b/public/assets/quill/formats/script.d.ts @@ -0,0 +1,8 @@ +import Inline from '../blots/inline.js'; +declare class Script extends Inline { + static blotName: string; + static tagName: string[]; + static create(value: 'super' | 'sub' | (string & {})): HTMLElement; + static formats(domNode: HTMLElement): "super" | "sub" | undefined; +} +export default Script; diff --git a/public/assets/quill/formats/script.js b/public/assets/quill/formats/script.js new file mode 100644 index 0000000..017d1dd --- /dev/null +++ b/public/assets/quill/formats/script.js @@ -0,0 +1,21 @@ +import Inline from '../blots/inline.js'; +class Script extends Inline { + static blotName = 'script'; + static tagName = ['SUB', 'SUP']; + static create(value) { + if (value === 'super') { + return document.createElement('sup'); + } + if (value === 'sub') { + return document.createElement('sub'); + } + return super.create(value); + } + static formats(domNode) { + if (domNode.tagName === 'SUB') return 'sub'; + if (domNode.tagName === 'SUP') return 'super'; + return undefined; + } +} +export default Script; +//# sourceMappingURL=script.js.map \ No newline at end of file diff --git a/public/assets/quill/formats/script.js.map b/public/assets/quill/formats/script.js.map new file mode 100644 index 0000000..7b19fd2 --- /dev/null +++ b/public/assets/quill/formats/script.js.map @@ -0,0 +1 @@ +{"version":3,"file":"script.js","names":["Inline","Script","blotName","tagName","create","value","document","createElement","formats","domNode","undefined"],"sources":["../../src/formats/script.ts"],"sourcesContent":["import Inline from '../blots/inline.js';\n\nclass Script extends Inline {\n static blotName = 'script';\n static tagName = ['SUB', 'SUP'];\n\n static create(value: 'super' | 'sub' | (string & {})) {\n if (value === 'super') {\n return document.createElement('sup');\n }\n if (value === 'sub') {\n return document.createElement('sub');\n }\n return super.create(value);\n }\n\n static formats(domNode: HTMLElement) {\n if (domNode.tagName === 'SUB') return 'sub';\n if (domNode.tagName === 'SUP') return 'super';\n return undefined;\n }\n}\n\nexport default Script;\n"],"mappings":"AAAA,OAAOA,MAAM,MAAM,oBAAoB;AAEvC,MAAMC,MAAM,SAASD,MAAM,CAAC;EAC1B,OAAOE,QAAQ,GAAG,QAAQ;EAC1B,OAAOC,OAAO,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC;EAE/B,OAAOC,MAAMA,CAACC,KAAsC,EAAE;IACpD,IAAIA,KAAK,KAAK,OAAO,EAAE;MACrB,OAAOC,QAAQ,CAACC,aAAa,CAAC,KAAK,CAAC;IACtC;IACA,IAAIF,KAAK,KAAK,KAAK,EAAE;MACnB,OAAOC,QAAQ,CAACC,aAAa,CAAC,KAAK,CAAC;IACtC;IACA,OAAO,KAAK,CAACH,MAAM,CAACC,KAAK,CAAC;EAC5B;EAEA,OAAOG,OAAOA,CAACC,OAAoB,EAAE;IACnC,IAAIA,OAAO,CAACN,OAAO,KAAK,KAAK,EAAE,OAAO,KAAK;IAC3C,IAAIM,OAAO,CAACN,OAAO,KAAK,KAAK,EAAE,OAAO,OAAO;IAC7C,OAAOO,SAAS;EAClB;AACF;AAEA,eAAeT,MAAM","ignoreList":[]} \ No newline at end of file diff --git a/public/assets/quill/formats/size.d.ts b/public/assets/quill/formats/size.d.ts new file mode 100644 index 0000000..52cd21e --- /dev/null +++ b/public/assets/quill/formats/size.d.ts @@ -0,0 +1,4 @@ +import { ClassAttributor, StyleAttributor } from 'parchment'; +declare const SizeClass: ClassAttributor; +declare const SizeStyle: StyleAttributor; +export { SizeClass, SizeStyle }; diff --git a/public/assets/quill/formats/size.js b/public/assets/quill/formats/size.js new file mode 100644 index 0000000..48dfda2 --- /dev/null +++ b/public/assets/quill/formats/size.js @@ -0,0 +1,11 @@ +import { ClassAttributor, Scope, StyleAttributor } from 'parchment'; +const SizeClass = new ClassAttributor('size', 'ql-size', { + scope: Scope.INLINE, + whitelist: ['small', 'large', 'huge'] +}); +const SizeStyle = new StyleAttributor('size', 'font-size', { + scope: Scope.INLINE, + whitelist: ['10px', '18px', '32px'] +}); +export { SizeClass, SizeStyle }; +//# sourceMappingURL=size.js.map \ No newline at end of file diff --git a/public/assets/quill/formats/size.js.map b/public/assets/quill/formats/size.js.map new file mode 100644 index 0000000..1e25575 --- /dev/null +++ b/public/assets/quill/formats/size.js.map @@ -0,0 +1 @@ +{"version":3,"file":"size.js","names":["ClassAttributor","Scope","StyleAttributor","SizeClass","scope","INLINE","whitelist","SizeStyle"],"sources":["../../src/formats/size.ts"],"sourcesContent":["import { ClassAttributor, Scope, StyleAttributor } from 'parchment';\n\nconst SizeClass = new ClassAttributor('size', 'ql-size', {\n scope: Scope.INLINE,\n whitelist: ['small', 'large', 'huge'],\n});\nconst SizeStyle = new StyleAttributor('size', 'font-size', {\n scope: Scope.INLINE,\n whitelist: ['10px', '18px', '32px'],\n});\n\nexport { SizeClass, SizeStyle };\n"],"mappings":"AAAA,SAASA,eAAe,EAAEC,KAAK,EAAEC,eAAe,QAAQ,WAAW;AAEnE,MAAMC,SAAS,GAAG,IAAIH,eAAe,CAAC,MAAM,EAAE,SAAS,EAAE;EACvDI,KAAK,EAAEH,KAAK,CAACI,MAAM;EACnBC,SAAS,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM;AACtC,CAAC,CAAC;AACF,MAAMC,SAAS,GAAG,IAAIL,eAAe,CAAC,MAAM,EAAE,WAAW,EAAE;EACzDE,KAAK,EAAEH,KAAK,CAACI,MAAM;EACnBC,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM;AACpC,CAAC,CAAC;AAEF,SAASH,SAAS,EAAEI,SAAS","ignoreList":[]} \ No newline at end of file diff --git a/public/assets/quill/formats/strike.d.ts b/public/assets/quill/formats/strike.d.ts new file mode 100644 index 0000000..dcb125d --- /dev/null +++ b/public/assets/quill/formats/strike.d.ts @@ -0,0 +1,6 @@ +import Bold from './bold.js'; +declare class Strike extends Bold { + static blotName: string; + static tagName: string[]; +} +export default Strike; diff --git a/public/assets/quill/formats/strike.js b/public/assets/quill/formats/strike.js new file mode 100644 index 0000000..1f1dd1b --- /dev/null +++ b/public/assets/quill/formats/strike.js @@ -0,0 +1,7 @@ +import Bold from './bold.js'; +class Strike extends Bold { + static blotName = 'strike'; + static tagName = ['S', 'STRIKE']; +} +export default Strike; +//# sourceMappingURL=strike.js.map \ No newline at end of file diff --git a/public/assets/quill/formats/strike.js.map b/public/assets/quill/formats/strike.js.map new file mode 100644 index 0000000..5c367e7 --- /dev/null +++ b/public/assets/quill/formats/strike.js.map @@ -0,0 +1 @@ +{"version":3,"file":"strike.js","names":["Bold","Strike","blotName","tagName"],"sources":["../../src/formats/strike.ts"],"sourcesContent":["import Bold from './bold.js';\n\nclass Strike extends Bold {\n static blotName = 'strike';\n static tagName = ['S', 'STRIKE'];\n}\n\nexport default Strike;\n"],"mappings":"AAAA,OAAOA,IAAI,MAAM,WAAW;AAE5B,MAAMC,MAAM,SAASD,IAAI,CAAC;EACxB,OAAOE,QAAQ,GAAG,QAAQ;EAC1B,OAAOC,OAAO,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC;AAClC;AAEA,eAAeF,MAAM","ignoreList":[]} \ No newline at end of file diff --git a/public/assets/quill/formats/table.d.ts b/public/assets/quill/formats/table.d.ts new file mode 100644 index 0000000..880b794 --- /dev/null +++ b/public/assets/quill/formats/table.d.ts @@ -0,0 +1,45 @@ +import type { LinkedList } from 'parchment'; +import Block from '../blots/block.js'; +import Container from '../blots/container.js'; +declare class TableCell extends Block { + static blotName: string; + static tagName: string; + static create(value: string): HTMLElement; + static formats(domNode: HTMLElement): string | null | undefined; + next: this | null; + cellOffset(): number; + format(name: string, value: string): void; + row(): TableRow; + rowOffset(): number; + table(): import("parchment").Parent; +} +declare class TableRow extends Container { + static blotName: string; + static tagName: string; + children: LinkedList; + next: this | null; + checkMerge(): boolean; + optimize(context: { + [key: string]: any; + }): void; + rowOffset(): number; + table(): import("parchment").Parent; +} +declare class TableBody extends Container { + static blotName: string; + static tagName: string; + children: LinkedList; +} +declare class TableContainer extends Container { + static blotName: string; + static tagName: string; + children: LinkedList; + balanceCells(): void; + cells(column: number): any[]; + deleteColumn(index: number): void; + insertColumn(index: number): void; + insertRow(index: number): void; + rows(): any[]; +} +declare function tableId(): string; +export { TableCell, TableRow, TableBody, TableContainer, tableId }; diff --git a/public/assets/quill/formats/table.js b/public/assets/quill/formats/table.js new file mode 100644 index 0000000..4e0e767 --- /dev/null +++ b/public/assets/quill/formats/table.js @@ -0,0 +1,176 @@ +import Block from '../blots/block.js'; +import Container from '../blots/container.js'; +class TableCell extends Block { + static blotName = 'table'; + static tagName = 'TD'; + static create(value) { + const node = super.create(); + if (value) { + node.setAttribute('data-row', value); + } else { + node.setAttribute('data-row', tableId()); + } + return node; + } + static formats(domNode) { + if (domNode.hasAttribute('data-row')) { + return domNode.getAttribute('data-row'); + } + return undefined; + } + cellOffset() { + if (this.parent) { + return this.parent.children.indexOf(this); + } + return -1; + } + format(name, value) { + if (name === TableCell.blotName && value) { + this.domNode.setAttribute('data-row', value); + } else { + super.format(name, value); + } + } + row() { + return this.parent; + } + rowOffset() { + if (this.row()) { + return this.row().rowOffset(); + } + return -1; + } + table() { + return this.row() && this.row().table(); + } +} +class TableRow extends Container { + static blotName = 'table-row'; + static tagName = 'TR'; + checkMerge() { + // @ts-expect-error + if (super.checkMerge() && this.next.children.head != null) { + // @ts-expect-error + const thisHead = this.children.head.formats(); + // @ts-expect-error + const thisTail = this.children.tail.formats(); + // @ts-expect-error + const nextHead = this.next.children.head.formats(); + // @ts-expect-error + const nextTail = this.next.children.tail.formats(); + return thisHead.table === thisTail.table && thisHead.table === nextHead.table && thisHead.table === nextTail.table; + } + return false; + } + optimize(context) { + super.optimize(context); + this.children.forEach(child => { + if (child.next == null) return; + const childFormats = child.formats(); + const nextFormats = child.next.formats(); + if (childFormats.table !== nextFormats.table) { + const next = this.splitAfter(child); + if (next) { + // @ts-expect-error TODO: parameters of optimize() should be a optional + next.optimize(); + } + // We might be able to merge with prev now + if (this.prev) { + // @ts-expect-error TODO: parameters of optimize() should be a optional + this.prev.optimize(); + } + } + }); + } + rowOffset() { + if (this.parent) { + return this.parent.children.indexOf(this); + } + return -1; + } + table() { + return this.parent && this.parent.parent; + } +} +class TableBody extends Container { + static blotName = 'table-body'; + static tagName = 'TBODY'; +} +class TableContainer extends Container { + static blotName = 'table-container'; + static tagName = 'TABLE'; + balanceCells() { + const rows = this.descendants(TableRow); + const maxColumns = rows.reduce((max, row) => { + return Math.max(row.children.length, max); + }, 0); + rows.forEach(row => { + new Array(maxColumns - row.children.length).fill(0).forEach(() => { + let value; + if (row.children.head != null) { + value = TableCell.formats(row.children.head.domNode); + } + const blot = this.scroll.create(TableCell.blotName, value); + row.appendChild(blot); + // @ts-expect-error TODO: parameters of optimize() should be a optional + blot.optimize(); // Add break blot + }); + }); + } + cells(column) { + return this.rows().map(row => row.children.at(column)); + } + deleteColumn(index) { + // @ts-expect-error + const [body] = this.descendant(TableBody); + if (body == null || body.children.head == null) return; + body.children.forEach(row => { + const cell = row.children.at(index); + if (cell != null) { + cell.remove(); + } + }); + } + insertColumn(index) { + // @ts-expect-error + const [body] = this.descendant(TableBody); + if (body == null || body.children.head == null) return; + body.children.forEach(row => { + const ref = row.children.at(index); + // @ts-expect-error + const value = TableCell.formats(row.children.head.domNode); + const cell = this.scroll.create(TableCell.blotName, value); + row.insertBefore(cell, ref); + }); + } + insertRow(index) { + // @ts-expect-error + const [body] = this.descendant(TableBody); + if (body == null || body.children.head == null) return; + const id = tableId(); + const row = this.scroll.create(TableRow.blotName); + body.children.head.children.forEach(() => { + const cell = this.scroll.create(TableCell.blotName, id); + row.appendChild(cell); + }); + const ref = body.children.at(index); + body.insertBefore(row, ref); + } + rows() { + const body = this.children.head; + if (body == null) return []; + return body.children.map(row => row); + } +} +TableContainer.allowedChildren = [TableBody]; +TableBody.requiredContainer = TableContainer; +TableBody.allowedChildren = [TableRow]; +TableRow.requiredContainer = TableBody; +TableRow.allowedChildren = [TableCell]; +TableCell.requiredContainer = TableRow; +function tableId() { + const id = Math.random().toString(36).slice(2, 6); + return `row-${id}`; +} +export { TableCell, TableRow, TableBody, TableContainer, tableId }; +//# sourceMappingURL=table.js.map \ No newline at end of file diff --git a/public/assets/quill/formats/table.js.map b/public/assets/quill/formats/table.js.map new file mode 100644 index 0000000..bb1a44c --- /dev/null +++ b/public/assets/quill/formats/table.js.map @@ -0,0 +1 @@ +{"version":3,"file":"table.js","names":["Block","Container","TableCell","blotName","tagName","create","value","node","setAttribute","tableId","formats","domNode","hasAttribute","getAttribute","undefined","cellOffset","parent","children","indexOf","format","name","row","rowOffset","table","TableRow","checkMerge","next","head","thisHead","thisTail","tail","nextHead","nextTail","optimize","context","forEach","child","childFormats","nextFormats","splitAfter","prev","TableBody","TableContainer","balanceCells","rows","descendants","maxColumns","reduce","max","Math","length","Array","fill","blot","scroll","appendChild","cells","column","map","at","deleteColumn","index","body","descendant","cell","remove","insertColumn","ref","insertBefore","insertRow","id","allowedChildren","requiredContainer","random","toString","slice"],"sources":["../../src/formats/table.ts"],"sourcesContent":["import type { LinkedList } from 'parchment';\nimport Block from '../blots/block.js';\nimport Container from '../blots/container.js';\n\nclass TableCell extends Block {\n static blotName = 'table';\n static tagName = 'TD';\n\n static create(value: string) {\n const node = super.create() as HTMLElement;\n if (value) {\n node.setAttribute('data-row', value);\n } else {\n node.setAttribute('data-row', tableId());\n }\n return node;\n }\n\n static formats(domNode: HTMLElement) {\n if (domNode.hasAttribute('data-row')) {\n return domNode.getAttribute('data-row');\n }\n return undefined;\n }\n\n next: this | null;\n\n cellOffset() {\n if (this.parent) {\n return this.parent.children.indexOf(this);\n }\n return -1;\n }\n\n format(name: string, value: string) {\n if (name === TableCell.blotName && value) {\n this.domNode.setAttribute('data-row', value);\n } else {\n super.format(name, value);\n }\n }\n\n row(): TableRow {\n return this.parent as TableRow;\n }\n\n rowOffset() {\n if (this.row()) {\n return this.row().rowOffset();\n }\n return -1;\n }\n\n table() {\n return this.row() && this.row().table();\n }\n}\n\nclass TableRow extends Container {\n static blotName = 'table-row';\n static tagName = 'TR';\n\n children: LinkedList;\n next: this | null;\n\n checkMerge() {\n // @ts-expect-error\n if (super.checkMerge() && this.next.children.head != null) {\n // @ts-expect-error\n const thisHead = this.children.head.formats();\n // @ts-expect-error\n const thisTail = this.children.tail.formats();\n // @ts-expect-error\n const nextHead = this.next.children.head.formats();\n // @ts-expect-error\n const nextTail = this.next.children.tail.formats();\n return (\n thisHead.table === thisTail.table &&\n thisHead.table === nextHead.table &&\n thisHead.table === nextTail.table\n );\n }\n return false;\n }\n\n optimize(context: { [key: string]: any }) {\n super.optimize(context);\n this.children.forEach((child) => {\n if (child.next == null) return;\n const childFormats = child.formats();\n const nextFormats = child.next.formats();\n if (childFormats.table !== nextFormats.table) {\n const next = this.splitAfter(child);\n if (next) {\n // @ts-expect-error TODO: parameters of optimize() should be a optional\n next.optimize();\n }\n // We might be able to merge with prev now\n if (this.prev) {\n // @ts-expect-error TODO: parameters of optimize() should be a optional\n this.prev.optimize();\n }\n }\n });\n }\n\n rowOffset() {\n if (this.parent) {\n return this.parent.children.indexOf(this);\n }\n return -1;\n }\n\n table() {\n return this.parent && this.parent.parent;\n }\n}\n\nclass TableBody extends Container {\n static blotName = 'table-body';\n static tagName = 'TBODY';\n\n children: LinkedList;\n}\n\nclass TableContainer extends Container {\n static blotName = 'table-container';\n static tagName = 'TABLE';\n\n children: LinkedList;\n\n balanceCells() {\n const rows = this.descendants(TableRow);\n const maxColumns = rows.reduce((max, row) => {\n return Math.max(row.children.length, max);\n }, 0);\n rows.forEach((row) => {\n new Array(maxColumns - row.children.length).fill(0).forEach(() => {\n let value;\n if (row.children.head != null) {\n value = TableCell.formats(row.children.head.domNode);\n }\n const blot = this.scroll.create(TableCell.blotName, value);\n row.appendChild(blot);\n // @ts-expect-error TODO: parameters of optimize() should be a optional\n blot.optimize(); // Add break blot\n });\n });\n }\n\n cells(column: number) {\n return this.rows().map((row) => row.children.at(column));\n }\n\n deleteColumn(index: number) {\n // @ts-expect-error\n const [body] = this.descendant(TableBody) as TableBody[];\n if (body == null || body.children.head == null) return;\n body.children.forEach((row) => {\n const cell = row.children.at(index);\n if (cell != null) {\n cell.remove();\n }\n });\n }\n\n insertColumn(index: number) {\n // @ts-expect-error\n const [body] = this.descendant(TableBody) as TableBody[];\n if (body == null || body.children.head == null) return;\n body.children.forEach((row) => {\n const ref = row.children.at(index);\n // @ts-expect-error\n const value = TableCell.formats(row.children.head.domNode);\n const cell = this.scroll.create(TableCell.blotName, value);\n row.insertBefore(cell, ref);\n });\n }\n\n insertRow(index: number) {\n // @ts-expect-error\n const [body] = this.descendant(TableBody) as TableBody[];\n if (body == null || body.children.head == null) return;\n const id = tableId();\n const row = this.scroll.create(TableRow.blotName) as TableRow;\n body.children.head.children.forEach(() => {\n const cell = this.scroll.create(TableCell.blotName, id);\n row.appendChild(cell);\n });\n const ref = body.children.at(index);\n body.insertBefore(row, ref);\n }\n\n rows() {\n const body = this.children.head;\n if (body == null) return [];\n return body.children.map((row) => row);\n }\n}\n\nTableContainer.allowedChildren = [TableBody];\nTableBody.requiredContainer = TableContainer;\n\nTableBody.allowedChildren = [TableRow];\nTableRow.requiredContainer = TableBody;\n\nTableRow.allowedChildren = [TableCell];\nTableCell.requiredContainer = TableRow;\n\nfunction tableId() {\n const id = Math.random().toString(36).slice(2, 6);\n return `row-${id}`;\n}\n\nexport { TableCell, TableRow, TableBody, TableContainer, tableId };\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file diff --git a/public/assets/quill/formats/underline.d.ts b/public/assets/quill/formats/underline.d.ts new file mode 100644 index 0000000..e5aca45 --- /dev/null +++ b/public/assets/quill/formats/underline.d.ts @@ -0,0 +1,6 @@ +import Inline from '../blots/inline.js'; +declare class Underline extends Inline { + static blotName: string; + static tagName: string; +} +export default Underline; diff --git a/public/assets/quill/formats/underline.js b/public/assets/quill/formats/underline.js new file mode 100644 index 0000000..dc76afc --- /dev/null +++ b/public/assets/quill/formats/underline.js @@ -0,0 +1,7 @@ +import Inline from '../blots/inline.js'; +class Underline extends Inline { + static blotName = 'underline'; + static tagName = 'U'; +} +export default Underline; +//# sourceMappingURL=underline.js.map \ No newline at end of file diff --git a/public/assets/quill/formats/underline.js.map b/public/assets/quill/formats/underline.js.map new file mode 100644 index 0000000..835f5f3 --- /dev/null +++ b/public/assets/quill/formats/underline.js.map @@ -0,0 +1 @@ +{"version":3,"file":"underline.js","names":["Inline","Underline","blotName","tagName"],"sources":["../../src/formats/underline.ts"],"sourcesContent":["import Inline from '../blots/inline.js';\n\nclass Underline extends Inline {\n static blotName = 'underline';\n static tagName = 'U';\n}\n\nexport default Underline;\n"],"mappings":"AAAA,OAAOA,MAAM,MAAM,oBAAoB;AAEvC,MAAMC,SAAS,SAASD,MAAM,CAAC;EAC7B,OAAOE,QAAQ,GAAG,WAAW;EAC7B,OAAOC,OAAO,GAAG,GAAG;AACtB;AAEA,eAAeF,SAAS","ignoreList":[]} \ No newline at end of file diff --git a/public/assets/quill/formats/video.d.ts b/public/assets/quill/formats/video.d.ts new file mode 100644 index 0000000..579839f --- /dev/null +++ b/public/assets/quill/formats/video.d.ts @@ -0,0 +1,14 @@ +import { BlockEmbed } from '../blots/block.js'; +declare class Video extends BlockEmbed { + static blotName: string; + static className: string; + static tagName: string; + static create(value: string): Element; + static formats(domNode: Element): Record; + static sanitize(url: string): string; + static value(domNode: Element): string | null; + domNode: HTMLVideoElement; + format(name: string, value: string): void; + html(): string; +} +export default Video; diff --git a/public/assets/quill/formats/video.js b/public/assets/quill/formats/video.js new file mode 100644 index 0000000..135a297 --- /dev/null +++ b/public/assets/quill/formats/video.js @@ -0,0 +1,48 @@ +import { BlockEmbed } from '../blots/block.js'; +import Link from './link.js'; +const ATTRIBUTES = ['height', 'width']; +class Video extends BlockEmbed { + static blotName = 'video'; + static className = 'ql-video'; + static tagName = 'IFRAME'; + static create(value) { + const node = super.create(value); + node.setAttribute('frameborder', '0'); + node.setAttribute('allowfullscreen', 'true'); + node.setAttribute('src', this.sanitize(value)); + return node; + } + static formats(domNode) { + return ATTRIBUTES.reduce((formats, attribute) => { + if (domNode.hasAttribute(attribute)) { + formats[attribute] = domNode.getAttribute(attribute); + } + return formats; + }, {}); + } + static sanitize(url) { + return Link.sanitize(url); + } + static value(domNode) { + return domNode.getAttribute('src'); + } + format(name, value) { + if (ATTRIBUTES.indexOf(name) > -1) { + if (value) { + this.domNode.setAttribute(name, value); + } else { + this.domNode.removeAttribute(name); + } + } else { + super.format(name, value); + } + } + html() { + const { + video + } = this.value(); + return `${video}`; + } +} +export default Video; +//# sourceMappingURL=video.js.map \ No newline at end of file diff --git a/public/assets/quill/formats/video.js.map b/public/assets/quill/formats/video.js.map new file mode 100644 index 0000000..ebdf607 --- /dev/null +++ b/public/assets/quill/formats/video.js.map @@ -0,0 +1 @@ +{"version":3,"file":"video.js","names":["BlockEmbed","Link","ATTRIBUTES","Video","blotName","className","tagName","create","value","node","setAttribute","sanitize","formats","domNode","reduce","attribute","hasAttribute","getAttribute","url","format","name","indexOf","removeAttribute","html","video"],"sources":["../../src/formats/video.ts"],"sourcesContent":["import { BlockEmbed } from '../blots/block.js';\nimport Link from './link.js';\n\nconst ATTRIBUTES = ['height', 'width'];\n\nclass Video extends BlockEmbed {\n static blotName = 'video';\n static className = 'ql-video';\n static tagName = 'IFRAME';\n\n static create(value: string) {\n const node = super.create(value) as Element;\n node.setAttribute('frameborder', '0');\n node.setAttribute('allowfullscreen', 'true');\n node.setAttribute('src', this.sanitize(value));\n return node;\n }\n\n static formats(domNode: Element) {\n return ATTRIBUTES.reduce(\n (formats: Record, attribute) => {\n if (domNode.hasAttribute(attribute)) {\n formats[attribute] = domNode.getAttribute(attribute);\n }\n return formats;\n },\n {},\n );\n }\n\n static sanitize(url: string) {\n return Link.sanitize(url);\n }\n\n static value(domNode: Element) {\n return domNode.getAttribute('src');\n }\n\n domNode: HTMLVideoElement;\n\n format(name: string, value: string) {\n if (ATTRIBUTES.indexOf(name) > -1) {\n if (value) {\n this.domNode.setAttribute(name, value);\n } else {\n this.domNode.removeAttribute(name);\n }\n } else {\n super.format(name, value);\n }\n }\n\n html() {\n const { video } = this.value();\n return `${video}`;\n }\n}\n\nexport default Video;\n"],"mappings":"AAAA,SAASA,UAAU,QAAQ,mBAAmB;AAC9C,OAAOC,IAAI,MAAM,WAAW;AAE5B,MAAMC,UAAU,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC;AAEtC,MAAMC,KAAK,SAASH,UAAU,CAAC;EAC7B,OAAOI,QAAQ,GAAG,OAAO;EACzB,OAAOC,SAAS,GAAG,UAAU;EAC7B,OAAOC,OAAO,GAAG,QAAQ;EAEzB,OAAOC,MAAMA,CAACC,KAAa,EAAE;IAC3B,MAAMC,IAAI,GAAG,KAAK,CAACF,MAAM,CAACC,KAAK,CAAY;IAC3CC,IAAI,CAACC,YAAY,CAAC,aAAa,EAAE,GAAG,CAAC;IACrCD,IAAI,CAACC,YAAY,CAAC,iBAAiB,EAAE,MAAM,CAAC;IAC5CD,IAAI,CAACC,YAAY,CAAC,KAAK,EAAE,IAAI,CAACC,QAAQ,CAACH,KAAK,CAAC,CAAC;IAC9C,OAAOC,IAAI;EACb;EAEA,OAAOG,OAAOA,CAACC,OAAgB,EAAE;IAC/B,OAAOX,UAAU,CAACY,MAAM,CACtB,CAACF,OAAsC,EAAEG,SAAS,KAAK;MACrD,IAAIF,OAAO,CAACG,YAAY,CAACD,SAAS,CAAC,EAAE;QACnCH,OAAO,CAACG,SAAS,CAAC,GAAGF,OAAO,CAACI,YAAY,CAACF,SAAS,CAAC;MACtD;MACA,OAAOH,OAAO;IAChB,CAAC,EACD,CAAC,CACH,CAAC;EACH;EAEA,OAAOD,QAAQA,CAACO,GAAW,EAAE;IAC3B,OAAOjB,IAAI,CAACU,QAAQ,CAACO,GAAG,CAAC;EAC3B;EAEA,OAAOV,KAAKA,CAACK,OAAgB,EAAE;IAC7B,OAAOA,OAAO,CAACI,YAAY,CAAC,KAAK,CAAC;EACpC;EAIAE,MAAMA,CAACC,IAAY,EAAEZ,KAAa,EAAE;IAClC,IAAIN,UAAU,CAACmB,OAAO,CAACD,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE;MACjC,IAAIZ,KAAK,EAAE;QACT,IAAI,CAACK,OAAO,CAACH,YAAY,CAACU,IAAI,EAAEZ,KAAK,CAAC;MACxC,CAAC,MAAM;QACL,IAAI,CAACK,OAAO,CAACS,eAAe,CAACF,IAAI,CAAC;MACpC;IACF,CAAC,MAAM;MACL,KAAK,CAACD,MAAM,CAACC,IAAI,EAAEZ,KAAK,CAAC;IAC3B;EACF;EAEAe,IAAIA,CAAA,EAAG;IACL,MAAM;MAAEC;IAAM,CAAC,GAAG,IAAI,CAAChB,KAAK,CAAC,CAAC;IAC9B,OAAQ,YAAWgB,KAAM,KAAIA,KAAM,MAAK;EAC1C;AACF;AAEA,eAAerB,KAAK","ignoreList":[]} \ No newline at end of file diff --git a/public/assets/quill/modules/clipboard.d.ts b/public/assets/quill/modules/clipboard.d.ts new file mode 100644 index 0000000..740f12d --- /dev/null +++ b/public/assets/quill/modules/clipboard.d.ts @@ -0,0 +1,43 @@ +import type { ScrollBlot } from 'parchment'; +import Delta from 'quill-delta'; +import type { EmitterSource } from '../core/emitter.js'; +import Module from '../core/module.js'; +import Quill from '../core/quill.js'; +import type { Range } from '../core/selection.js'; +type Selector = string | Node['TEXT_NODE'] | Node['ELEMENT_NODE']; +type Matcher = (node: Node, delta: Delta, scroll: ScrollBlot) => Delta; +interface ClipboardOptions { + matchers: [Selector, Matcher][]; +} +declare class Clipboard extends Module { + static DEFAULTS: ClipboardOptions; + matchers: [Selector, Matcher][]; + constructor(quill: Quill, options: Partial); + addMatcher(selector: Selector, matcher: Matcher): void; + convert({ html, text }: { + html?: string; + text?: string; + }, formats?: Record): Delta; + protected normalizeHTML(doc: Document): void; + protected convertHTML(html: string): Delta; + dangerouslyPasteHTML(html: string, source?: EmitterSource): void; + dangerouslyPasteHTML(index: number, html: string, source?: EmitterSource): void; + onCaptureCopy(e: ClipboardEvent, isCut?: boolean): void; + private normalizeURIList; + onCapturePaste(e: ClipboardEvent): void; + onCopy(range: Range, isCut: boolean): { + html: string; + text: string; + }; + onPaste(range: Range, { text, html }: { + text?: string; + html?: string; + }): void; + prepareMatching(container: Element, nodeMatches: WeakMap): Matcher[][]; +} +declare function traverse(scroll: ScrollBlot, node: ChildNode, elementMatchers: Matcher[], textMatchers: Matcher[], nodeMatches: WeakMap): Delta; +declare function matchAttributor(node: HTMLElement, delta: Delta, scroll: ScrollBlot): Delta; +declare function matchBlot(node: Node, delta: Delta, scroll: ScrollBlot): Delta; +declare function matchNewline(node: Node, delta: Delta, scroll: ScrollBlot): Delta; +declare function matchText(node: HTMLElement, delta: Delta, scroll: ScrollBlot): Delta; +export { Clipboard as default, matchAttributor, matchBlot, matchNewline, matchText, traverse, }; diff --git a/public/assets/quill/modules/clipboard.js b/public/assets/quill/modules/clipboard.js new file mode 100644 index 0000000..e2bdb09 --- /dev/null +++ b/public/assets/quill/modules/clipboard.js @@ -0,0 +1,477 @@ +import { Attributor, BlockBlot, ClassAttributor, EmbedBlot, Scope, StyleAttributor } from 'parchment'; +import Delta from 'quill-delta'; +import { BlockEmbed } from '../blots/block.js'; +import logger from '../core/logger.js'; +import Module from '../core/module.js'; +import Quill from '../core/quill.js'; +import { AlignAttribute, AlignStyle } from '../formats/align.js'; +import { BackgroundStyle } from '../formats/background.js'; +import CodeBlock from '../formats/code.js'; +import { ColorStyle } from '../formats/color.js'; +import { DirectionAttribute, DirectionStyle } from '../formats/direction.js'; +import { FontStyle } from '../formats/font.js'; +import { SizeStyle } from '../formats/size.js'; +import { deleteRange } from './keyboard.js'; +import normalizeExternalHTML from './normalizeExternalHTML/index.js'; +const debug = logger('quill:clipboard'); +const CLIPBOARD_CONFIG = [[Node.TEXT_NODE, matchText], [Node.TEXT_NODE, matchNewline], ['br', matchBreak], [Node.ELEMENT_NODE, matchNewline], [Node.ELEMENT_NODE, matchBlot], [Node.ELEMENT_NODE, matchAttributor], [Node.ELEMENT_NODE, matchStyles], ['li', matchIndent], ['ol, ul', matchList], ['pre', matchCodeBlock], ['tr', matchTable], ['b', createMatchAlias('bold')], ['i', createMatchAlias('italic')], ['strike', createMatchAlias('strike')], ['style', matchIgnore]]; +const ATTRIBUTE_ATTRIBUTORS = [AlignAttribute, DirectionAttribute].reduce((memo, attr) => { + memo[attr.keyName] = attr; + return memo; +}, {}); +const STYLE_ATTRIBUTORS = [AlignStyle, BackgroundStyle, ColorStyle, DirectionStyle, FontStyle, SizeStyle].reduce((memo, attr) => { + memo[attr.keyName] = attr; + return memo; +}, {}); +class Clipboard extends Module { + static DEFAULTS = { + matchers: [] + }; + constructor(quill, options) { + super(quill, options); + this.quill.root.addEventListener('copy', e => this.onCaptureCopy(e, false)); + this.quill.root.addEventListener('cut', e => this.onCaptureCopy(e, true)); + this.quill.root.addEventListener('paste', this.onCapturePaste.bind(this)); + this.matchers = []; + CLIPBOARD_CONFIG.concat(this.options.matchers ?? []).forEach(_ref => { + let [selector, matcher] = _ref; + this.addMatcher(selector, matcher); + }); + } + addMatcher(selector, matcher) { + this.matchers.push([selector, matcher]); + } + convert(_ref2) { + let { + html, + text + } = _ref2; + let formats = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + if (formats[CodeBlock.blotName]) { + return new Delta().insert(text || '', { + [CodeBlock.blotName]: formats[CodeBlock.blotName] + }); + } + if (!html) { + return new Delta().insert(text || '', formats); + } + const delta = this.convertHTML(html); + // Remove trailing newline + if (deltaEndsWith(delta, '\n') && (delta.ops[delta.ops.length - 1].attributes == null || formats.table)) { + return delta.compose(new Delta().retain(delta.length() - 1).delete(1)); + } + return delta; + } + normalizeHTML(doc) { + normalizeExternalHTML(doc); + } + convertHTML(html) { + const doc = new DOMParser().parseFromString(html, 'text/html'); + this.normalizeHTML(doc); + const container = doc.body; + const nodeMatches = new WeakMap(); + const [elementMatchers, textMatchers] = this.prepareMatching(container, nodeMatches); + return traverse(this.quill.scroll, container, elementMatchers, textMatchers, nodeMatches); + } + dangerouslyPasteHTML(index, html) { + let source = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : Quill.sources.API; + if (typeof index === 'string') { + const delta = this.convert({ + html: index, + text: '' + }); + // @ts-expect-error + this.quill.setContents(delta, html); + this.quill.setSelection(0, Quill.sources.SILENT); + } else { + const paste = this.convert({ + html, + text: '' + }); + this.quill.updateContents(new Delta().retain(index).concat(paste), source); + this.quill.setSelection(index + paste.length(), Quill.sources.SILENT); + } + } + onCaptureCopy(e) { + let isCut = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + if (e.defaultPrevented) return; + e.preventDefault(); + const [range] = this.quill.selection.getRange(); + if (range == null) return; + const { + html, + text + } = this.onCopy(range, isCut); + e.clipboardData?.setData('text/plain', text); + e.clipboardData?.setData('text/html', html); + if (isCut) { + deleteRange({ + range, + quill: this.quill + }); + } + } + + /* + * https://www.iana.org/assignments/media-types/text/uri-list + */ + normalizeURIList(urlList) { + return urlList.split(/\r?\n/) + // Ignore all comments + .filter(url => url[0] !== '#').join('\n'); + } + onCapturePaste(e) { + if (e.defaultPrevented || !this.quill.isEnabled()) return; + e.preventDefault(); + const range = this.quill.getSelection(true); + if (range == null) return; + const html = e.clipboardData?.getData('text/html'); + let text = e.clipboardData?.getData('text/plain'); + if (!html && !text) { + const urlList = e.clipboardData?.getData('text/uri-list'); + if (urlList) { + text = this.normalizeURIList(urlList); + } + } + const files = Array.from(e.clipboardData?.files || []); + if (!html && files.length > 0) { + this.quill.uploader.upload(range, files); + return; + } + if (html && files.length > 0) { + const doc = new DOMParser().parseFromString(html, 'text/html'); + if (doc.body.childElementCount === 1 && doc.body.firstElementChild?.tagName === 'IMG') { + this.quill.uploader.upload(range, files); + return; + } + } + this.onPaste(range, { + html, + text + }); + } + onCopy(range) { + const text = this.quill.getText(range); + const html = this.quill.getSemanticHTML(range); + return { + html, + text + }; + } + onPaste(range, _ref3) { + let { + text, + html + } = _ref3; + const formats = this.quill.getFormat(range.index); + const pastedDelta = this.convert({ + text, + html + }, formats); + debug.log('onPaste', pastedDelta, { + text, + html + }); + const delta = new Delta().retain(range.index).delete(range.length).concat(pastedDelta); + this.quill.updateContents(delta, Quill.sources.USER); + // range.length contributes to delta.length() + this.quill.setSelection(delta.length() - range.length, Quill.sources.SILENT); + this.quill.scrollSelectionIntoView(); + } + prepareMatching(container, nodeMatches) { + const elementMatchers = []; + const textMatchers = []; + this.matchers.forEach(pair => { + const [selector, matcher] = pair; + switch (selector) { + case Node.TEXT_NODE: + textMatchers.push(matcher); + break; + case Node.ELEMENT_NODE: + elementMatchers.push(matcher); + break; + default: + Array.from(container.querySelectorAll(selector)).forEach(node => { + if (nodeMatches.has(node)) { + const matches = nodeMatches.get(node); + matches?.push(matcher); + } else { + nodeMatches.set(node, [matcher]); + } + }); + break; + } + }); + return [elementMatchers, textMatchers]; + } +} +function applyFormat(delta, format, value, scroll) { + if (!scroll.query(format)) { + return delta; + } + return delta.reduce((newDelta, op) => { + if (!op.insert) return newDelta; + if (op.attributes && op.attributes[format]) { + return newDelta.push(op); + } + const formats = value ? { + [format]: value + } : {}; + return newDelta.insert(op.insert, { + ...formats, + ...op.attributes + }); + }, new Delta()); +} +function deltaEndsWith(delta, text) { + let endText = ''; + for (let i = delta.ops.length - 1; i >= 0 && endText.length < text.length; --i // eslint-disable-line no-plusplus + ) { + const op = delta.ops[i]; + if (typeof op.insert !== 'string') break; + endText = op.insert + endText; + } + return endText.slice(-1 * text.length) === text; +} +function isLine(node, scroll) { + if (!(node instanceof Element)) return false; + const match = scroll.query(node); + // @ts-expect-error + if (match && match.prototype instanceof EmbedBlot) return false; + return ['address', 'article', 'blockquote', 'canvas', 'dd', 'div', 'dl', 'dt', 'fieldset', 'figcaption', 'figure', 'footer', 'form', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'header', 'iframe', 'li', 'main', 'nav', 'ol', 'output', 'p', 'pre', 'section', 'table', 'td', 'tr', 'ul', 'video'].includes(node.tagName.toLowerCase()); +} +function isBetweenInlineElements(node, scroll) { + return node.previousElementSibling && node.nextElementSibling && !isLine(node.previousElementSibling, scroll) && !isLine(node.nextElementSibling, scroll); +} +const preNodes = new WeakMap(); +function isPre(node) { + if (node == null) return false; + if (!preNodes.has(node)) { + // @ts-expect-error + if (node.tagName === 'PRE') { + preNodes.set(node, true); + } else { + preNodes.set(node, isPre(node.parentNode)); + } + } + return preNodes.get(node); +} +function traverse(scroll, node, elementMatchers, textMatchers, nodeMatches) { + // Post-order + if (node.nodeType === node.TEXT_NODE) { + return textMatchers.reduce((delta, matcher) => { + return matcher(node, delta, scroll); + }, new Delta()); + } + if (node.nodeType === node.ELEMENT_NODE) { + return Array.from(node.childNodes || []).reduce((delta, childNode) => { + let childrenDelta = traverse(scroll, childNode, elementMatchers, textMatchers, nodeMatches); + if (childNode.nodeType === node.ELEMENT_NODE) { + childrenDelta = elementMatchers.reduce((reducedDelta, matcher) => { + return matcher(childNode, reducedDelta, scroll); + }, childrenDelta); + childrenDelta = (nodeMatches.get(childNode) || []).reduce((reducedDelta, matcher) => { + return matcher(childNode, reducedDelta, scroll); + }, childrenDelta); + } + return delta.concat(childrenDelta); + }, new Delta()); + } + return new Delta(); +} +function createMatchAlias(format) { + return (_node, delta, scroll) => { + return applyFormat(delta, format, true, scroll); + }; +} +function matchAttributor(node, delta, scroll) { + const attributes = Attributor.keys(node); + const classes = ClassAttributor.keys(node); + const styles = StyleAttributor.keys(node); + const formats = {}; + attributes.concat(classes).concat(styles).forEach(name => { + let attr = scroll.query(name, Scope.ATTRIBUTE); + if (attr != null) { + formats[attr.attrName] = attr.value(node); + if (formats[attr.attrName]) return; + } + attr = ATTRIBUTE_ATTRIBUTORS[name]; + if (attr != null && (attr.attrName === name || attr.keyName === name)) { + formats[attr.attrName] = attr.value(node) || undefined; + } + attr = STYLE_ATTRIBUTORS[name]; + if (attr != null && (attr.attrName === name || attr.keyName === name)) { + attr = STYLE_ATTRIBUTORS[name]; + formats[attr.attrName] = attr.value(node) || undefined; + } + }); + return Object.entries(formats).reduce((newDelta, _ref4) => { + let [name, value] = _ref4; + return applyFormat(newDelta, name, value, scroll); + }, delta); +} +function matchBlot(node, delta, scroll) { + const match = scroll.query(node); + if (match == null) return delta; + // @ts-expect-error + if (match.prototype instanceof EmbedBlot) { + const embed = {}; + // @ts-expect-error + const value = match.value(node); + if (value != null) { + // @ts-expect-error + embed[match.blotName] = value; + // @ts-expect-error + return new Delta().insert(embed, match.formats(node, scroll)); + } + } else { + // @ts-expect-error + if (match.prototype instanceof BlockBlot && !deltaEndsWith(delta, '\n')) { + delta.insert('\n'); + } + if ('blotName' in match && 'formats' in match && typeof match.formats === 'function') { + return applyFormat(delta, match.blotName, match.formats(node, scroll), scroll); + } + } + return delta; +} +function matchBreak(node, delta) { + if (!deltaEndsWith(delta, '\n')) { + delta.insert('\n'); + } + return delta; +} +function matchCodeBlock(node, delta, scroll) { + const match = scroll.query('code-block'); + const language = match && 'formats' in match && typeof match.formats === 'function' ? match.formats(node, scroll) : true; + return applyFormat(delta, 'code-block', language, scroll); +} +function matchIgnore() { + return new Delta(); +} +function matchIndent(node, delta, scroll) { + const match = scroll.query(node); + if (match == null || + // @ts-expect-error + match.blotName !== 'list' || !deltaEndsWith(delta, '\n')) { + return delta; + } + let indent = -1; + let parent = node.parentNode; + while (parent != null) { + // @ts-expect-error + if (['OL', 'UL'].includes(parent.tagName)) { + indent += 1; + } + parent = parent.parentNode; + } + if (indent <= 0) return delta; + return delta.reduce((composed, op) => { + if (!op.insert) return composed; + if (op.attributes && typeof op.attributes.indent === 'number') { + return composed.push(op); + } + return composed.insert(op.insert, { + indent, + ...(op.attributes || {}) + }); + }, new Delta()); +} +function matchList(node, delta, scroll) { + const element = node; + let list = element.tagName === 'OL' ? 'ordered' : 'bullet'; + const checkedAttr = element.getAttribute('data-checked'); + if (checkedAttr) { + list = checkedAttr === 'true' ? 'checked' : 'unchecked'; + } + return applyFormat(delta, 'list', list, scroll); +} +function matchNewline(node, delta, scroll) { + if (!deltaEndsWith(delta, '\n')) { + if (isLine(node, scroll) && (node.childNodes.length > 0 || node instanceof HTMLParagraphElement)) { + return delta.insert('\n'); + } + if (delta.length() > 0 && node.nextSibling) { + let nextSibling = node.nextSibling; + while (nextSibling != null) { + if (isLine(nextSibling, scroll)) { + return delta.insert('\n'); + } + const match = scroll.query(nextSibling); + // @ts-expect-error + if (match && match.prototype instanceof BlockEmbed) { + return delta.insert('\n'); + } + nextSibling = nextSibling.firstChild; + } + } + } + return delta; +} +function matchStyles(node, delta, scroll) { + const formats = {}; + const style = node.style || {}; + if (style.fontStyle === 'italic') { + formats.italic = true; + } + if (style.textDecoration === 'underline') { + formats.underline = true; + } + if (style.textDecoration === 'line-through') { + formats.strike = true; + } + if (style.fontWeight?.startsWith('bold') || + // @ts-expect-error Fix me later + parseInt(style.fontWeight, 10) >= 700) { + formats.bold = true; + } + delta = Object.entries(formats).reduce((newDelta, _ref5) => { + let [name, value] = _ref5; + return applyFormat(newDelta, name, value, scroll); + }, delta); + // @ts-expect-error + if (parseFloat(style.textIndent || 0) > 0) { + // Could be 0.5in + return new Delta().insert('\t').concat(delta); + } + return delta; +} +function matchTable(node, delta, scroll) { + const table = node.parentElement?.tagName === 'TABLE' ? node.parentElement : node.parentElement?.parentElement; + if (table != null) { + const rows = Array.from(table.querySelectorAll('tr')); + const row = rows.indexOf(node) + 1; + return applyFormat(delta, 'table', row, scroll); + } + return delta; +} +function matchText(node, delta, scroll) { + // @ts-expect-error + let text = node.data; + // Word represents empty line with   + if (node.parentElement?.tagName === 'O:P') { + return delta.insert(text.trim()); + } + if (!isPre(node)) { + if (text.trim().length === 0 && text.includes('\n') && !isBetweenInlineElements(node, scroll)) { + return delta; + } + // convert all non-nbsp whitespace into regular space + text = text.replace(/[^\S\u00a0]/g, ' '); + // collapse consecutive spaces into one + text = text.replace(/ {2,}/g, ' '); + if (node.previousSibling == null && node.parentElement != null && isLine(node.parentElement, scroll) || node.previousSibling instanceof Element && isLine(node.previousSibling, scroll)) { + // block structure means we don't need leading space + text = text.replace(/^ /, ''); + } + if (node.nextSibling == null && node.parentElement != null && isLine(node.parentElement, scroll) || node.nextSibling instanceof Element && isLine(node.nextSibling, scroll)) { + // block structure means we don't need trailing space + text = text.replace(/ $/, ''); + } + // done removing whitespace and can normalize all to regular space + text = text.replaceAll('\u00a0', ' '); + } + return delta.insert(text); +} +export { Clipboard as default, matchAttributor, matchBlot, matchNewline, matchText, traverse }; +//# sourceMappingURL=clipboard.js.map \ No newline at end of file diff --git a/public/assets/quill/modules/clipboard.js.map b/public/assets/quill/modules/clipboard.js.map new file mode 100644 index 0000000..83d943a --- /dev/null +++ b/public/assets/quill/modules/clipboard.js.map @@ -0,0 +1 @@ +{"version":3,"file":"clipboard.js","names":["Attributor","BlockBlot","ClassAttributor","EmbedBlot","Scope","StyleAttributor","Delta","BlockEmbed","logger","Module","Quill","AlignAttribute","AlignStyle","BackgroundStyle","CodeBlock","ColorStyle","DirectionAttribute","DirectionStyle","FontStyle","SizeStyle","deleteRange","normalizeExternalHTML","debug","CLIPBOARD_CONFIG","Node","TEXT_NODE","matchText","matchNewline","matchBreak","ELEMENT_NODE","matchBlot","matchAttributor","matchStyles","matchIndent","matchList","matchCodeBlock","matchTable","createMatchAlias","matchIgnore","ATTRIBUTE_ATTRIBUTORS","reduce","memo","attr","keyName","STYLE_ATTRIBUTORS","Clipboard","DEFAULTS","matchers","constructor","quill","options","root","addEventListener","e","onCaptureCopy","onCapturePaste","bind","concat","forEach","_ref","selector","matcher","addMatcher","push","convert","_ref2","html","text","formats","arguments","length","undefined","blotName","insert","delta","convertHTML","deltaEndsWith","ops","attributes","table","compose","retain","delete","normalizeHTML","doc","DOMParser","parseFromString","container","body","nodeMatches","WeakMap","elementMatchers","textMatchers","prepareMatching","traverse","scroll","dangerouslyPasteHTML","index","source","sources","API","setContents","setSelection","SILENT","paste","updateContents","isCut","defaultPrevented","preventDefault","range","selection","getRange","onCopy","clipboardData","setData","normalizeURIList","urlList","split","filter","url","join","isEnabled","getSelection","getData","files","Array","from","uploader","upload","childElementCount","firstElementChild","tagName","onPaste","getText","getSemanticHTML","_ref3","getFormat","pastedDelta","log","USER","scrollSelectionIntoView","pair","querySelectorAll","node","has","matches","get","set","applyFormat","format","value","query","newDelta","op","endText","i","slice","isLine","Element","match","prototype","includes","toLowerCase","isBetweenInlineElements","previousElementSibling","nextElementSibling","preNodes","isPre","parentNode","nodeType","childNodes","childNode","childrenDelta","reducedDelta","_node","keys","classes","styles","name","ATTRIBUTE","attrName","Object","entries","_ref4","embed","language","indent","parent","composed","element","list","checkedAttr","getAttribute","HTMLParagraphElement","nextSibling","firstChild","style","fontStyle","italic","textDecoration","underline","strike","fontWeight","startsWith","parseInt","bold","_ref5","parseFloat","textIndent","parentElement","rows","row","indexOf","data","trim","replace","previousSibling","replaceAll","default"],"sources":["../../src/modules/clipboard.ts"],"sourcesContent":["import type { ScrollBlot } from 'parchment';\nimport {\n Attributor,\n BlockBlot,\n ClassAttributor,\n EmbedBlot,\n Scope,\n StyleAttributor,\n} from 'parchment';\nimport Delta from 'quill-delta';\nimport { BlockEmbed } from '../blots/block.js';\nimport type { EmitterSource } from '../core/emitter.js';\nimport logger from '../core/logger.js';\nimport Module from '../core/module.js';\nimport Quill from '../core/quill.js';\nimport type { Range } from '../core/selection.js';\nimport { AlignAttribute, AlignStyle } from '../formats/align.js';\nimport { BackgroundStyle } from '../formats/background.js';\nimport CodeBlock from '../formats/code.js';\nimport { ColorStyle } from '../formats/color.js';\nimport { DirectionAttribute, DirectionStyle } from '../formats/direction.js';\nimport { FontStyle } from '../formats/font.js';\nimport { SizeStyle } from '../formats/size.js';\nimport { deleteRange } from './keyboard.js';\nimport normalizeExternalHTML from './normalizeExternalHTML/index.js';\n\nconst debug = logger('quill:clipboard');\n\ntype Selector = string | Node['TEXT_NODE'] | Node['ELEMENT_NODE'];\ntype Matcher = (node: Node, delta: Delta, scroll: ScrollBlot) => Delta;\n\nconst CLIPBOARD_CONFIG: [Selector, Matcher][] = [\n [Node.TEXT_NODE, matchText],\n [Node.TEXT_NODE, matchNewline],\n ['br', matchBreak],\n [Node.ELEMENT_NODE, matchNewline],\n [Node.ELEMENT_NODE, matchBlot],\n [Node.ELEMENT_NODE, matchAttributor],\n [Node.ELEMENT_NODE, matchStyles],\n ['li', matchIndent],\n ['ol, ul', matchList],\n ['pre', matchCodeBlock],\n ['tr', matchTable],\n ['b', createMatchAlias('bold')],\n ['i', createMatchAlias('italic')],\n ['strike', createMatchAlias('strike')],\n ['style', matchIgnore],\n];\n\nconst ATTRIBUTE_ATTRIBUTORS = [AlignAttribute, DirectionAttribute].reduce(\n (memo: Record, attr) => {\n memo[attr.keyName] = attr;\n return memo;\n },\n {},\n);\n\nconst STYLE_ATTRIBUTORS = [\n AlignStyle,\n BackgroundStyle,\n ColorStyle,\n DirectionStyle,\n FontStyle,\n SizeStyle,\n].reduce((memo: Record, attr) => {\n memo[attr.keyName] = attr;\n return memo;\n}, {});\n\ninterface ClipboardOptions {\n matchers: [Selector, Matcher][];\n}\n\nclass Clipboard extends Module {\n static DEFAULTS: ClipboardOptions = {\n matchers: [],\n };\n\n matchers: [Selector, Matcher][];\n\n constructor(quill: Quill, options: Partial) {\n super(quill, options);\n this.quill.root.addEventListener('copy', (e) =>\n this.onCaptureCopy(e, false),\n );\n this.quill.root.addEventListener('cut', (e) => this.onCaptureCopy(e, true));\n this.quill.root.addEventListener('paste', this.onCapturePaste.bind(this));\n this.matchers = [];\n CLIPBOARD_CONFIG.concat(this.options.matchers ?? []).forEach(\n ([selector, matcher]) => {\n this.addMatcher(selector, matcher);\n },\n );\n }\n\n addMatcher(selector: Selector, matcher: Matcher) {\n this.matchers.push([selector, matcher]);\n }\n\n convert(\n { html, text }: { html?: string; text?: string },\n formats: Record = {},\n ) {\n if (formats[CodeBlock.blotName]) {\n return new Delta().insert(text || '', {\n [CodeBlock.blotName]: formats[CodeBlock.blotName],\n });\n }\n if (!html) {\n return new Delta().insert(text || '', formats);\n }\n const delta = this.convertHTML(html);\n // Remove trailing newline\n if (\n deltaEndsWith(delta, '\\n') &&\n (delta.ops[delta.ops.length - 1].attributes == null || formats.table)\n ) {\n return delta.compose(new Delta().retain(delta.length() - 1).delete(1));\n }\n return delta;\n }\n\n protected normalizeHTML(doc: Document) {\n normalizeExternalHTML(doc);\n }\n\n protected convertHTML(html: string) {\n const doc = new DOMParser().parseFromString(html, 'text/html');\n this.normalizeHTML(doc);\n const container = doc.body;\n const nodeMatches = new WeakMap();\n const [elementMatchers, textMatchers] = this.prepareMatching(\n container,\n nodeMatches,\n );\n return traverse(\n this.quill.scroll,\n container,\n elementMatchers,\n textMatchers,\n nodeMatches,\n );\n }\n\n dangerouslyPasteHTML(html: string, source?: EmitterSource): void;\n dangerouslyPasteHTML(\n index: number,\n html: string,\n source?: EmitterSource,\n ): void;\n dangerouslyPasteHTML(\n index: number | string,\n html?: string,\n source: EmitterSource = Quill.sources.API,\n ) {\n if (typeof index === 'string') {\n const delta = this.convert({ html: index, text: '' });\n // @ts-expect-error\n this.quill.setContents(delta, html);\n this.quill.setSelection(0, Quill.sources.SILENT);\n } else {\n const paste = this.convert({ html, text: '' });\n this.quill.updateContents(\n new Delta().retain(index).concat(paste),\n source,\n );\n this.quill.setSelection(index + paste.length(), Quill.sources.SILENT);\n }\n }\n\n onCaptureCopy(e: ClipboardEvent, isCut = false) {\n if (e.defaultPrevented) return;\n e.preventDefault();\n const [range] = this.quill.selection.getRange();\n if (range == null) return;\n const { html, text } = this.onCopy(range, isCut);\n e.clipboardData?.setData('text/plain', text);\n e.clipboardData?.setData('text/html', html);\n if (isCut) {\n deleteRange({ range, quill: this.quill });\n }\n }\n\n /*\n * https://www.iana.org/assignments/media-types/text/uri-list\n */\n private normalizeURIList(urlList: string) {\n return (\n urlList\n .split(/\\r?\\n/)\n // Ignore all comments\n .filter((url) => url[0] !== '#')\n .join('\\n')\n );\n }\n\n onCapturePaste(e: ClipboardEvent) {\n if (e.defaultPrevented || !this.quill.isEnabled()) return;\n e.preventDefault();\n const range = this.quill.getSelection(true);\n if (range == null) return;\n const html = e.clipboardData?.getData('text/html');\n let text = e.clipboardData?.getData('text/plain');\n if (!html && !text) {\n const urlList = e.clipboardData?.getData('text/uri-list');\n if (urlList) {\n text = this.normalizeURIList(urlList);\n }\n }\n const files = Array.from(e.clipboardData?.files || []);\n if (!html && files.length > 0) {\n this.quill.uploader.upload(range, files);\n return;\n }\n if (html && files.length > 0) {\n const doc = new DOMParser().parseFromString(html, 'text/html');\n if (\n doc.body.childElementCount === 1 &&\n doc.body.firstElementChild?.tagName === 'IMG'\n ) {\n this.quill.uploader.upload(range, files);\n return;\n }\n }\n this.onPaste(range, { html, text });\n }\n\n onCopy(range: Range, isCut: boolean): { html: string; text: string };\n onCopy(range: Range) {\n const text = this.quill.getText(range);\n const html = this.quill.getSemanticHTML(range);\n return { html, text };\n }\n\n onPaste(range: Range, { text, html }: { text?: string; html?: string }) {\n const formats = this.quill.getFormat(range.index);\n const pastedDelta = this.convert({ text, html }, formats);\n debug.log('onPaste', pastedDelta, { text, html });\n const delta = new Delta()\n .retain(range.index)\n .delete(range.length)\n .concat(pastedDelta);\n this.quill.updateContents(delta, Quill.sources.USER);\n // range.length contributes to delta.length()\n this.quill.setSelection(\n delta.length() - range.length,\n Quill.sources.SILENT,\n );\n this.quill.scrollSelectionIntoView();\n }\n\n prepareMatching(container: Element, nodeMatches: WeakMap) {\n const elementMatchers: Matcher[] = [];\n const textMatchers: Matcher[] = [];\n this.matchers.forEach((pair) => {\n const [selector, matcher] = pair;\n switch (selector) {\n case Node.TEXT_NODE:\n textMatchers.push(matcher);\n break;\n case Node.ELEMENT_NODE:\n elementMatchers.push(matcher);\n break;\n default:\n Array.from(container.querySelectorAll(selector)).forEach((node) => {\n if (nodeMatches.has(node)) {\n const matches = nodeMatches.get(node);\n matches?.push(matcher);\n } else {\n nodeMatches.set(node, [matcher]);\n }\n });\n break;\n }\n });\n return [elementMatchers, textMatchers];\n }\n}\n\nfunction applyFormat(\n delta: Delta,\n format: string,\n value: unknown,\n scroll: ScrollBlot,\n): Delta {\n if (!scroll.query(format)) {\n return delta;\n }\n\n return delta.reduce((newDelta, op) => {\n if (!op.insert) return newDelta;\n if (op.attributes && op.attributes[format]) {\n return newDelta.push(op);\n }\n const formats = value ? { [format]: value } : {};\n return newDelta.insert(op.insert, { ...formats, ...op.attributes });\n }, new Delta());\n}\n\nfunction deltaEndsWith(delta: Delta, text: string) {\n let endText = '';\n for (\n let i = delta.ops.length - 1;\n i >= 0 && endText.length < text.length;\n --i // eslint-disable-line no-plusplus\n ) {\n const op = delta.ops[i];\n if (typeof op.insert !== 'string') break;\n endText = op.insert + endText;\n }\n return endText.slice(-1 * text.length) === text;\n}\n\nfunction isLine(node: Node, scroll: ScrollBlot) {\n if (!(node instanceof Element)) return false;\n const match = scroll.query(node);\n // @ts-expect-error\n if (match && match.prototype instanceof EmbedBlot) return false;\n\n return [\n 'address',\n 'article',\n 'blockquote',\n 'canvas',\n 'dd',\n 'div',\n 'dl',\n 'dt',\n 'fieldset',\n 'figcaption',\n 'figure',\n 'footer',\n 'form',\n 'h1',\n 'h2',\n 'h3',\n 'h4',\n 'h5',\n 'h6',\n 'header',\n 'iframe',\n 'li',\n 'main',\n 'nav',\n 'ol',\n 'output',\n 'p',\n 'pre',\n 'section',\n 'table',\n 'td',\n 'tr',\n 'ul',\n 'video',\n ].includes(node.tagName.toLowerCase());\n}\n\nfunction isBetweenInlineElements(node: HTMLElement, scroll: ScrollBlot) {\n return (\n node.previousElementSibling &&\n node.nextElementSibling &&\n !isLine(node.previousElementSibling, scroll) &&\n !isLine(node.nextElementSibling, scroll)\n );\n}\n\nconst preNodes = new WeakMap();\nfunction isPre(node: Node | null) {\n if (node == null) return false;\n if (!preNodes.has(node)) {\n // @ts-expect-error\n if (node.tagName === 'PRE') {\n preNodes.set(node, true);\n } else {\n preNodes.set(node, isPre(node.parentNode));\n }\n }\n return preNodes.get(node);\n}\n\nfunction traverse(\n scroll: ScrollBlot,\n node: ChildNode,\n elementMatchers: Matcher[],\n textMatchers: Matcher[],\n nodeMatches: WeakMap,\n): Delta {\n // Post-order\n if (node.nodeType === node.TEXT_NODE) {\n return textMatchers.reduce((delta: Delta, matcher) => {\n return matcher(node, delta, scroll);\n }, new Delta());\n }\n if (node.nodeType === node.ELEMENT_NODE) {\n return Array.from(node.childNodes || []).reduce((delta, childNode) => {\n let childrenDelta = traverse(\n scroll,\n childNode,\n elementMatchers,\n textMatchers,\n nodeMatches,\n );\n if (childNode.nodeType === node.ELEMENT_NODE) {\n childrenDelta = elementMatchers.reduce((reducedDelta, matcher) => {\n return matcher(childNode as HTMLElement, reducedDelta, scroll);\n }, childrenDelta);\n childrenDelta = (nodeMatches.get(childNode) || []).reduce(\n (reducedDelta, matcher) => {\n return matcher(childNode, reducedDelta, scroll);\n },\n childrenDelta,\n );\n }\n return delta.concat(childrenDelta);\n }, new Delta());\n }\n return new Delta();\n}\n\nfunction createMatchAlias(format: string) {\n return (_node: Element, delta: Delta, scroll: ScrollBlot) => {\n return applyFormat(delta, format, true, scroll);\n };\n}\n\nfunction matchAttributor(node: HTMLElement, delta: Delta, scroll: ScrollBlot) {\n const attributes = Attributor.keys(node);\n const classes = ClassAttributor.keys(node);\n const styles = StyleAttributor.keys(node);\n const formats: Record = {};\n attributes\n .concat(classes)\n .concat(styles)\n .forEach((name) => {\n let attr = scroll.query(name, Scope.ATTRIBUTE) as Attributor;\n if (attr != null) {\n formats[attr.attrName] = attr.value(node);\n if (formats[attr.attrName]) return;\n }\n attr = ATTRIBUTE_ATTRIBUTORS[name];\n if (attr != null && (attr.attrName === name || attr.keyName === name)) {\n formats[attr.attrName] = attr.value(node) || undefined;\n }\n attr = STYLE_ATTRIBUTORS[name];\n if (attr != null && (attr.attrName === name || attr.keyName === name)) {\n attr = STYLE_ATTRIBUTORS[name];\n formats[attr.attrName] = attr.value(node) || undefined;\n }\n });\n\n return Object.entries(formats).reduce(\n (newDelta, [name, value]) => applyFormat(newDelta, name, value, scroll),\n delta,\n );\n}\n\nfunction matchBlot(node: Node, delta: Delta, scroll: ScrollBlot) {\n const match = scroll.query(node);\n if (match == null) return delta;\n // @ts-expect-error\n if (match.prototype instanceof EmbedBlot) {\n const embed = {};\n // @ts-expect-error\n const value = match.value(node);\n if (value != null) {\n // @ts-expect-error\n embed[match.blotName] = value;\n // @ts-expect-error\n return new Delta().insert(embed, match.formats(node, scroll));\n }\n } else {\n // @ts-expect-error\n if (match.prototype instanceof BlockBlot && !deltaEndsWith(delta, '\\n')) {\n delta.insert('\\n');\n }\n if (\n 'blotName' in match &&\n 'formats' in match &&\n typeof match.formats === 'function'\n ) {\n return applyFormat(\n delta,\n match.blotName,\n match.formats(node, scroll),\n scroll,\n );\n }\n }\n return delta;\n}\n\nfunction matchBreak(node: Node, delta: Delta) {\n if (!deltaEndsWith(delta, '\\n')) {\n delta.insert('\\n');\n }\n return delta;\n}\n\nfunction matchCodeBlock(node: Node, delta: Delta, scroll: ScrollBlot) {\n const match = scroll.query('code-block');\n const language =\n match && 'formats' in match && typeof match.formats === 'function'\n ? match.formats(node, scroll)\n : true;\n return applyFormat(delta, 'code-block', language, scroll);\n}\n\nfunction matchIgnore() {\n return new Delta();\n}\n\nfunction matchIndent(node: Node, delta: Delta, scroll: ScrollBlot) {\n const match = scroll.query(node);\n if (\n match == null ||\n // @ts-expect-error\n match.blotName !== 'list' ||\n !deltaEndsWith(delta, '\\n')\n ) {\n return delta;\n }\n let indent = -1;\n let parent = node.parentNode;\n while (parent != null) {\n // @ts-expect-error\n if (['OL', 'UL'].includes(parent.tagName)) {\n indent += 1;\n }\n parent = parent.parentNode;\n }\n if (indent <= 0) return delta;\n return delta.reduce((composed, op) => {\n if (!op.insert) return composed;\n if (op.attributes && typeof op.attributes.indent === 'number') {\n return composed.push(op);\n }\n return composed.insert(op.insert, { indent, ...(op.attributes || {}) });\n }, new Delta());\n}\n\nfunction matchList(node: Node, delta: Delta, scroll: ScrollBlot) {\n const element = node as Element;\n let list = element.tagName === 'OL' ? 'ordered' : 'bullet';\n\n const checkedAttr = element.getAttribute('data-checked');\n if (checkedAttr) {\n list = checkedAttr === 'true' ? 'checked' : 'unchecked';\n }\n\n return applyFormat(delta, 'list', list, scroll);\n}\n\nfunction matchNewline(node: Node, delta: Delta, scroll: ScrollBlot) {\n if (!deltaEndsWith(delta, '\\n')) {\n if (\n isLine(node, scroll) &&\n (node.childNodes.length > 0 || node instanceof HTMLParagraphElement)\n ) {\n return delta.insert('\\n');\n }\n if (delta.length() > 0 && node.nextSibling) {\n let nextSibling: Node | null = node.nextSibling;\n while (nextSibling != null) {\n if (isLine(nextSibling, scroll)) {\n return delta.insert('\\n');\n }\n const match = scroll.query(nextSibling);\n // @ts-expect-error\n if (match && match.prototype instanceof BlockEmbed) {\n return delta.insert('\\n');\n }\n nextSibling = nextSibling.firstChild;\n }\n }\n }\n return delta;\n}\n\nfunction matchStyles(node: HTMLElement, delta: Delta, scroll: ScrollBlot) {\n const formats: Record = {};\n const style: Partial = node.style || {};\n if (style.fontStyle === 'italic') {\n formats.italic = true;\n }\n if (style.textDecoration === 'underline') {\n formats.underline = true;\n }\n if (style.textDecoration === 'line-through') {\n formats.strike = true;\n }\n if (\n style.fontWeight?.startsWith('bold') ||\n // @ts-expect-error Fix me later\n parseInt(style.fontWeight, 10) >= 700\n ) {\n formats.bold = true;\n }\n delta = Object.entries(formats).reduce(\n (newDelta, [name, value]) => applyFormat(newDelta, name, value, scroll),\n delta,\n );\n // @ts-expect-error\n if (parseFloat(style.textIndent || 0) > 0) {\n // Could be 0.5in\n return new Delta().insert('\\t').concat(delta);\n }\n return delta;\n}\n\nfunction matchTable(\n node: HTMLTableRowElement,\n delta: Delta,\n scroll: ScrollBlot,\n) {\n const table =\n node.parentElement?.tagName === 'TABLE'\n ? node.parentElement\n : node.parentElement?.parentElement;\n if (table != null) {\n const rows = Array.from(table.querySelectorAll('tr'));\n const row = rows.indexOf(node) + 1;\n return applyFormat(delta, 'table', row, scroll);\n }\n return delta;\n}\n\nfunction matchText(node: HTMLElement, delta: Delta, scroll: ScrollBlot) {\n // @ts-expect-error\n let text = node.data as string;\n // Word represents empty line with  \n if (node.parentElement?.tagName === 'O:P') {\n return delta.insert(text.trim());\n }\n if (!isPre(node)) {\n if (\n text.trim().length === 0 &&\n text.includes('\\n') &&\n !isBetweenInlineElements(node, scroll)\n ) {\n return delta;\n }\n // convert all non-nbsp whitespace into regular space\n text = text.replace(/[^\\S\\u00a0]/g, ' ');\n // collapse consecutive spaces into one\n text = text.replace(/ {2,}/g, ' ');\n if (\n (node.previousSibling == null &&\n node.parentElement != null &&\n isLine(node.parentElement, scroll)) ||\n (node.previousSibling instanceof Element &&\n isLine(node.previousSibling, scroll))\n ) {\n // block structure means we don't need leading space\n text = text.replace(/^ /, '');\n }\n if (\n (node.nextSibling == null &&\n node.parentElement != null &&\n isLine(node.parentElement, scroll)) ||\n (node.nextSibling instanceof Element && isLine(node.nextSibling, scroll))\n ) {\n // block structure means we don't need trailing space\n text = text.replace(/ $/, '');\n }\n // done removing whitespace and can normalize all to regular space\n text = text.replaceAll('\\u00a0', ' ');\n }\n return delta.insert(text);\n}\n\nexport {\n Clipboard as default,\n matchAttributor,\n matchBlot,\n matchNewline,\n matchText,\n traverse,\n};\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file diff --git a/public/assets/quill/modules/history.d.ts b/public/assets/quill/modules/history.d.ts new file mode 100644 index 0000000..85b5009 --- /dev/null +++ b/public/assets/quill/modules/history.d.ts @@ -0,0 +1,36 @@ +import type Delta from 'quill-delta'; +import Module from '../core/module.js'; +import Quill from '../core/quill.js'; +import type Scroll from '../blots/scroll.js'; +import type { Range } from '../core/selection.js'; +export interface HistoryOptions { + userOnly: boolean; + delay: number; + maxStack: number; +} +export interface StackItem { + delta: Delta; + range: Range | null; +} +interface Stack { + undo: StackItem[]; + redo: StackItem[]; +} +declare class History extends Module { + static DEFAULTS: HistoryOptions; + lastRecorded: number; + ignoreChange: boolean; + stack: Stack; + currentRange: Range | null; + constructor(quill: Quill, options: Partial); + change(source: 'undo' | 'redo', dest: 'redo' | 'undo'): void; + clear(): void; + cutoff(): void; + record(changeDelta: Delta, oldDelta: Delta): void; + redo(): void; + transform(delta: Delta): void; + undo(): void; + protected restoreSelection(stackItem: StackItem): void; +} +declare function getLastChangeIndex(scroll: Scroll, delta: Delta): number; +export { History as default, getLastChangeIndex }; diff --git a/public/assets/quill/modules/history.js b/public/assets/quill/modules/history.js new file mode 100644 index 0000000..03694b0 --- /dev/null +++ b/public/assets/quill/modules/history.js @@ -0,0 +1,178 @@ +import { Scope } from 'parchment'; +import Module from '../core/module.js'; +import Quill from '../core/quill.js'; +class History extends Module { + static DEFAULTS = { + delay: 1000, + maxStack: 100, + userOnly: false + }; + lastRecorded = 0; + ignoreChange = false; + stack = { + undo: [], + redo: [] + }; + currentRange = null; + constructor(quill, options) { + super(quill, options); + this.quill.on(Quill.events.EDITOR_CHANGE, (eventName, value, oldValue, source) => { + if (eventName === Quill.events.SELECTION_CHANGE) { + if (value && source !== Quill.sources.SILENT) { + this.currentRange = value; + } + } else if (eventName === Quill.events.TEXT_CHANGE) { + if (!this.ignoreChange) { + if (!this.options.userOnly || source === Quill.sources.USER) { + this.record(value, oldValue); + } else { + this.transform(value); + } + } + this.currentRange = transformRange(this.currentRange, value); + } + }); + this.quill.keyboard.addBinding({ + key: 'z', + shortKey: true + }, this.undo.bind(this)); + this.quill.keyboard.addBinding({ + key: ['z', 'Z'], + shortKey: true, + shiftKey: true + }, this.redo.bind(this)); + if (/Win/i.test(navigator.platform)) { + this.quill.keyboard.addBinding({ + key: 'y', + shortKey: true + }, this.redo.bind(this)); + } + this.quill.root.addEventListener('beforeinput', event => { + if (event.inputType === 'historyUndo') { + this.undo(); + event.preventDefault(); + } else if (event.inputType === 'historyRedo') { + this.redo(); + event.preventDefault(); + } + }); + } + change(source, dest) { + if (this.stack[source].length === 0) return; + const item = this.stack[source].pop(); + if (!item) return; + const base = this.quill.getContents(); + const inverseDelta = item.delta.invert(base); + this.stack[dest].push({ + delta: inverseDelta, + range: transformRange(item.range, inverseDelta) + }); + this.lastRecorded = 0; + this.ignoreChange = true; + this.quill.updateContents(item.delta, Quill.sources.USER); + this.ignoreChange = false; + this.restoreSelection(item); + } + clear() { + this.stack = { + undo: [], + redo: [] + }; + } + cutoff() { + this.lastRecorded = 0; + } + record(changeDelta, oldDelta) { + if (changeDelta.ops.length === 0) return; + this.stack.redo = []; + let undoDelta = changeDelta.invert(oldDelta); + let undoRange = this.currentRange; + const timestamp = Date.now(); + if ( + // @ts-expect-error Fix me later + this.lastRecorded + this.options.delay > timestamp && this.stack.undo.length > 0) { + const item = this.stack.undo.pop(); + if (item) { + undoDelta = undoDelta.compose(item.delta); + undoRange = item.range; + } + } else { + this.lastRecorded = timestamp; + } + if (undoDelta.length() === 0) return; + this.stack.undo.push({ + delta: undoDelta, + range: undoRange + }); + // @ts-expect-error Fix me later + if (this.stack.undo.length > this.options.maxStack) { + this.stack.undo.shift(); + } + } + redo() { + this.change('redo', 'undo'); + } + transform(delta) { + transformStack(this.stack.undo, delta); + transformStack(this.stack.redo, delta); + } + undo() { + this.change('undo', 'redo'); + } + restoreSelection(stackItem) { + if (stackItem.range) { + this.quill.setSelection(stackItem.range, Quill.sources.USER); + } else { + const index = getLastChangeIndex(this.quill.scroll, stackItem.delta); + this.quill.setSelection(index, Quill.sources.USER); + } + } +} +function transformStack(stack, delta) { + let remoteDelta = delta; + for (let i = stack.length - 1; i >= 0; i -= 1) { + const oldItem = stack[i]; + stack[i] = { + delta: remoteDelta.transform(oldItem.delta, true), + range: oldItem.range && transformRange(oldItem.range, remoteDelta) + }; + remoteDelta = oldItem.delta.transform(remoteDelta); + if (stack[i].delta.length() === 0) { + stack.splice(i, 1); + } + } +} +function endsWithNewlineChange(scroll, delta) { + const lastOp = delta.ops[delta.ops.length - 1]; + if (lastOp == null) return false; + if (lastOp.insert != null) { + return typeof lastOp.insert === 'string' && lastOp.insert.endsWith('\n'); + } + if (lastOp.attributes != null) { + return Object.keys(lastOp.attributes).some(attr => { + return scroll.query(attr, Scope.BLOCK) != null; + }); + } + return false; +} +function getLastChangeIndex(scroll, delta) { + const deleteLength = delta.reduce((length, op) => { + return length + (op.delete || 0); + }, 0); + let changeIndex = delta.length() - deleteLength; + if (endsWithNewlineChange(scroll, delta)) { + changeIndex -= 1; + } + return changeIndex; +} +function transformRange(range, delta) { + if (!range) return range; + const start = delta.transformPosition(range.index); + const end = delta.transformPosition(range.index + range.length); + return { + index: start, + length: end - start + }; +} +export { History as default, getLastChangeIndex }; +//# sourceMappingURL=history.js.map \ No newline at end of file diff --git a/public/assets/quill/modules/history.js.map b/public/assets/quill/modules/history.js.map new file mode 100644 index 0000000..a5a4343 --- /dev/null +++ b/public/assets/quill/modules/history.js.map @@ -0,0 +1 @@ +{"version":3,"file":"history.js","names":["Scope","Module","Quill","History","DEFAULTS","delay","maxStack","userOnly","lastRecorded","ignoreChange","stack","undo","redo","currentRange","constructor","quill","options","on","events","EDITOR_CHANGE","eventName","value","oldValue","source","SELECTION_CHANGE","sources","SILENT","TEXT_CHANGE","USER","record","transform","transformRange","keyboard","addBinding","key","shortKey","bind","shiftKey","test","navigator","platform","root","addEventListener","event","inputType","preventDefault","change","dest","length","item","pop","base","getContents","inverseDelta","delta","invert","push","range","updateContents","restoreSelection","clear","cutoff","changeDelta","oldDelta","ops","undoDelta","undoRange","timestamp","Date","now","compose","shift","transformStack","stackItem","setSelection","index","getLastChangeIndex","scroll","remoteDelta","i","oldItem","splice","endsWithNewlineChange","lastOp","insert","endsWith","attributes","Object","keys","some","attr","query","BLOCK","deleteLength","reduce","op","delete","changeIndex","start","transformPosition","end","default"],"sources":["../../src/modules/history.ts"],"sourcesContent":["import { Scope } from 'parchment';\nimport type Delta from 'quill-delta';\nimport Module from '../core/module.js';\nimport Quill from '../core/quill.js';\nimport type Scroll from '../blots/scroll.js';\nimport type { Range } from '../core/selection.js';\n\nexport interface HistoryOptions {\n userOnly: boolean;\n delay: number;\n maxStack: number;\n}\n\nexport interface StackItem {\n delta: Delta;\n range: Range | null;\n}\n\ninterface Stack {\n undo: StackItem[];\n redo: StackItem[];\n}\n\nclass History extends Module {\n static DEFAULTS: HistoryOptions = {\n delay: 1000,\n maxStack: 100,\n userOnly: false,\n };\n\n lastRecorded = 0;\n ignoreChange = false;\n stack: Stack = { undo: [], redo: [] };\n currentRange: Range | null = null;\n\n constructor(quill: Quill, options: Partial) {\n super(quill, options);\n this.quill.on(\n Quill.events.EDITOR_CHANGE,\n (eventName, value, oldValue, source) => {\n if (eventName === Quill.events.SELECTION_CHANGE) {\n if (value && source !== Quill.sources.SILENT) {\n this.currentRange = value;\n }\n } else if (eventName === Quill.events.TEXT_CHANGE) {\n if (!this.ignoreChange) {\n if (!this.options.userOnly || source === Quill.sources.USER) {\n this.record(value, oldValue);\n } else {\n this.transform(value);\n }\n }\n\n this.currentRange = transformRange(this.currentRange, value);\n }\n },\n );\n\n this.quill.keyboard.addBinding(\n { key: 'z', shortKey: true },\n this.undo.bind(this),\n );\n this.quill.keyboard.addBinding(\n { key: ['z', 'Z'], shortKey: true, shiftKey: true },\n this.redo.bind(this),\n );\n if (/Win/i.test(navigator.platform)) {\n this.quill.keyboard.addBinding(\n { key: 'y', shortKey: true },\n this.redo.bind(this),\n );\n }\n\n this.quill.root.addEventListener('beforeinput', (event) => {\n if (event.inputType === 'historyUndo') {\n this.undo();\n event.preventDefault();\n } else if (event.inputType === 'historyRedo') {\n this.redo();\n event.preventDefault();\n }\n });\n }\n\n change(source: 'undo' | 'redo', dest: 'redo' | 'undo') {\n if (this.stack[source].length === 0) return;\n const item = this.stack[source].pop();\n if (!item) return;\n const base = this.quill.getContents();\n const inverseDelta = item.delta.invert(base);\n this.stack[dest].push({\n delta: inverseDelta,\n range: transformRange(item.range, inverseDelta),\n });\n this.lastRecorded = 0;\n this.ignoreChange = true;\n this.quill.updateContents(item.delta, Quill.sources.USER);\n this.ignoreChange = false;\n\n this.restoreSelection(item);\n }\n\n clear() {\n this.stack = { undo: [], redo: [] };\n }\n\n cutoff() {\n this.lastRecorded = 0;\n }\n\n record(changeDelta: Delta, oldDelta: Delta) {\n if (changeDelta.ops.length === 0) return;\n this.stack.redo = [];\n let undoDelta = changeDelta.invert(oldDelta);\n let undoRange = this.currentRange;\n const timestamp = Date.now();\n if (\n // @ts-expect-error Fix me later\n this.lastRecorded + this.options.delay > timestamp &&\n this.stack.undo.length > 0\n ) {\n const item = this.stack.undo.pop();\n if (item) {\n undoDelta = undoDelta.compose(item.delta);\n undoRange = item.range;\n }\n } else {\n this.lastRecorded = timestamp;\n }\n if (undoDelta.length() === 0) return;\n this.stack.undo.push({ delta: undoDelta, range: undoRange });\n // @ts-expect-error Fix me later\n if (this.stack.undo.length > this.options.maxStack) {\n this.stack.undo.shift();\n }\n }\n\n redo() {\n this.change('redo', 'undo');\n }\n\n transform(delta: Delta) {\n transformStack(this.stack.undo, delta);\n transformStack(this.stack.redo, delta);\n }\n\n undo() {\n this.change('undo', 'redo');\n }\n\n protected restoreSelection(stackItem: StackItem) {\n if (stackItem.range) {\n this.quill.setSelection(stackItem.range, Quill.sources.USER);\n } else {\n const index = getLastChangeIndex(this.quill.scroll, stackItem.delta);\n this.quill.setSelection(index, Quill.sources.USER);\n }\n }\n}\n\nfunction transformStack(stack: StackItem[], delta: Delta) {\n let remoteDelta = delta;\n for (let i = stack.length - 1; i >= 0; i -= 1) {\n const oldItem = stack[i];\n stack[i] = {\n delta: remoteDelta.transform(oldItem.delta, true),\n range: oldItem.range && transformRange(oldItem.range, remoteDelta),\n };\n remoteDelta = oldItem.delta.transform(remoteDelta);\n if (stack[i].delta.length() === 0) {\n stack.splice(i, 1);\n }\n }\n}\n\nfunction endsWithNewlineChange(scroll: Scroll, delta: Delta) {\n const lastOp = delta.ops[delta.ops.length - 1];\n if (lastOp == null) return false;\n if (lastOp.insert != null) {\n return typeof lastOp.insert === 'string' && lastOp.insert.endsWith('\\n');\n }\n if (lastOp.attributes != null) {\n return Object.keys(lastOp.attributes).some((attr) => {\n return scroll.query(attr, Scope.BLOCK) != null;\n });\n }\n return false;\n}\n\nfunction getLastChangeIndex(scroll: Scroll, delta: Delta) {\n const deleteLength = delta.reduce((length, op) => {\n return length + (op.delete || 0);\n }, 0);\n let changeIndex = delta.length() - deleteLength;\n if (endsWithNewlineChange(scroll, delta)) {\n changeIndex -= 1;\n }\n return changeIndex;\n}\n\nfunction transformRange(range: Range | null, delta: Delta) {\n if (!range) return range;\n const start = delta.transformPosition(range.index);\n const end = delta.transformPosition(range.index + range.length);\n return { index: start, length: end - start };\n}\n\nexport { History as default, getLastChangeIndex };\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file diff --git a/public/assets/quill/modules/input.d.ts b/public/assets/quill/modules/input.d.ts new file mode 100644 index 0000000..5d2e512 --- /dev/null +++ b/public/assets/quill/modules/input.d.ts @@ -0,0 +1,10 @@ +import Module from '../core/module.js'; +import Quill from '../core/quill.js'; +declare class Input extends Module { + constructor(quill: Quill, options: Record); + private deleteRange; + private replaceText; + private handleBeforeInput; + private handleCompositionStart; +} +export default Input; diff --git a/public/assets/quill/modules/input.js b/public/assets/quill/modules/input.js new file mode 100644 index 0000000..cf1e06e --- /dev/null +++ b/public/assets/quill/modules/input.js @@ -0,0 +1,83 @@ +import Delta from 'quill-delta'; +import Module from '../core/module.js'; +import Quill from '../core/quill.js'; +import { deleteRange } from './keyboard.js'; +const INSERT_TYPES = ['insertText', 'insertReplacementText']; +class Input extends Module { + constructor(quill, options) { + super(quill, options); + quill.root.addEventListener('beforeinput', event => { + this.handleBeforeInput(event); + }); + + // Gboard with English input on Android triggers `compositionstart` sometimes even + // users are not going to type anything. + if (!/Android/i.test(navigator.userAgent)) { + quill.on(Quill.events.COMPOSITION_BEFORE_START, () => { + this.handleCompositionStart(); + }); + } + } + deleteRange(range) { + deleteRange({ + range, + quill: this.quill + }); + } + replaceText(range) { + let text = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ''; + if (range.length === 0) return false; + if (text) { + // Follow the native behavior that inherits the formats of the first character + const formats = this.quill.getFormat(range.index, 1); + this.deleteRange(range); + this.quill.updateContents(new Delta().retain(range.index).insert(text, formats), Quill.sources.USER); + } else { + this.deleteRange(range); + } + this.quill.setSelection(range.index + text.length, 0, Quill.sources.SILENT); + return true; + } + handleBeforeInput(event) { + if (this.quill.composition.isComposing || event.defaultPrevented || !INSERT_TYPES.includes(event.inputType)) { + return; + } + const staticRange = event.getTargetRanges ? event.getTargetRanges()[0] : null; + if (!staticRange || staticRange.collapsed === true) { + return; + } + const text = getPlainTextFromInputEvent(event); + if (text == null) { + return; + } + const normalized = this.quill.selection.normalizeNative(staticRange); + const range = normalized ? this.quill.selection.normalizedToRange(normalized) : null; + if (range && this.replaceText(range, text)) { + event.preventDefault(); + } + } + handleCompositionStart() { + const range = this.quill.getSelection(); + if (range) { + this.replaceText(range); + } + } +} +function getPlainTextFromInputEvent(event) { + // When `inputType` is "insertText": + // - `event.data` should be string (Safari uses `event.dataTransfer`). + // - `event.dataTransfer` should be null. + // When `inputType` is "insertReplacementText": + // - `event.data` should be null. + // - `event.dataTransfer` should contain "text/plain" data. + + if (typeof event.data === 'string') { + return event.data; + } + if (event.dataTransfer?.types.includes('text/plain')) { + return event.dataTransfer.getData('text/plain'); + } + return null; +} +export default Input; +//# sourceMappingURL=input.js.map \ No newline at end of file diff --git a/public/assets/quill/modules/input.js.map b/public/assets/quill/modules/input.js.map new file mode 100644 index 0000000..f01a056 --- /dev/null +++ b/public/assets/quill/modules/input.js.map @@ -0,0 +1 @@ +{"version":3,"file":"input.js","names":["Delta","Module","Quill","deleteRange","INSERT_TYPES","Input","constructor","quill","options","root","addEventListener","event","handleBeforeInput","test","navigator","userAgent","on","events","COMPOSITION_BEFORE_START","handleCompositionStart","range","replaceText","text","arguments","length","undefined","formats","getFormat","index","updateContents","retain","insert","sources","USER","setSelection","SILENT","composition","isComposing","defaultPrevented","includes","inputType","staticRange","getTargetRanges","collapsed","getPlainTextFromInputEvent","normalized","selection","normalizeNative","normalizedToRange","preventDefault","getSelection","data","dataTransfer","types","getData"],"sources":["../../src/modules/input.ts"],"sourcesContent":["import Delta from 'quill-delta';\nimport Module from '../core/module.js';\nimport Quill from '../core/quill.js';\nimport type { Range } from '../core/selection.js';\nimport { deleteRange } from './keyboard.js';\n\nconst INSERT_TYPES = ['insertText', 'insertReplacementText'];\n\nclass Input extends Module {\n constructor(quill: Quill, options: Record) {\n super(quill, options);\n\n quill.root.addEventListener('beforeinput', (event) => {\n this.handleBeforeInput(event);\n });\n\n // Gboard with English input on Android triggers `compositionstart` sometimes even\n // users are not going to type anything.\n if (!/Android/i.test(navigator.userAgent)) {\n quill.on(Quill.events.COMPOSITION_BEFORE_START, () => {\n this.handleCompositionStart();\n });\n }\n }\n\n private deleteRange(range: Range) {\n deleteRange({ range, quill: this.quill });\n }\n\n private replaceText(range: Range, text = '') {\n if (range.length === 0) return false;\n\n if (text) {\n // Follow the native behavior that inherits the formats of the first character\n const formats = this.quill.getFormat(range.index, 1);\n this.deleteRange(range);\n this.quill.updateContents(\n new Delta().retain(range.index).insert(text, formats),\n Quill.sources.USER,\n );\n } else {\n this.deleteRange(range);\n }\n\n this.quill.setSelection(range.index + text.length, 0, Quill.sources.SILENT);\n return true;\n }\n\n private handleBeforeInput(event: InputEvent) {\n if (\n this.quill.composition.isComposing ||\n event.defaultPrevented ||\n !INSERT_TYPES.includes(event.inputType)\n ) {\n return;\n }\n\n const staticRange = event.getTargetRanges\n ? event.getTargetRanges()[0]\n : null;\n if (!staticRange || staticRange.collapsed === true) {\n return;\n }\n\n const text = getPlainTextFromInputEvent(event);\n if (text == null) {\n return;\n }\n const normalized = this.quill.selection.normalizeNative(staticRange);\n const range = normalized\n ? this.quill.selection.normalizedToRange(normalized)\n : null;\n if (range && this.replaceText(range, text)) {\n event.preventDefault();\n }\n }\n\n private handleCompositionStart() {\n const range = this.quill.getSelection();\n if (range) {\n this.replaceText(range);\n }\n }\n}\n\nfunction getPlainTextFromInputEvent(event: InputEvent) {\n // When `inputType` is \"insertText\":\n // - `event.data` should be string (Safari uses `event.dataTransfer`).\n // - `event.dataTransfer` should be null.\n // When `inputType` is \"insertReplacementText\":\n // - `event.data` should be null.\n // - `event.dataTransfer` should contain \"text/plain\" data.\n\n if (typeof event.data === 'string') {\n return event.data;\n }\n if (event.dataTransfer?.types.includes('text/plain')) {\n return event.dataTransfer.getData('text/plain');\n }\n return null;\n}\n\nexport default Input;\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file diff --git a/public/assets/quill/modules/keyboard.d.ts b/public/assets/quill/modules/keyboard.d.ts new file mode 100644 index 0000000..5298e17 --- /dev/null +++ b/public/assets/quill/modules/keyboard.d.ts @@ -0,0 +1,58 @@ +import type { BlockBlot } from 'parchment'; +import Quill from '../core/quill.js'; +import Module from '../core/module.js'; +import type { BlockEmbed } from '../blots/block.js'; +import type { Range } from '../core/selection.js'; +declare const SHORTKEY: string; +export interface Context { + collapsed: boolean; + empty: boolean; + offset: number; + prefix: string; + suffix: string; + format: Record; + event: KeyboardEvent; + line: BlockEmbed | BlockBlot; +} +interface BindingObject extends Partial> { + key: number | string | string[]; + shortKey?: boolean | null; + shiftKey?: boolean | null; + altKey?: boolean | null; + metaKey?: boolean | null; + ctrlKey?: boolean | null; + prefix?: RegExp; + suffix?: RegExp; + format?: Record | string[]; + handler?: (this: { + quill: Quill; + }, range: Range, curContext: Context, binding: NormalizedBinding) => boolean | void; +} +type Binding = BindingObject | string | number; +interface NormalizedBinding extends Omit { + key: string | number; +} +interface KeyboardOptions { + bindings: Record; +} +interface KeyboardOptions { + bindings: Record; +} +declare class Keyboard extends Module { + static DEFAULTS: KeyboardOptions; + static match(evt: KeyboardEvent, binding: BindingObject): boolean; + bindings: Record; + constructor(quill: Quill, options: Partial); + addBinding(keyBinding: Binding, context?: Required | Partial>, handler?: Required | Partial>): void; + listen(): void; + handleBackspace(range: Range, context: Context): void; + handleDelete(range: Range, context: Context): void; + handleDeleteRange(range: Range): void; + handleEnter(range: Range, context: Context): void; +} +declare function normalize(binding: Binding): BindingObject | null; +declare function deleteRange({ quill, range }: { + quill: Quill; + range: Range; +}): void; +export { Keyboard as default, SHORTKEY, normalize, deleteRange }; diff --git a/public/assets/quill/modules/keyboard.js b/public/assets/quill/modules/keyboard.js new file mode 100644 index 0000000..2113f22 --- /dev/null +++ b/public/assets/quill/modules/keyboard.js @@ -0,0 +1,713 @@ +import { cloneDeep, isEqual } from 'lodash-es'; +import Delta, { AttributeMap } from 'quill-delta'; +import { EmbedBlot, Scope, TextBlot } from 'parchment'; +import Quill from '../core/quill.js'; +import logger from '../core/logger.js'; +import Module from '../core/module.js'; +const debug = logger('quill:keyboard'); +const SHORTKEY = /Mac/i.test(navigator.platform) ? 'metaKey' : 'ctrlKey'; +class Keyboard extends Module { + static match(evt, binding) { + if (['altKey', 'ctrlKey', 'metaKey', 'shiftKey'].some(key => { + return !!binding[key] !== evt[key] && binding[key] !== null; + })) { + return false; + } + return binding.key === evt.key || binding.key === evt.which; + } + constructor(quill, options) { + super(quill, options); + this.bindings = {}; + // @ts-expect-error Fix me later + Object.keys(this.options.bindings).forEach(name => { + // @ts-expect-error Fix me later + if (this.options.bindings[name]) { + // @ts-expect-error Fix me later + this.addBinding(this.options.bindings[name]); + } + }); + this.addBinding({ + key: 'Enter', + shiftKey: null + }, this.handleEnter); + this.addBinding({ + key: 'Enter', + metaKey: null, + ctrlKey: null, + altKey: null + }, () => {}); + if (/Firefox/i.test(navigator.userAgent)) { + // Need to handle delete and backspace for Firefox in the general case #1171 + this.addBinding({ + key: 'Backspace' + }, { + collapsed: true + }, this.handleBackspace); + this.addBinding({ + key: 'Delete' + }, { + collapsed: true + }, this.handleDelete); + } else { + this.addBinding({ + key: 'Backspace' + }, { + collapsed: true, + prefix: /^.?$/ + }, this.handleBackspace); + this.addBinding({ + key: 'Delete' + }, { + collapsed: true, + suffix: /^.?$/ + }, this.handleDelete); + } + this.addBinding({ + key: 'Backspace' + }, { + collapsed: false + }, this.handleDeleteRange); + this.addBinding({ + key: 'Delete' + }, { + collapsed: false + }, this.handleDeleteRange); + this.addBinding({ + key: 'Backspace', + altKey: null, + ctrlKey: null, + metaKey: null, + shiftKey: null + }, { + collapsed: true, + offset: 0 + }, this.handleBackspace); + this.listen(); + } + addBinding(keyBinding) { + let context = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + let handler = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + const binding = normalize(keyBinding); + if (binding == null) { + debug.warn('Attempted to add invalid keyboard binding', binding); + return; + } + if (typeof context === 'function') { + context = { + handler: context + }; + } + if (typeof handler === 'function') { + handler = { + handler + }; + } + const keys = Array.isArray(binding.key) ? binding.key : [binding.key]; + keys.forEach(key => { + const singleBinding = { + ...binding, + key, + ...context, + ...handler + }; + this.bindings[singleBinding.key] = this.bindings[singleBinding.key] || []; + this.bindings[singleBinding.key].push(singleBinding); + }); + } + listen() { + this.quill.root.addEventListener('keydown', evt => { + if (evt.defaultPrevented || evt.isComposing) return; + + // evt.isComposing is false when pressing Enter/Backspace when composing in Safari + // https://bugs.webkit.org/show_bug.cgi?id=165004 + const isComposing = evt.keyCode === 229 && (evt.key === 'Enter' || evt.key === 'Backspace'); + if (isComposing) return; + const bindings = (this.bindings[evt.key] || []).concat(this.bindings[evt.which] || []); + const matches = bindings.filter(binding => Keyboard.match(evt, binding)); + if (matches.length === 0) return; + // @ts-expect-error + const blot = Quill.find(evt.target, true); + if (blot && blot.scroll !== this.quill.scroll) return; + const range = this.quill.getSelection(); + if (range == null || !this.quill.hasFocus()) return; + const [line, offset] = this.quill.getLine(range.index); + const [leafStart, offsetStart] = this.quill.getLeaf(range.index); + const [leafEnd, offsetEnd] = range.length === 0 ? [leafStart, offsetStart] : this.quill.getLeaf(range.index + range.length); + const prefixText = leafStart instanceof TextBlot ? leafStart.value().slice(0, offsetStart) : ''; + const suffixText = leafEnd instanceof TextBlot ? leafEnd.value().slice(offsetEnd) : ''; + const curContext = { + collapsed: range.length === 0, + // @ts-expect-error Fix me later + empty: range.length === 0 && line.length() <= 1, + format: this.quill.getFormat(range), + line, + offset, + prefix: prefixText, + suffix: suffixText, + event: evt + }; + const prevented = matches.some(binding => { + if (binding.collapsed != null && binding.collapsed !== curContext.collapsed) { + return false; + } + if (binding.empty != null && binding.empty !== curContext.empty) { + return false; + } + if (binding.offset != null && binding.offset !== curContext.offset) { + return false; + } + if (Array.isArray(binding.format)) { + // any format is present + if (binding.format.every(name => curContext.format[name] == null)) { + return false; + } + } else if (typeof binding.format === 'object') { + // all formats must match + if (!Object.keys(binding.format).every(name => { + // @ts-expect-error Fix me later + if (binding.format[name] === true) return curContext.format[name] != null; + // @ts-expect-error Fix me later + if (binding.format[name] === false) return curContext.format[name] == null; + // @ts-expect-error Fix me later + return isEqual(binding.format[name], curContext.format[name]); + })) { + return false; + } + } + if (binding.prefix != null && !binding.prefix.test(curContext.prefix)) { + return false; + } + if (binding.suffix != null && !binding.suffix.test(curContext.suffix)) { + return false; + } + // @ts-expect-error Fix me later + return binding.handler.call(this, range, curContext, binding) !== true; + }); + if (prevented) { + evt.preventDefault(); + } + }); + } + handleBackspace(range, context) { + // Check for astral symbols + const length = /[\uD800-\uDBFF][\uDC00-\uDFFF]$/.test(context.prefix) ? 2 : 1; + if (range.index === 0 || this.quill.getLength() <= 1) return; + let formats = {}; + const [line] = this.quill.getLine(range.index); + let delta = new Delta().retain(range.index - length).delete(length); + if (context.offset === 0) { + // Always deleting newline here, length always 1 + const [prev] = this.quill.getLine(range.index - 1); + if (prev) { + const isPrevLineEmpty = prev.statics.blotName === 'block' && prev.length() <= 1; + if (!isPrevLineEmpty) { + // @ts-expect-error Fix me later + const curFormats = line.formats(); + const prevFormats = this.quill.getFormat(range.index - 1, 1); + formats = AttributeMap.diff(curFormats, prevFormats) || {}; + if (Object.keys(formats).length > 0) { + // line.length() - 1 targets \n in line, another -1 for newline being deleted + const formatDelta = new Delta() + // @ts-expect-error Fix me later + .retain(range.index + line.length() - 2).retain(1, formats); + delta = delta.compose(formatDelta); + } + } + } + } + this.quill.updateContents(delta, Quill.sources.USER); + this.quill.focus(); + } + handleDelete(range, context) { + // Check for astral symbols + const length = /^[\uD800-\uDBFF][\uDC00-\uDFFF]/.test(context.suffix) ? 2 : 1; + if (range.index >= this.quill.getLength() - length) return; + let formats = {}; + const [line] = this.quill.getLine(range.index); + let delta = new Delta().retain(range.index).delete(length); + // @ts-expect-error Fix me later + if (context.offset >= line.length() - 1) { + const [next] = this.quill.getLine(range.index + 1); + if (next) { + // @ts-expect-error Fix me later + const curFormats = line.formats(); + const nextFormats = this.quill.getFormat(range.index, 1); + formats = AttributeMap.diff(curFormats, nextFormats) || {}; + if (Object.keys(formats).length > 0) { + delta = delta.retain(next.length() - 1).retain(1, formats); + } + } + } + this.quill.updateContents(delta, Quill.sources.USER); + this.quill.focus(); + } + handleDeleteRange(range) { + deleteRange({ + range, + quill: this.quill + }); + this.quill.focus(); + } + handleEnter(range, context) { + const lineFormats = Object.keys(context.format).reduce((formats, format) => { + if (this.quill.scroll.query(format, Scope.BLOCK) && !Array.isArray(context.format[format])) { + formats[format] = context.format[format]; + } + return formats; + }, {}); + const delta = new Delta().retain(range.index).delete(range.length).insert('\n', lineFormats); + this.quill.updateContents(delta, Quill.sources.USER); + this.quill.setSelection(range.index + 1, Quill.sources.SILENT); + this.quill.focus(); + } +} +const defaultOptions = { + bindings: { + bold: makeFormatHandler('bold'), + italic: makeFormatHandler('italic'), + underline: makeFormatHandler('underline'), + indent: { + // highlight tab or tab at beginning of list, indent or blockquote + key: 'Tab', + format: ['blockquote', 'indent', 'list'], + handler(range, context) { + if (context.collapsed && context.offset !== 0) return true; + this.quill.format('indent', '+1', Quill.sources.USER); + return false; + } + }, + outdent: { + key: 'Tab', + shiftKey: true, + format: ['blockquote', 'indent', 'list'], + // highlight tab or tab at beginning of list, indent or blockquote + handler(range, context) { + if (context.collapsed && context.offset !== 0) return true; + this.quill.format('indent', '-1', Quill.sources.USER); + return false; + } + }, + 'outdent backspace': { + key: 'Backspace', + collapsed: true, + shiftKey: null, + metaKey: null, + ctrlKey: null, + altKey: null, + format: ['indent', 'list'], + offset: 0, + handler(range, context) { + if (context.format.indent != null) { + this.quill.format('indent', '-1', Quill.sources.USER); + } else if (context.format.list != null) { + this.quill.format('list', false, Quill.sources.USER); + } + } + }, + 'indent code-block': makeCodeBlockHandler(true), + 'outdent code-block': makeCodeBlockHandler(false), + 'remove tab': { + key: 'Tab', + shiftKey: true, + collapsed: true, + prefix: /\t$/, + handler(range) { + this.quill.deleteText(range.index - 1, 1, Quill.sources.USER); + } + }, + tab: { + key: 'Tab', + handler(range, context) { + if (context.format.table) return true; + this.quill.history.cutoff(); + const delta = new Delta().retain(range.index).delete(range.length).insert('\t'); + this.quill.updateContents(delta, Quill.sources.USER); + this.quill.history.cutoff(); + this.quill.setSelection(range.index + 1, Quill.sources.SILENT); + return false; + } + }, + 'blockquote empty enter': { + key: 'Enter', + collapsed: true, + format: ['blockquote'], + empty: true, + handler() { + this.quill.format('blockquote', false, Quill.sources.USER); + } + }, + 'list empty enter': { + key: 'Enter', + collapsed: true, + format: ['list'], + empty: true, + handler(range, context) { + const formats = { + list: false + }; + if (context.format.indent) { + formats.indent = false; + } + this.quill.formatLine(range.index, range.length, formats, Quill.sources.USER); + } + }, + 'checklist enter': { + key: 'Enter', + collapsed: true, + format: { + list: 'checked' + }, + handler(range) { + const [line, offset] = this.quill.getLine(range.index); + const formats = { + // @ts-expect-error Fix me later + ...line.formats(), + list: 'checked' + }; + const delta = new Delta().retain(range.index).insert('\n', formats) + // @ts-expect-error Fix me later + .retain(line.length() - offset - 1).retain(1, { + list: 'unchecked' + }); + this.quill.updateContents(delta, Quill.sources.USER); + this.quill.setSelection(range.index + 1, Quill.sources.SILENT); + this.quill.scrollSelectionIntoView(); + } + }, + 'header enter': { + key: 'Enter', + collapsed: true, + format: ['header'], + suffix: /^$/, + handler(range, context) { + const [line, offset] = this.quill.getLine(range.index); + const delta = new Delta().retain(range.index).insert('\n', context.format) + // @ts-expect-error Fix me later + .retain(line.length() - offset - 1).retain(1, { + header: null + }); + this.quill.updateContents(delta, Quill.sources.USER); + this.quill.setSelection(range.index + 1, Quill.sources.SILENT); + this.quill.scrollSelectionIntoView(); + } + }, + 'table backspace': { + key: 'Backspace', + format: ['table'], + collapsed: true, + offset: 0, + handler() {} + }, + 'table delete': { + key: 'Delete', + format: ['table'], + collapsed: true, + suffix: /^$/, + handler() {} + }, + 'table enter': { + key: 'Enter', + shiftKey: null, + format: ['table'], + handler(range) { + const module = this.quill.getModule('table'); + if (module) { + // @ts-expect-error + const [table, row, cell, offset] = module.getTable(range); + const shift = tableSide(table, row, cell, offset); + if (shift == null) return; + let index = table.offset(); + if (shift < 0) { + const delta = new Delta().retain(index).insert('\n'); + this.quill.updateContents(delta, Quill.sources.USER); + this.quill.setSelection(range.index + 1, range.length, Quill.sources.SILENT); + } else if (shift > 0) { + index += table.length(); + const delta = new Delta().retain(index).insert('\n'); + this.quill.updateContents(delta, Quill.sources.USER); + this.quill.setSelection(index, Quill.sources.USER); + } + } + } + }, + 'table tab': { + key: 'Tab', + shiftKey: null, + format: ['table'], + handler(range, context) { + const { + event, + line: cell + } = context; + const offset = cell.offset(this.quill.scroll); + if (event.shiftKey) { + this.quill.setSelection(offset - 1, Quill.sources.USER); + } else { + this.quill.setSelection(offset + cell.length(), Quill.sources.USER); + } + } + }, + 'list autofill': { + key: ' ', + shiftKey: null, + collapsed: true, + format: { + 'code-block': false, + blockquote: false, + table: false + }, + prefix: /^\s*?(\d+\.|-|\*|\[ ?\]|\[x\])$/, + handler(range, context) { + if (this.quill.scroll.query('list') == null) return true; + const { + length + } = context.prefix; + const [line, offset] = this.quill.getLine(range.index); + if (offset > length) return true; + let value; + switch (context.prefix.trim()) { + case '[]': + case '[ ]': + value = 'unchecked'; + break; + case '[x]': + value = 'checked'; + break; + case '-': + case '*': + value = 'bullet'; + break; + default: + value = 'ordered'; + } + this.quill.insertText(range.index, ' ', Quill.sources.USER); + this.quill.history.cutoff(); + const delta = new Delta().retain(range.index - offset).delete(length + 1) + // @ts-expect-error Fix me later + .retain(line.length() - 2 - offset).retain(1, { + list: value + }); + this.quill.updateContents(delta, Quill.sources.USER); + this.quill.history.cutoff(); + this.quill.setSelection(range.index - length, Quill.sources.SILENT); + return false; + } + }, + 'code exit': { + key: 'Enter', + collapsed: true, + format: ['code-block'], + prefix: /^$/, + suffix: /^\s*$/, + handler(range) { + const [line, offset] = this.quill.getLine(range.index); + let numLines = 2; + let cur = line; + while (cur != null && cur.length() <= 1 && cur.formats()['code-block']) { + // @ts-expect-error + cur = cur.prev; + numLines -= 1; + // Requisite prev lines are empty + if (numLines <= 0) { + const delta = new Delta() + // @ts-expect-error Fix me later + .retain(range.index + line.length() - offset - 2).retain(1, { + 'code-block': null + }).delete(1); + this.quill.updateContents(delta, Quill.sources.USER); + this.quill.setSelection(range.index - 1, Quill.sources.SILENT); + return false; + } + } + return true; + } + }, + 'embed left': makeEmbedArrowHandler('ArrowLeft', false), + 'embed left shift': makeEmbedArrowHandler('ArrowLeft', true), + 'embed right': makeEmbedArrowHandler('ArrowRight', false), + 'embed right shift': makeEmbedArrowHandler('ArrowRight', true), + 'table down': makeTableArrowHandler(false), + 'table up': makeTableArrowHandler(true) + } +}; +Keyboard.DEFAULTS = defaultOptions; +function makeCodeBlockHandler(indent) { + return { + key: 'Tab', + shiftKey: !indent, + format: { + 'code-block': true + }, + handler(range, _ref) { + let { + event + } = _ref; + const CodeBlock = this.quill.scroll.query('code-block'); + // @ts-expect-error + const { + TAB + } = CodeBlock; + if (range.length === 0 && !event.shiftKey) { + this.quill.insertText(range.index, TAB, Quill.sources.USER); + this.quill.setSelection(range.index + TAB.length, Quill.sources.SILENT); + return; + } + const lines = range.length === 0 ? this.quill.getLines(range.index, 1) : this.quill.getLines(range); + let { + index, + length + } = range; + lines.forEach((line, i) => { + if (indent) { + line.insertAt(0, TAB); + if (i === 0) { + index += TAB.length; + } else { + length += TAB.length; + } + // @ts-expect-error Fix me later + } else if (line.domNode.textContent.startsWith(TAB)) { + line.deleteAt(0, TAB.length); + if (i === 0) { + index -= TAB.length; + } else { + length -= TAB.length; + } + } + }); + this.quill.update(Quill.sources.USER); + this.quill.setSelection(index, length, Quill.sources.SILENT); + } + }; +} +function makeEmbedArrowHandler(key, shiftKey) { + const where = key === 'ArrowLeft' ? 'prefix' : 'suffix'; + return { + key, + shiftKey, + altKey: null, + [where]: /^$/, + handler(range) { + let { + index + } = range; + if (key === 'ArrowRight') { + index += range.length + 1; + } + const [leaf] = this.quill.getLeaf(index); + if (!(leaf instanceof EmbedBlot)) return true; + if (key === 'ArrowLeft') { + if (shiftKey) { + this.quill.setSelection(range.index - 1, range.length + 1, Quill.sources.USER); + } else { + this.quill.setSelection(range.index - 1, Quill.sources.USER); + } + } else if (shiftKey) { + this.quill.setSelection(range.index, range.length + 1, Quill.sources.USER); + } else { + this.quill.setSelection(range.index + range.length + 1, Quill.sources.USER); + } + return false; + } + }; +} +function makeFormatHandler(format) { + return { + key: format[0], + shortKey: true, + handler(range, context) { + this.quill.format(format, !context.format[format], Quill.sources.USER); + } + }; +} +function makeTableArrowHandler(up) { + return { + key: up ? 'ArrowUp' : 'ArrowDown', + collapsed: true, + format: ['table'], + handler(range, context) { + // TODO move to table module + const key = up ? 'prev' : 'next'; + const cell = context.line; + const targetRow = cell.parent[key]; + if (targetRow != null) { + if (targetRow.statics.blotName === 'table-row') { + // @ts-expect-error + let targetCell = targetRow.children.head; + let cur = cell; + while (cur.prev != null) { + // @ts-expect-error + cur = cur.prev; + targetCell = targetCell.next; + } + const index = targetCell.offset(this.quill.scroll) + Math.min(context.offset, targetCell.length() - 1); + this.quill.setSelection(index, 0, Quill.sources.USER); + } + } else { + // @ts-expect-error + const targetLine = cell.table()[key]; + if (targetLine != null) { + if (up) { + this.quill.setSelection(targetLine.offset(this.quill.scroll) + targetLine.length() - 1, 0, Quill.sources.USER); + } else { + this.quill.setSelection(targetLine.offset(this.quill.scroll), 0, Quill.sources.USER); + } + } + } + return false; + } + }; +} +function normalize(binding) { + if (typeof binding === 'string' || typeof binding === 'number') { + binding = { + key: binding + }; + } else if (typeof binding === 'object') { + binding = cloneDeep(binding); + } else { + return null; + } + if (binding.shortKey) { + binding[SHORTKEY] = binding.shortKey; + delete binding.shortKey; + } + return binding; +} + +// TODO: Move into quill.ts or editor.ts +function deleteRange(_ref2) { + let { + quill, + range + } = _ref2; + const lines = quill.getLines(range); + let formats = {}; + if (lines.length > 1) { + const firstFormats = lines[0].formats(); + const lastFormats = lines[lines.length - 1].formats(); + formats = AttributeMap.diff(lastFormats, firstFormats) || {}; + } + quill.deleteText(range, Quill.sources.USER); + if (Object.keys(formats).length > 0) { + quill.formatLine(range.index, 1, formats, Quill.sources.USER); + } + quill.setSelection(range.index, Quill.sources.SILENT); +} +function tableSide(_table, row, cell, offset) { + if (row.prev == null && row.next == null) { + if (cell.prev == null && cell.next == null) { + return offset === 0 ? -1 : 1; + } + return cell.prev == null ? -1 : 1; + } + if (row.prev == null) { + return -1; + } + if (row.next == null) { + return 1; + } + return null; +} +export { Keyboard as default, SHORTKEY, normalize, deleteRange }; +//# sourceMappingURL=keyboard.js.map \ No newline at end of file diff --git a/public/assets/quill/modules/keyboard.js.map b/public/assets/quill/modules/keyboard.js.map new file mode 100644 index 0000000..50d3522 --- /dev/null +++ b/public/assets/quill/modules/keyboard.js.map @@ -0,0 +1 @@ +{"version":3,"file":"keyboard.js","names":["cloneDeep","isEqual","Delta","AttributeMap","EmbedBlot","Scope","TextBlot","Quill","logger","Module","debug","SHORTKEY","test","navigator","platform","Keyboard","match","evt","binding","some","key","which","constructor","quill","options","bindings","Object","keys","forEach","name","addBinding","shiftKey","handleEnter","metaKey","ctrlKey","altKey","userAgent","collapsed","handleBackspace","handleDelete","prefix","suffix","handleDeleteRange","offset","listen","keyBinding","context","arguments","length","undefined","handler","normalize","warn","Array","isArray","singleBinding","push","root","addEventListener","defaultPrevented","isComposing","keyCode","concat","matches","filter","blot","find","target","scroll","range","getSelection","hasFocus","line","getLine","index","leafStart","offsetStart","getLeaf","leafEnd","offsetEnd","prefixText","value","slice","suffixText","curContext","empty","format","getFormat","event","prevented","every","call","preventDefault","getLength","formats","delta","retain","delete","prev","isPrevLineEmpty","statics","blotName","curFormats","prevFormats","diff","formatDelta","compose","updateContents","sources","USER","focus","next","nextFormats","deleteRange","lineFormats","reduce","query","BLOCK","insert","setSelection","SILENT","defaultOptions","bold","makeFormatHandler","italic","underline","indent","outdent","list","makeCodeBlockHandler","deleteText","tab","table","history","cutoff","formatLine","scrollSelectionIntoView","header","module","getModule","row","cell","getTable","shift","tableSide","blockquote","trim","insertText","numLines","cur","makeEmbedArrowHandler","makeTableArrowHandler","DEFAULTS","_ref","CodeBlock","TAB","lines","getLines","i","insertAt","domNode","textContent","startsWith","deleteAt","update","where","leaf","shortKey","up","targetRow","parent","targetCell","children","head","Math","min","targetLine","_ref2","firstFormats","lastFormats","_table","default"],"sources":["../../src/modules/keyboard.ts"],"sourcesContent":["import { cloneDeep, isEqual } from 'lodash-es';\nimport Delta, { AttributeMap } from 'quill-delta';\nimport { EmbedBlot, Scope, TextBlot } from 'parchment';\nimport type { Blot, BlockBlot } from 'parchment';\nimport Quill from '../core/quill.js';\nimport logger from '../core/logger.js';\nimport Module from '../core/module.js';\nimport type { BlockEmbed } from '../blots/block.js';\nimport type { Range } from '../core/selection.js';\n\nconst debug = logger('quill:keyboard');\n\nconst SHORTKEY = /Mac/i.test(navigator.platform) ? 'metaKey' : 'ctrlKey';\n\nexport interface Context {\n collapsed: boolean;\n empty: boolean;\n offset: number;\n prefix: string;\n suffix: string;\n format: Record;\n event: KeyboardEvent;\n line: BlockEmbed | BlockBlot;\n}\n\ninterface BindingObject\n extends Partial> {\n key: number | string | string[];\n shortKey?: boolean | null;\n shiftKey?: boolean | null;\n altKey?: boolean | null;\n metaKey?: boolean | null;\n ctrlKey?: boolean | null;\n prefix?: RegExp;\n suffix?: RegExp;\n format?: Record | string[];\n handler?: (\n this: { quill: Quill },\n range: Range,\n curContext: Context,\n // eslint-disable-next-line no-use-before-define\n binding: NormalizedBinding,\n ) => boolean | void;\n}\n\ntype Binding = BindingObject | string | number;\n\ninterface NormalizedBinding extends Omit {\n key: string | number;\n}\n\ninterface KeyboardOptions {\n bindings: Record;\n}\n\ninterface KeyboardOptions {\n bindings: Record;\n}\n\nclass Keyboard extends Module {\n static DEFAULTS: KeyboardOptions;\n\n static match(evt: KeyboardEvent, binding: BindingObject) {\n if (\n (['altKey', 'ctrlKey', 'metaKey', 'shiftKey'] as const).some((key) => {\n return !!binding[key] !== evt[key] && binding[key] !== null;\n })\n ) {\n return false;\n }\n return binding.key === evt.key || binding.key === evt.which;\n }\n\n bindings: Record;\n\n constructor(quill: Quill, options: Partial) {\n super(quill, options);\n this.bindings = {};\n // @ts-expect-error Fix me later\n Object.keys(this.options.bindings).forEach((name) => {\n // @ts-expect-error Fix me later\n if (this.options.bindings[name]) {\n // @ts-expect-error Fix me later\n this.addBinding(this.options.bindings[name]);\n }\n });\n this.addBinding({ key: 'Enter', shiftKey: null }, this.handleEnter);\n this.addBinding(\n { key: 'Enter', metaKey: null, ctrlKey: null, altKey: null },\n () => {},\n );\n if (/Firefox/i.test(navigator.userAgent)) {\n // Need to handle delete and backspace for Firefox in the general case #1171\n this.addBinding(\n { key: 'Backspace' },\n { collapsed: true },\n this.handleBackspace,\n );\n this.addBinding(\n { key: 'Delete' },\n { collapsed: true },\n this.handleDelete,\n );\n } else {\n this.addBinding(\n { key: 'Backspace' },\n { collapsed: true, prefix: /^.?$/ },\n this.handleBackspace,\n );\n this.addBinding(\n { key: 'Delete' },\n { collapsed: true, suffix: /^.?$/ },\n this.handleDelete,\n );\n }\n this.addBinding(\n { key: 'Backspace' },\n { collapsed: false },\n this.handleDeleteRange,\n );\n this.addBinding(\n { key: 'Delete' },\n { collapsed: false },\n this.handleDeleteRange,\n );\n this.addBinding(\n {\n key: 'Backspace',\n altKey: null,\n ctrlKey: null,\n metaKey: null,\n shiftKey: null,\n },\n { collapsed: true, offset: 0 },\n this.handleBackspace,\n );\n this.listen();\n }\n\n addBinding(\n keyBinding: Binding,\n context:\n | Required\n | Partial> = {},\n handler:\n | Required\n | Partial> = {},\n ) {\n const binding = normalize(keyBinding);\n if (binding == null) {\n debug.warn('Attempted to add invalid keyboard binding', binding);\n return;\n }\n if (typeof context === 'function') {\n context = { handler: context };\n }\n if (typeof handler === 'function') {\n handler = { handler };\n }\n const keys = Array.isArray(binding.key) ? binding.key : [binding.key];\n keys.forEach((key) => {\n const singleBinding = {\n ...binding,\n key,\n ...context,\n ...handler,\n };\n this.bindings[singleBinding.key] = this.bindings[singleBinding.key] || [];\n this.bindings[singleBinding.key].push(singleBinding);\n });\n }\n\n listen() {\n this.quill.root.addEventListener('keydown', (evt) => {\n if (evt.defaultPrevented || evt.isComposing) return;\n\n // evt.isComposing is false when pressing Enter/Backspace when composing in Safari\n // https://bugs.webkit.org/show_bug.cgi?id=165004\n const isComposing =\n evt.keyCode === 229 && (evt.key === 'Enter' || evt.key === 'Backspace');\n if (isComposing) return;\n\n const bindings = (this.bindings[evt.key] || []).concat(\n this.bindings[evt.which] || [],\n );\n const matches = bindings.filter((binding) =>\n Keyboard.match(evt, binding),\n );\n if (matches.length === 0) return;\n // @ts-expect-error\n const blot = Quill.find(evt.target, true);\n if (blot && blot.scroll !== this.quill.scroll) return;\n const range = this.quill.getSelection();\n if (range == null || !this.quill.hasFocus()) return;\n const [line, offset] = this.quill.getLine(range.index);\n const [leafStart, offsetStart] = this.quill.getLeaf(range.index);\n const [leafEnd, offsetEnd] =\n range.length === 0\n ? [leafStart, offsetStart]\n : this.quill.getLeaf(range.index + range.length);\n const prefixText =\n leafStart instanceof TextBlot\n ? leafStart.value().slice(0, offsetStart)\n : '';\n const suffixText =\n leafEnd instanceof TextBlot ? leafEnd.value().slice(offsetEnd) : '';\n const curContext = {\n collapsed: range.length === 0,\n // @ts-expect-error Fix me later\n empty: range.length === 0 && line.length() <= 1,\n format: this.quill.getFormat(range),\n line,\n offset,\n prefix: prefixText,\n suffix: suffixText,\n event: evt,\n };\n const prevented = matches.some((binding) => {\n if (\n binding.collapsed != null &&\n binding.collapsed !== curContext.collapsed\n ) {\n return false;\n }\n if (binding.empty != null && binding.empty !== curContext.empty) {\n return false;\n }\n if (binding.offset != null && binding.offset !== curContext.offset) {\n return false;\n }\n if (Array.isArray(binding.format)) {\n // any format is present\n if (binding.format.every((name) => curContext.format[name] == null)) {\n return false;\n }\n } else if (typeof binding.format === 'object') {\n // all formats must match\n if (\n !Object.keys(binding.format).every((name) => {\n // @ts-expect-error Fix me later\n if (binding.format[name] === true)\n return curContext.format[name] != null;\n // @ts-expect-error Fix me later\n if (binding.format[name] === false)\n return curContext.format[name] == null;\n // @ts-expect-error Fix me later\n return isEqual(binding.format[name], curContext.format[name]);\n })\n ) {\n return false;\n }\n }\n if (binding.prefix != null && !binding.prefix.test(curContext.prefix)) {\n return false;\n }\n if (binding.suffix != null && !binding.suffix.test(curContext.suffix)) {\n return false;\n }\n // @ts-expect-error Fix me later\n return binding.handler.call(this, range, curContext, binding) !== true;\n });\n if (prevented) {\n evt.preventDefault();\n }\n });\n }\n\n handleBackspace(range: Range, context: Context) {\n // Check for astral symbols\n const length = /[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]$/.test(context.prefix)\n ? 2\n : 1;\n if (range.index === 0 || this.quill.getLength() <= 1) return;\n let formats = {};\n const [line] = this.quill.getLine(range.index);\n let delta = new Delta().retain(range.index - length).delete(length);\n if (context.offset === 0) {\n // Always deleting newline here, length always 1\n const [prev] = this.quill.getLine(range.index - 1);\n if (prev) {\n const isPrevLineEmpty =\n prev.statics.blotName === 'block' && prev.length() <= 1;\n if (!isPrevLineEmpty) {\n // @ts-expect-error Fix me later\n const curFormats = line.formats();\n const prevFormats = this.quill.getFormat(range.index - 1, 1);\n formats = AttributeMap.diff(curFormats, prevFormats) || {};\n if (Object.keys(formats).length > 0) {\n // line.length() - 1 targets \\n in line, another -1 for newline being deleted\n const formatDelta = new Delta()\n // @ts-expect-error Fix me later\n .retain(range.index + line.length() - 2)\n .retain(1, formats);\n delta = delta.compose(formatDelta);\n }\n }\n }\n }\n this.quill.updateContents(delta, Quill.sources.USER);\n this.quill.focus();\n }\n\n handleDelete(range: Range, context: Context) {\n // Check for astral symbols\n const length = /^[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/.test(context.suffix)\n ? 2\n : 1;\n if (range.index >= this.quill.getLength() - length) return;\n let formats = {};\n const [line] = this.quill.getLine(range.index);\n let delta = new Delta().retain(range.index).delete(length);\n // @ts-expect-error Fix me later\n if (context.offset >= line.length() - 1) {\n const [next] = this.quill.getLine(range.index + 1);\n if (next) {\n // @ts-expect-error Fix me later\n const curFormats = line.formats();\n const nextFormats = this.quill.getFormat(range.index, 1);\n formats = AttributeMap.diff(curFormats, nextFormats) || {};\n if (Object.keys(formats).length > 0) {\n delta = delta.retain(next.length() - 1).retain(1, formats);\n }\n }\n }\n this.quill.updateContents(delta, Quill.sources.USER);\n this.quill.focus();\n }\n\n handleDeleteRange(range: Range) {\n deleteRange({ range, quill: this.quill });\n this.quill.focus();\n }\n\n handleEnter(range: Range, context: Context) {\n const lineFormats = Object.keys(context.format).reduce(\n (formats: Record, format) => {\n if (\n this.quill.scroll.query(format, Scope.BLOCK) &&\n !Array.isArray(context.format[format])\n ) {\n formats[format] = context.format[format];\n }\n return formats;\n },\n {},\n );\n const delta = new Delta()\n .retain(range.index)\n .delete(range.length)\n .insert('\\n', lineFormats);\n this.quill.updateContents(delta, Quill.sources.USER);\n this.quill.setSelection(range.index + 1, Quill.sources.SILENT);\n this.quill.focus();\n }\n}\n\nconst defaultOptions: KeyboardOptions = {\n bindings: {\n bold: makeFormatHandler('bold'),\n italic: makeFormatHandler('italic'),\n underline: makeFormatHandler('underline'),\n indent: {\n // highlight tab or tab at beginning of list, indent or blockquote\n key: 'Tab',\n format: ['blockquote', 'indent', 'list'],\n handler(range, context) {\n if (context.collapsed && context.offset !== 0) return true;\n this.quill.format('indent', '+1', Quill.sources.USER);\n return false;\n },\n },\n outdent: {\n key: 'Tab',\n shiftKey: true,\n format: ['blockquote', 'indent', 'list'],\n // highlight tab or tab at beginning of list, indent or blockquote\n handler(range, context) {\n if (context.collapsed && context.offset !== 0) return true;\n this.quill.format('indent', '-1', Quill.sources.USER);\n return false;\n },\n },\n 'outdent backspace': {\n key: 'Backspace',\n collapsed: true,\n shiftKey: null,\n metaKey: null,\n ctrlKey: null,\n altKey: null,\n format: ['indent', 'list'],\n offset: 0,\n handler(range, context) {\n if (context.format.indent != null) {\n this.quill.format('indent', '-1', Quill.sources.USER);\n } else if (context.format.list != null) {\n this.quill.format('list', false, Quill.sources.USER);\n }\n },\n },\n 'indent code-block': makeCodeBlockHandler(true),\n 'outdent code-block': makeCodeBlockHandler(false),\n 'remove tab': {\n key: 'Tab',\n shiftKey: true,\n collapsed: true,\n prefix: /\\t$/,\n handler(range) {\n this.quill.deleteText(range.index - 1, 1, Quill.sources.USER);\n },\n },\n tab: {\n key: 'Tab',\n handler(range, context) {\n if (context.format.table) return true;\n this.quill.history.cutoff();\n const delta = new Delta()\n .retain(range.index)\n .delete(range.length)\n .insert('\\t');\n this.quill.updateContents(delta, Quill.sources.USER);\n this.quill.history.cutoff();\n this.quill.setSelection(range.index + 1, Quill.sources.SILENT);\n return false;\n },\n },\n 'blockquote empty enter': {\n key: 'Enter',\n collapsed: true,\n format: ['blockquote'],\n empty: true,\n handler() {\n this.quill.format('blockquote', false, Quill.sources.USER);\n },\n },\n 'list empty enter': {\n key: 'Enter',\n collapsed: true,\n format: ['list'],\n empty: true,\n handler(range, context) {\n const formats: Record = { list: false };\n if (context.format.indent) {\n formats.indent = false;\n }\n this.quill.formatLine(\n range.index,\n range.length,\n formats,\n Quill.sources.USER,\n );\n },\n },\n 'checklist enter': {\n key: 'Enter',\n collapsed: true,\n format: { list: 'checked' },\n handler(range) {\n const [line, offset] = this.quill.getLine(range.index);\n const formats = {\n // @ts-expect-error Fix me later\n ...line.formats(),\n list: 'checked',\n };\n const delta = new Delta()\n .retain(range.index)\n .insert('\\n', formats)\n // @ts-expect-error Fix me later\n .retain(line.length() - offset - 1)\n .retain(1, { list: 'unchecked' });\n this.quill.updateContents(delta, Quill.sources.USER);\n this.quill.setSelection(range.index + 1, Quill.sources.SILENT);\n this.quill.scrollSelectionIntoView();\n },\n },\n 'header enter': {\n key: 'Enter',\n collapsed: true,\n format: ['header'],\n suffix: /^$/,\n handler(range, context) {\n const [line, offset] = this.quill.getLine(range.index);\n const delta = new Delta()\n .retain(range.index)\n .insert('\\n', context.format)\n // @ts-expect-error Fix me later\n .retain(line.length() - offset - 1)\n .retain(1, { header: null });\n this.quill.updateContents(delta, Quill.sources.USER);\n this.quill.setSelection(range.index + 1, Quill.sources.SILENT);\n this.quill.scrollSelectionIntoView();\n },\n },\n 'table backspace': {\n key: 'Backspace',\n format: ['table'],\n collapsed: true,\n offset: 0,\n handler() {},\n },\n 'table delete': {\n key: 'Delete',\n format: ['table'],\n collapsed: true,\n suffix: /^$/,\n handler() {},\n },\n 'table enter': {\n key: 'Enter',\n shiftKey: null,\n format: ['table'],\n handler(range) {\n const module = this.quill.getModule('table');\n if (module) {\n // @ts-expect-error\n const [table, row, cell, offset] = module.getTable(range);\n const shift = tableSide(table, row, cell, offset);\n if (shift == null) return;\n let index = table.offset();\n if (shift < 0) {\n const delta = new Delta().retain(index).insert('\\n');\n this.quill.updateContents(delta, Quill.sources.USER);\n this.quill.setSelection(\n range.index + 1,\n range.length,\n Quill.sources.SILENT,\n );\n } else if (shift > 0) {\n index += table.length();\n const delta = new Delta().retain(index).insert('\\n');\n this.quill.updateContents(delta, Quill.sources.USER);\n this.quill.setSelection(index, Quill.sources.USER);\n }\n }\n },\n },\n 'table tab': {\n key: 'Tab',\n shiftKey: null,\n format: ['table'],\n handler(range, context) {\n const { event, line: cell } = context;\n const offset = cell.offset(this.quill.scroll);\n if (event.shiftKey) {\n this.quill.setSelection(offset - 1, Quill.sources.USER);\n } else {\n this.quill.setSelection(offset + cell.length(), Quill.sources.USER);\n }\n },\n },\n 'list autofill': {\n key: ' ',\n shiftKey: null,\n collapsed: true,\n format: {\n 'code-block': false,\n blockquote: false,\n table: false,\n },\n prefix: /^\\s*?(\\d+\\.|-|\\*|\\[ ?\\]|\\[x\\])$/,\n handler(range, context) {\n if (this.quill.scroll.query('list') == null) return true;\n const { length } = context.prefix;\n const [line, offset] = this.quill.getLine(range.index);\n if (offset > length) return true;\n let value;\n switch (context.prefix.trim()) {\n case '[]':\n case '[ ]':\n value = 'unchecked';\n break;\n case '[x]':\n value = 'checked';\n break;\n case '-':\n case '*':\n value = 'bullet';\n break;\n default:\n value = 'ordered';\n }\n this.quill.insertText(range.index, ' ', Quill.sources.USER);\n this.quill.history.cutoff();\n const delta = new Delta()\n .retain(range.index - offset)\n .delete(length + 1)\n // @ts-expect-error Fix me later\n .retain(line.length() - 2 - offset)\n .retain(1, { list: value });\n this.quill.updateContents(delta, Quill.sources.USER);\n this.quill.history.cutoff();\n this.quill.setSelection(range.index - length, Quill.sources.SILENT);\n return false;\n },\n },\n 'code exit': {\n key: 'Enter',\n collapsed: true,\n format: ['code-block'],\n prefix: /^$/,\n suffix: /^\\s*$/,\n handler(range) {\n const [line, offset] = this.quill.getLine(range.index);\n let numLines = 2;\n let cur = line;\n while (\n cur != null &&\n cur.length() <= 1 &&\n cur.formats()['code-block']\n ) {\n // @ts-expect-error\n cur = cur.prev;\n numLines -= 1;\n // Requisite prev lines are empty\n if (numLines <= 0) {\n const delta = new Delta()\n // @ts-expect-error Fix me later\n .retain(range.index + line.length() - offset - 2)\n .retain(1, { 'code-block': null })\n .delete(1);\n this.quill.updateContents(delta, Quill.sources.USER);\n this.quill.setSelection(range.index - 1, Quill.sources.SILENT);\n return false;\n }\n }\n return true;\n },\n },\n 'embed left': makeEmbedArrowHandler('ArrowLeft', false),\n 'embed left shift': makeEmbedArrowHandler('ArrowLeft', true),\n 'embed right': makeEmbedArrowHandler('ArrowRight', false),\n 'embed right shift': makeEmbedArrowHandler('ArrowRight', true),\n 'table down': makeTableArrowHandler(false),\n 'table up': makeTableArrowHandler(true),\n },\n};\n\nKeyboard.DEFAULTS = defaultOptions;\n\nfunction makeCodeBlockHandler(indent: boolean): BindingObject {\n return {\n key: 'Tab',\n shiftKey: !indent,\n format: { 'code-block': true },\n handler(range, { event }) {\n const CodeBlock = this.quill.scroll.query('code-block');\n // @ts-expect-error\n const { TAB } = CodeBlock;\n if (range.length === 0 && !event.shiftKey) {\n this.quill.insertText(range.index, TAB, Quill.sources.USER);\n this.quill.setSelection(range.index + TAB.length, Quill.sources.SILENT);\n return;\n }\n\n const lines =\n range.length === 0\n ? this.quill.getLines(range.index, 1)\n : this.quill.getLines(range);\n let { index, length } = range;\n lines.forEach((line, i) => {\n if (indent) {\n line.insertAt(0, TAB);\n if (i === 0) {\n index += TAB.length;\n } else {\n length += TAB.length;\n }\n // @ts-expect-error Fix me later\n } else if (line.domNode.textContent.startsWith(TAB)) {\n line.deleteAt(0, TAB.length);\n if (i === 0) {\n index -= TAB.length;\n } else {\n length -= TAB.length;\n }\n }\n });\n this.quill.update(Quill.sources.USER);\n this.quill.setSelection(index, length, Quill.sources.SILENT);\n },\n };\n}\n\nfunction makeEmbedArrowHandler(\n key: string,\n shiftKey: boolean | null,\n): BindingObject {\n const where = key === 'ArrowLeft' ? 'prefix' : 'suffix';\n return {\n key,\n shiftKey,\n altKey: null,\n [where]: /^$/,\n handler(range) {\n let { index } = range;\n if (key === 'ArrowRight') {\n index += range.length + 1;\n }\n const [leaf] = this.quill.getLeaf(index);\n if (!(leaf instanceof EmbedBlot)) return true;\n if (key === 'ArrowLeft') {\n if (shiftKey) {\n this.quill.setSelection(\n range.index - 1,\n range.length + 1,\n Quill.sources.USER,\n );\n } else {\n this.quill.setSelection(range.index - 1, Quill.sources.USER);\n }\n } else if (shiftKey) {\n this.quill.setSelection(\n range.index,\n range.length + 1,\n Quill.sources.USER,\n );\n } else {\n this.quill.setSelection(\n range.index + range.length + 1,\n Quill.sources.USER,\n );\n }\n return false;\n },\n };\n}\n\nfunction makeFormatHandler(format: string): BindingObject {\n return {\n key: format[0],\n shortKey: true,\n handler(range, context) {\n this.quill.format(format, !context.format[format], Quill.sources.USER);\n },\n };\n}\n\nfunction makeTableArrowHandler(up: boolean): BindingObject {\n return {\n key: up ? 'ArrowUp' : 'ArrowDown',\n collapsed: true,\n format: ['table'],\n handler(range, context) {\n // TODO move to table module\n const key = up ? 'prev' : 'next';\n const cell = context.line;\n const targetRow = cell.parent[key];\n if (targetRow != null) {\n if (targetRow.statics.blotName === 'table-row') {\n // @ts-expect-error\n let targetCell = targetRow.children.head;\n let cur = cell;\n while (cur.prev != null) {\n // @ts-expect-error\n cur = cur.prev;\n targetCell = targetCell.next;\n }\n const index =\n targetCell.offset(this.quill.scroll) +\n Math.min(context.offset, targetCell.length() - 1);\n this.quill.setSelection(index, 0, Quill.sources.USER);\n }\n } else {\n // @ts-expect-error\n const targetLine = cell.table()[key];\n if (targetLine != null) {\n if (up) {\n this.quill.setSelection(\n targetLine.offset(this.quill.scroll) + targetLine.length() - 1,\n 0,\n Quill.sources.USER,\n );\n } else {\n this.quill.setSelection(\n targetLine.offset(this.quill.scroll),\n 0,\n Quill.sources.USER,\n );\n }\n }\n }\n return false;\n },\n };\n}\n\nfunction normalize(binding: Binding): BindingObject | null {\n if (typeof binding === 'string' || typeof binding === 'number') {\n binding = { key: binding };\n } else if (typeof binding === 'object') {\n binding = cloneDeep(binding);\n } else {\n return null;\n }\n if (binding.shortKey) {\n binding[SHORTKEY] = binding.shortKey;\n delete binding.shortKey;\n }\n return binding;\n}\n\n// TODO: Move into quill.ts or editor.ts\nfunction deleteRange({ quill, range }: { quill: Quill; range: Range }) {\n const lines = quill.getLines(range);\n let formats = {};\n if (lines.length > 1) {\n const firstFormats = lines[0].formats();\n const lastFormats = lines[lines.length - 1].formats();\n formats = AttributeMap.diff(lastFormats, firstFormats) || {};\n }\n quill.deleteText(range, Quill.sources.USER);\n if (Object.keys(formats).length > 0) {\n quill.formatLine(range.index, 1, formats, Quill.sources.USER);\n }\n quill.setSelection(range.index, Quill.sources.SILENT);\n}\n\nfunction tableSide(_table: unknown, row: Blot, cell: Blot, offset: number) {\n if (row.prev == null && row.next == null) {\n if (cell.prev == null && cell.next == null) {\n return offset === 0 ? -1 : 1;\n }\n return cell.prev == null ? -1 : 1;\n }\n if (row.prev == null) {\n return -1;\n }\n if (row.next == null) {\n return 1;\n }\n return null;\n}\n\nexport { Keyboard as default, SHORTKEY, normalize, deleteRange };\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file diff --git a/public/assets/quill/modules/normalizeExternalHTML/index.d.ts b/public/assets/quill/modules/normalizeExternalHTML/index.d.ts new file mode 100644 index 0000000..b2b353c --- /dev/null +++ b/public/assets/quill/modules/normalizeExternalHTML/index.d.ts @@ -0,0 +1,2 @@ +declare const normalizeExternalHTML: (doc: Document) => void; +export default normalizeExternalHTML; diff --git a/public/assets/quill/modules/normalizeExternalHTML/index.js b/public/assets/quill/modules/normalizeExternalHTML/index.js new file mode 100644 index 0000000..6175f79 --- /dev/null +++ b/public/assets/quill/modules/normalizeExternalHTML/index.js @@ -0,0 +1,12 @@ +import googleDocs from './normalizers/googleDocs.js'; +import msWord from './normalizers/msWord.js'; +const NORMALIZERS = [msWord, googleDocs]; +const normalizeExternalHTML = doc => { + if (doc.documentElement) { + NORMALIZERS.forEach(normalize => { + normalize(doc); + }); + } +}; +export default normalizeExternalHTML; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/public/assets/quill/modules/normalizeExternalHTML/index.js.map b/public/assets/quill/modules/normalizeExternalHTML/index.js.map new file mode 100644 index 0000000..40de683 --- /dev/null +++ b/public/assets/quill/modules/normalizeExternalHTML/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","names":["googleDocs","msWord","NORMALIZERS","normalizeExternalHTML","doc","documentElement","forEach","normalize"],"sources":["../../../src/modules/normalizeExternalHTML/index.ts"],"sourcesContent":["import googleDocs from './normalizers/googleDocs.js';\nimport msWord from './normalizers/msWord.js';\n\nconst NORMALIZERS = [msWord, googleDocs];\n\nconst normalizeExternalHTML = (doc: Document) => {\n if (doc.documentElement) {\n NORMALIZERS.forEach((normalize) => {\n normalize(doc);\n });\n }\n};\n\nexport default normalizeExternalHTML;\n"],"mappings":"AAAA,OAAOA,UAAU,MAAM,6BAA6B;AACpD,OAAOC,MAAM,MAAM,yBAAyB;AAE5C,MAAMC,WAAW,GAAG,CAACD,MAAM,EAAED,UAAU,CAAC;AAExC,MAAMG,qBAAqB,GAAIC,GAAa,IAAK;EAC/C,IAAIA,GAAG,CAACC,eAAe,EAAE;IACvBH,WAAW,CAACI,OAAO,CAAEC,SAAS,IAAK;MACjCA,SAAS,CAACH,GAAG,CAAC;IAChB,CAAC,CAAC;EACJ;AACF,CAAC;AAED,eAAeD,qBAAqB","ignoreList":[]} \ No newline at end of file diff --git a/public/assets/quill/modules/normalizeExternalHTML/normalizers/googleDocs.d.ts b/public/assets/quill/modules/normalizeExternalHTML/normalizers/googleDocs.d.ts new file mode 100644 index 0000000..89c8529 --- /dev/null +++ b/public/assets/quill/modules/normalizeExternalHTML/normalizers/googleDocs.d.ts @@ -0,0 +1 @@ +export default function normalize(doc: Document): void; diff --git a/public/assets/quill/modules/normalizeExternalHTML/normalizers/googleDocs.js b/public/assets/quill/modules/normalizeExternalHTML/normalizers/googleDocs.js new file mode 100644 index 0000000..cf097fe --- /dev/null +++ b/public/assets/quill/modules/normalizeExternalHTML/normalizers/googleDocs.js @@ -0,0 +1,24 @@ +const normalWeightRegexp = /font-weight:\s*normal/; +const blockTagNames = ['P', 'OL', 'UL']; +const isBlockElement = element => { + return element && blockTagNames.includes(element.tagName); +}; +const normalizeEmptyLines = doc => { + Array.from(doc.querySelectorAll('br')).filter(br => isBlockElement(br.previousElementSibling) && isBlockElement(br.nextElementSibling)).forEach(br => { + br.parentNode?.removeChild(br); + }); +}; +const normalizeFontWeight = doc => { + Array.from(doc.querySelectorAll('b[style*="font-weight"]')).filter(node => node.getAttribute('style')?.match(normalWeightRegexp)).forEach(node => { + const fragment = doc.createDocumentFragment(); + fragment.append(...node.childNodes); + node.parentNode?.replaceChild(fragment, node); + }); +}; +export default function normalize(doc) { + if (doc.querySelector('[id^="docs-internal-guid-"]')) { + normalizeFontWeight(doc); + normalizeEmptyLines(doc); + } +} +//# sourceMappingURL=googleDocs.js.map \ No newline at end of file diff --git a/public/assets/quill/modules/normalizeExternalHTML/normalizers/googleDocs.js.map b/public/assets/quill/modules/normalizeExternalHTML/normalizers/googleDocs.js.map new file mode 100644 index 0000000..157ac60 --- /dev/null +++ b/public/assets/quill/modules/normalizeExternalHTML/normalizers/googleDocs.js.map @@ -0,0 +1 @@ +{"version":3,"file":"googleDocs.js","names":["normalWeightRegexp","blockTagNames","isBlockElement","element","includes","tagName","normalizeEmptyLines","doc","Array","from","querySelectorAll","filter","br","previousElementSibling","nextElementSibling","forEach","parentNode","removeChild","normalizeFontWeight","node","getAttribute","match","fragment","createDocumentFragment","append","childNodes","replaceChild","normalize","querySelector"],"sources":["../../../../src/modules/normalizeExternalHTML/normalizers/googleDocs.ts"],"sourcesContent":["const normalWeightRegexp = /font-weight:\\s*normal/;\nconst blockTagNames = ['P', 'OL', 'UL'];\n\nconst isBlockElement = (element: Element | null) => {\n return element && blockTagNames.includes(element.tagName);\n};\n\nconst normalizeEmptyLines = (doc: Document) => {\n Array.from(doc.querySelectorAll('br'))\n .filter(\n (br) =>\n isBlockElement(br.previousElementSibling) &&\n isBlockElement(br.nextElementSibling),\n )\n .forEach((br) => {\n br.parentNode?.removeChild(br);\n });\n};\n\nconst normalizeFontWeight = (doc: Document) => {\n Array.from(doc.querySelectorAll('b[style*=\"font-weight\"]'))\n .filter((node) => node.getAttribute('style')?.match(normalWeightRegexp))\n .forEach((node) => {\n const fragment = doc.createDocumentFragment();\n fragment.append(...node.childNodes);\n node.parentNode?.replaceChild(fragment, node);\n });\n};\n\nexport default function normalize(doc: Document) {\n if (doc.querySelector('[id^=\"docs-internal-guid-\"]')) {\n normalizeFontWeight(doc);\n normalizeEmptyLines(doc);\n }\n}\n"],"mappings":"AAAA,MAAMA,kBAAkB,GAAG,uBAAuB;AAClD,MAAMC,aAAa,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC;AAEvC,MAAMC,cAAc,GAAIC,OAAuB,IAAK;EAClD,OAAOA,OAAO,IAAIF,aAAa,CAACG,QAAQ,CAACD,OAAO,CAACE,OAAO,CAAC;AAC3D,CAAC;AAED,MAAMC,mBAAmB,GAAIC,GAAa,IAAK;EAC7CC,KAAK,CAACC,IAAI,CAACF,GAAG,CAACG,gBAAgB,CAAC,IAAI,CAAC,CAAC,CACnCC,MAAM,CACJC,EAAE,IACDV,cAAc,CAACU,EAAE,CAACC,sBAAsB,CAAC,IACzCX,cAAc,CAACU,EAAE,CAACE,kBAAkB,CACxC,CAAC,CACAC,OAAO,CAAEH,EAAE,IAAK;IACfA,EAAE,CAACI,UAAU,EAAEC,WAAW,CAACL,EAAE,CAAC;EAChC,CAAC,CAAC;AACN,CAAC;AAED,MAAMM,mBAAmB,GAAIX,GAAa,IAAK;EAC7CC,KAAK,CAACC,IAAI,CAACF,GAAG,CAACG,gBAAgB,CAAC,yBAAyB,CAAC,CAAC,CACxDC,MAAM,CAAEQ,IAAI,IAAKA,IAAI,CAACC,YAAY,CAAC,OAAO,CAAC,EAAEC,KAAK,CAACrB,kBAAkB,CAAC,CAAC,CACvEe,OAAO,CAAEI,IAAI,IAAK;IACjB,MAAMG,QAAQ,GAAGf,GAAG,CAACgB,sBAAsB,CAAC,CAAC;IAC7CD,QAAQ,CAACE,MAAM,CAAC,GAAGL,IAAI,CAACM,UAAU,CAAC;IACnCN,IAAI,CAACH,UAAU,EAAEU,YAAY,CAACJ,QAAQ,EAAEH,IAAI,CAAC;EAC/C,CAAC,CAAC;AACN,CAAC;AAED,eAAe,SAASQ,SAASA,CAACpB,GAAa,EAAE;EAC/C,IAAIA,GAAG,CAACqB,aAAa,CAAC,6BAA6B,CAAC,EAAE;IACpDV,mBAAmB,CAACX,GAAG,CAAC;IACxBD,mBAAmB,CAACC,GAAG,CAAC;EAC1B;AACF","ignoreList":[]} \ No newline at end of file diff --git a/public/assets/quill/modules/normalizeExternalHTML/normalizers/msWord.d.ts b/public/assets/quill/modules/normalizeExternalHTML/normalizers/msWord.d.ts new file mode 100644 index 0000000..89c8529 --- /dev/null +++ b/public/assets/quill/modules/normalizeExternalHTML/normalizers/msWord.d.ts @@ -0,0 +1 @@ +export default function normalize(doc: Document): void; diff --git a/public/assets/quill/modules/normalizeExternalHTML/normalizers/msWord.js b/public/assets/quill/modules/normalizeExternalHTML/normalizers/msWord.js new file mode 100644 index 0000000..b7513fa --- /dev/null +++ b/public/assets/quill/modules/normalizeExternalHTML/normalizers/msWord.js @@ -0,0 +1,87 @@ +const ignoreRegexp = /\bmso-list:[^;]*ignore/i; +const idRegexp = /\bmso-list:[^;]*\bl(\d+)/i; +const indentRegexp = /\bmso-list:[^;]*\blevel(\d+)/i; +const parseListItem = (element, html) => { + const style = element.getAttribute('style'); + const idMatch = style?.match(idRegexp); + if (!idMatch) { + return null; + } + const id = Number(idMatch[1]); + const indentMatch = style?.match(indentRegexp); + const indent = indentMatch ? Number(indentMatch[1]) : 1; + const typeRegexp = new RegExp(`@list l${id}:level${indent}\\s*\\{[^\\}]*mso-level-number-format:\\s*([\\w-]+)`, 'i'); + const typeMatch = html.match(typeRegexp); + const type = typeMatch && typeMatch[1] === 'bullet' ? 'bullet' : 'ordered'; + return { + id, + indent, + type, + element + }; +}; + +// list items are represented as `p` tags with styles like `mso-list: l0 level1` where: +// 1. "0" in "l0" means the list item id; +// 2. "1" in "level1" means the indent level, starting from 1. +const normalizeListItem = doc => { + const msoList = Array.from(doc.querySelectorAll('[style*=mso-list]')); + const ignored = []; + const others = []; + msoList.forEach(node => { + const shouldIgnore = (node.getAttribute('style') || '').match(ignoreRegexp); + if (shouldIgnore) { + ignored.push(node); + } else { + others.push(node); + } + }); + + // Each list item contains a marker wrapped with "mso-list: Ignore". + ignored.forEach(node => node.parentNode?.removeChild(node)); + + // The list stype is not defined inline with the tag, instead, it's in the + // style tag so we need to pass the html as a string. + const html = doc.documentElement.innerHTML; + const listItems = others.map(element => parseListItem(element, html)).filter(parsed => parsed); + while (listItems.length) { + const childListItems = []; + let current = listItems.shift(); + // Group continuous items into the same group (aka "ul") + while (current) { + childListItems.push(current); + current = listItems.length && listItems[0]?.element === current.element.nextElementSibling && + // Different id means the next item doesn't belong to this group. + listItems[0].id === current.id ? listItems.shift() : null; + } + const ul = document.createElement('ul'); + childListItems.forEach(listItem => { + const li = document.createElement('li'); + li.setAttribute('data-list', listItem.type); + if (listItem.indent > 1) { + li.setAttribute('class', `ql-indent-${listItem.indent - 1}`); + } + li.innerHTML = listItem.element.innerHTML; + ul.appendChild(li); + }); + const element = childListItems[0]?.element; + const { + parentNode + } = element ?? {}; + if (element) { + parentNode?.replaceChild(ul, element); + } + childListItems.slice(1).forEach(_ref => { + let { + element: e + } = _ref; + parentNode?.removeChild(e); + }); + } +}; +export default function normalize(doc) { + if (doc.documentElement.getAttribute('xmlns:w') === 'urn:schemas-microsoft-com:office:word') { + normalizeListItem(doc); + } +} +//# sourceMappingURL=msWord.js.map \ No newline at end of file diff --git a/public/assets/quill/modules/normalizeExternalHTML/normalizers/msWord.js.map b/public/assets/quill/modules/normalizeExternalHTML/normalizers/msWord.js.map new file mode 100644 index 0000000..985efd5 --- /dev/null +++ b/public/assets/quill/modules/normalizeExternalHTML/normalizers/msWord.js.map @@ -0,0 +1 @@ +{"version":3,"file":"msWord.js","names":["ignoreRegexp","idRegexp","indentRegexp","parseListItem","element","html","style","getAttribute","idMatch","match","id","Number","indentMatch","indent","typeRegexp","RegExp","typeMatch","type","normalizeListItem","doc","msoList","Array","from","querySelectorAll","ignored","others","forEach","node","shouldIgnore","push","parentNode","removeChild","documentElement","innerHTML","listItems","map","filter","parsed","length","childListItems","current","shift","nextElementSibling","ul","document","createElement","listItem","li","setAttribute","appendChild","replaceChild","slice","_ref","e","normalize"],"sources":["../../../../src/modules/normalizeExternalHTML/normalizers/msWord.ts"],"sourcesContent":["const ignoreRegexp = /\\bmso-list:[^;]*ignore/i;\nconst idRegexp = /\\bmso-list:[^;]*\\bl(\\d+)/i;\nconst indentRegexp = /\\bmso-list:[^;]*\\blevel(\\d+)/i;\n\nconst parseListItem = (element: Element, html: string) => {\n const style = element.getAttribute('style');\n const idMatch = style?.match(idRegexp);\n if (!idMatch) {\n return null;\n }\n const id = Number(idMatch[1]);\n\n const indentMatch = style?.match(indentRegexp);\n const indent = indentMatch ? Number(indentMatch[1]) : 1;\n\n const typeRegexp = new RegExp(\n `@list l${id}:level${indent}\\\\s*\\\\{[^\\\\}]*mso-level-number-format:\\\\s*([\\\\w-]+)`,\n 'i',\n );\n const typeMatch = html.match(typeRegexp);\n const type = typeMatch && typeMatch[1] === 'bullet' ? 'bullet' : 'ordered';\n\n return { id, indent, type, element };\n};\n\n// list items are represented as `p` tags with styles like `mso-list: l0 level1` where:\n// 1. \"0\" in \"l0\" means the list item id;\n// 2. \"1\" in \"level1\" means the indent level, starting from 1.\nconst normalizeListItem = (doc: Document) => {\n const msoList = Array.from(doc.querySelectorAll('[style*=mso-list]'));\n const ignored: Element[] = [];\n const others: Element[] = [];\n msoList.forEach((node) => {\n const shouldIgnore = (node.getAttribute('style') || '').match(ignoreRegexp);\n if (shouldIgnore) {\n ignored.push(node);\n } else {\n others.push(node);\n }\n });\n\n // Each list item contains a marker wrapped with \"mso-list: Ignore\".\n ignored.forEach((node) => node.parentNode?.removeChild(node));\n\n // The list stype is not defined inline with the tag, instead, it's in the\n // style tag so we need to pass the html as a string.\n const html = doc.documentElement.innerHTML;\n const listItems = others\n .map((element) => parseListItem(element, html))\n .filter((parsed) => parsed);\n\n while (listItems.length) {\n const childListItems = [];\n\n let current = listItems.shift();\n // Group continuous items into the same group (aka \"ul\")\n while (current) {\n childListItems.push(current);\n current =\n listItems.length &&\n listItems[0]?.element === current.element.nextElementSibling &&\n // Different id means the next item doesn't belong to this group.\n listItems[0].id === current.id\n ? listItems.shift()\n : null;\n }\n\n const ul = document.createElement('ul');\n childListItems.forEach((listItem) => {\n const li = document.createElement('li');\n li.setAttribute('data-list', listItem.type);\n if (listItem.indent > 1) {\n li.setAttribute('class', `ql-indent-${listItem.indent - 1}`);\n }\n li.innerHTML = listItem.element.innerHTML;\n ul.appendChild(li);\n });\n\n const element = childListItems[0]?.element;\n const { parentNode } = element ?? {};\n if (element) {\n parentNode?.replaceChild(ul, element);\n }\n childListItems.slice(1).forEach(({ element: e }) => {\n parentNode?.removeChild(e);\n });\n }\n};\n\nexport default function normalize(doc: Document) {\n if (\n doc.documentElement.getAttribute('xmlns:w') ===\n 'urn:schemas-microsoft-com:office:word'\n ) {\n normalizeListItem(doc);\n }\n}\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file diff --git a/public/assets/quill/modules/syntax.d.ts b/public/assets/quill/modules/syntax.d.ts new file mode 100644 index 0000000..b532cdb --- /dev/null +++ b/public/assets/quill/modules/syntax.d.ts @@ -0,0 +1,50 @@ +import Delta from 'quill-delta'; +import type { Blot, ScrollBlot } from 'parchment'; +import Inline from '../blots/inline.js'; +import Quill from '../core/quill.js'; +import Module from '../core/module.js'; +import CodeBlock, { CodeBlockContainer } from '../formats/code.js'; +declare class CodeToken extends Inline { + static formats(node: Element, scroll: ScrollBlot): any; + constructor(scroll: ScrollBlot, domNode: Node, value: unknown); + format(format: string, value: unknown): void; + optimize(...args: unknown[]): void; +} +declare class SyntaxCodeBlock extends CodeBlock { + static create(value: unknown): HTMLElement; + static formats(domNode: Node): any; + static register(): void; + format(name: string, value: unknown): void; + replaceWith(name: string | Blot, value?: any): Blot; +} +declare class SyntaxCodeBlockContainer extends CodeBlockContainer { + forceNext?: boolean; + cachedText?: string | null; + attach(): void; + format(name: string, value: unknown): void; + formatAt(index: number, length: number, name: string, value: unknown): void; + highlight(highlight: (text: string, language: string) => Delta, forced?: boolean): void; + html(index: number, length: number): string; + optimize(context: Record): void; +} +interface SyntaxOptions { + interval: number; + languages: { + key: string; + label: string; + }[]; + hljs: any; +} +declare class Syntax extends Module { + static DEFAULTS: SyntaxOptions & { + hljs: any; + }; + static register(): void; + languages: Record; + constructor(quill: Quill, options: Partial); + initListener(): void; + initTimer(): void; + highlight(blot?: SyntaxCodeBlockContainer | null, force?: boolean): void; + highlightBlot(text: string, language?: string): Delta; +} +export { SyntaxCodeBlock as CodeBlock, CodeToken, Syntax as default }; diff --git a/public/assets/quill/modules/syntax.js b/public/assets/quill/modules/syntax.js new file mode 100644 index 0000000..0577154 --- /dev/null +++ b/public/assets/quill/modules/syntax.js @@ -0,0 +1,332 @@ +import Delta from 'quill-delta'; +import { ClassAttributor, Scope } from 'parchment'; +import Inline from '../blots/inline.js'; +import Quill from '../core/quill.js'; +import Module from '../core/module.js'; +import { blockDelta } from '../blots/block.js'; +import BreakBlot from '../blots/break.js'; +import CursorBlot from '../blots/cursor.js'; +import TextBlot, { escapeText } from '../blots/text.js'; +import CodeBlock, { CodeBlockContainer } from '../formats/code.js'; +import { traverse } from './clipboard.js'; +const TokenAttributor = new ClassAttributor('code-token', 'hljs', { + scope: Scope.INLINE +}); +class CodeToken extends Inline { + static formats(node, scroll) { + while (node != null && node !== scroll.domNode) { + if (node.classList && node.classList.contains(CodeBlock.className)) { + // @ts-expect-error + return super.formats(node, scroll); + } + // @ts-expect-error + node = node.parentNode; + } + return undefined; + } + constructor(scroll, domNode, value) { + // @ts-expect-error + super(scroll, domNode, value); + TokenAttributor.add(this.domNode, value); + } + format(format, value) { + if (format !== CodeToken.blotName) { + super.format(format, value); + } else if (value) { + TokenAttributor.add(this.domNode, value); + } else { + TokenAttributor.remove(this.domNode); + this.domNode.classList.remove(this.statics.className); + } + } + optimize() { + // @ts-expect-error + super.optimize(...arguments); + if (!TokenAttributor.value(this.domNode)) { + this.unwrap(); + } + } +} +CodeToken.blotName = 'code-token'; +CodeToken.className = 'ql-token'; +class SyntaxCodeBlock extends CodeBlock { + static create(value) { + const domNode = super.create(value); + if (typeof value === 'string') { + domNode.setAttribute('data-language', value); + } + return domNode; + } + static formats(domNode) { + // @ts-expect-error + return domNode.getAttribute('data-language') || 'plain'; + } + static register() {} // Syntax module will register + + format(name, value) { + if (name === this.statics.blotName && value) { + // @ts-expect-error + this.domNode.setAttribute('data-language', value); + } else { + super.format(name, value); + } + } + replaceWith(name, value) { + this.formatAt(0, this.length(), CodeToken.blotName, false); + return super.replaceWith(name, value); + } +} +class SyntaxCodeBlockContainer extends CodeBlockContainer { + attach() { + super.attach(); + this.forceNext = false; + // @ts-expect-error + this.scroll.emitMount(this); + } + format(name, value) { + if (name === SyntaxCodeBlock.blotName) { + this.forceNext = true; + this.children.forEach(child => { + // @ts-expect-error + child.format(name, value); + }); + } + } + formatAt(index, length, name, value) { + if (name === SyntaxCodeBlock.blotName) { + this.forceNext = true; + } + super.formatAt(index, length, name, value); + } + highlight(highlight) { + let forced = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + if (this.children.head == null) return; + const nodes = Array.from(this.domNode.childNodes).filter(node => node !== this.uiNode); + const text = `${nodes.map(node => node.textContent).join('\n')}\n`; + const language = SyntaxCodeBlock.formats(this.children.head.domNode); + if (forced || this.forceNext || this.cachedText !== text) { + if (text.trim().length > 0 || this.cachedText == null) { + const oldDelta = this.children.reduce((delta, child) => { + // @ts-expect-error + return delta.concat(blockDelta(child, false)); + }, new Delta()); + const delta = highlight(text, language); + oldDelta.diff(delta).reduce((index, _ref) => { + let { + retain, + attributes + } = _ref; + // Should be all retains + if (!retain) return index; + if (attributes) { + Object.keys(attributes).forEach(format => { + if ([SyntaxCodeBlock.blotName, CodeToken.blotName].includes(format)) { + // @ts-expect-error + this.formatAt(index, retain, format, attributes[format]); + } + }); + } + // @ts-expect-error + return index + retain; + }, 0); + } + this.cachedText = text; + this.forceNext = false; + } + } + html(index, length) { + const [codeBlock] = this.children.find(index); + const language = codeBlock ? SyntaxCodeBlock.formats(codeBlock.domNode) : 'plain'; + return `
    \n${escapeText(this.code(index, length))}\n
    `; + } + optimize(context) { + super.optimize(context); + if (this.parent != null && this.children.head != null && this.uiNode != null) { + const language = SyntaxCodeBlock.formats(this.children.head.domNode); + // @ts-expect-error + if (language !== this.uiNode.value) { + // @ts-expect-error + this.uiNode.value = language; + } + } + } +} +SyntaxCodeBlockContainer.allowedChildren = [SyntaxCodeBlock]; +SyntaxCodeBlock.requiredContainer = SyntaxCodeBlockContainer; +SyntaxCodeBlock.allowedChildren = [CodeToken, CursorBlot, TextBlot, BreakBlot]; +const highlight = (lib, language, text) => { + if (typeof lib.versionString === 'string') { + const majorVersion = lib.versionString.split('.')[0]; + if (parseInt(majorVersion, 10) >= 11) { + return lib.highlight(text, { + language + }).value; + } + } + return lib.highlight(language, text).value; +}; +class Syntax extends Module { + static register() { + Quill.register(CodeToken, true); + Quill.register(SyntaxCodeBlock, true); + Quill.register(SyntaxCodeBlockContainer, true); + } + constructor(quill, options) { + super(quill, options); + if (this.options.hljs == null) { + throw new Error('Syntax module requires highlight.js. Please include the library on the page before Quill.'); + } + // @ts-expect-error Fix me later + this.languages = this.options.languages.reduce((memo, _ref2) => { + let { + key + } = _ref2; + memo[key] = true; + return memo; + }, {}); + this.highlightBlot = this.highlightBlot.bind(this); + this.initListener(); + this.initTimer(); + } + initListener() { + this.quill.on(Quill.events.SCROLL_BLOT_MOUNT, blot => { + if (!(blot instanceof SyntaxCodeBlockContainer)) return; + const select = this.quill.root.ownerDocument.createElement('select'); + // @ts-expect-error Fix me later + this.options.languages.forEach(_ref3 => { + let { + key, + label + } = _ref3; + const option = select.ownerDocument.createElement('option'); + option.textContent = label; + option.setAttribute('value', key); + select.appendChild(option); + }); + select.addEventListener('change', () => { + blot.format(SyntaxCodeBlock.blotName, select.value); + this.quill.root.focus(); // Prevent scrolling + this.highlight(blot, true); + }); + if (blot.uiNode == null) { + blot.attachUI(select); + if (blot.children.head) { + select.value = SyntaxCodeBlock.formats(blot.children.head.domNode); + } + } + }); + } + initTimer() { + let timer = null; + this.quill.on(Quill.events.SCROLL_OPTIMIZE, () => { + if (timer) { + clearTimeout(timer); + } + timer = setTimeout(() => { + this.highlight(); + timer = null; + }, this.options.interval); + }); + } + highlight() { + let blot = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; + let force = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + if (this.quill.selection.composing) return; + this.quill.update(Quill.sources.USER); + const range = this.quill.getSelection(); + const blots = blot == null ? this.quill.scroll.descendants(SyntaxCodeBlockContainer) : [blot]; + blots.forEach(container => { + container.highlight(this.highlightBlot, force); + }); + this.quill.update(Quill.sources.SILENT); + if (range != null) { + this.quill.setSelection(range, Quill.sources.SILENT); + } + } + highlightBlot(text) { + let language = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'plain'; + language = this.languages[language] ? language : 'plain'; + if (language === 'plain') { + return escapeText(text).split('\n').reduce((delta, line, i) => { + if (i !== 0) { + delta.insert('\n', { + [CodeBlock.blotName]: language + }); + } + return delta.insert(line); + }, new Delta()); + } + const container = this.quill.root.ownerDocument.createElement('div'); + container.classList.add(CodeBlock.className); + container.innerHTML = highlight(this.options.hljs, language, text); + return traverse(this.quill.scroll, container, [(node, delta) => { + // @ts-expect-error + const value = TokenAttributor.value(node); + if (value) { + return delta.compose(new Delta().retain(delta.length(), { + [CodeToken.blotName]: value + })); + } + return delta; + }], [(node, delta) => { + // @ts-expect-error + return node.data.split('\n').reduce((memo, nodeText, i) => { + if (i !== 0) memo.insert('\n', { + [CodeBlock.blotName]: language + }); + return memo.insert(nodeText); + }, delta); + }], new WeakMap()); + } +} +Syntax.DEFAULTS = { + hljs: (() => { + return window.hljs; + })(), + interval: 1000, + languages: [{ + key: 'plain', + label: 'Plain' + }, { + key: 'bash', + label: 'Bash' + }, { + key: 'cpp', + label: 'C++' + }, { + key: 'cs', + label: 'C#' + }, { + key: 'css', + label: 'CSS' + }, { + key: 'diff', + label: 'Diff' + }, { + key: 'xml', + label: 'HTML/XML' + }, { + key: 'java', + label: 'Java' + }, { + key: 'javascript', + label: 'JavaScript' + }, { + key: 'markdown', + label: 'Markdown' + }, { + key: 'php', + label: 'PHP' + }, { + key: 'python', + label: 'Python' + }, { + key: 'ruby', + label: 'Ruby' + }, { + key: 'sql', + label: 'SQL' + }] +}; +export { SyntaxCodeBlock as CodeBlock, CodeToken, Syntax as default }; +//# sourceMappingURL=syntax.js.map \ No newline at end of file diff --git a/public/assets/quill/modules/syntax.js.map b/public/assets/quill/modules/syntax.js.map new file mode 100644 index 0000000..ae513e8 --- /dev/null +++ b/public/assets/quill/modules/syntax.js.map @@ -0,0 +1 @@ +{"version":3,"file":"syntax.js","names":["Delta","ClassAttributor","Scope","Inline","Quill","Module","blockDelta","BreakBlot","CursorBlot","TextBlot","escapeText","CodeBlock","CodeBlockContainer","traverse","TokenAttributor","scope","INLINE","CodeToken","formats","node","scroll","domNode","classList","contains","className","parentNode","undefined","constructor","value","add","format","blotName","remove","statics","optimize","arguments","unwrap","SyntaxCodeBlock","create","setAttribute","getAttribute","register","name","replaceWith","formatAt","length","SyntaxCodeBlockContainer","attach","forceNext","emitMount","children","forEach","child","index","highlight","forced","head","nodes","Array","from","childNodes","filter","uiNode","text","map","textContent","join","language","cachedText","trim","oldDelta","reduce","delta","concat","diff","_ref","retain","attributes","Object","keys","includes","html","codeBlock","find","code","context","parent","allowedChildren","requiredContainer","lib","versionString","majorVersion","split","parseInt","Syntax","quill","options","hljs","Error","languages","memo","_ref2","key","highlightBlot","bind","initListener","initTimer","on","events","SCROLL_BLOT_MOUNT","blot","select","root","ownerDocument","createElement","_ref3","label","option","appendChild","addEventListener","focus","attachUI","timer","SCROLL_OPTIMIZE","clearTimeout","setTimeout","interval","force","selection","composing","update","sources","USER","range","getSelection","blots","descendants","container","SILENT","setSelection","line","i","insert","innerHTML","compose","data","nodeText","WeakMap","DEFAULTS","window","default"],"sources":["../../src/modules/syntax.ts"],"sourcesContent":["import Delta from 'quill-delta';\nimport { ClassAttributor, Scope } from 'parchment';\nimport type { Blot, ScrollBlot } from 'parchment';\nimport Inline from '../blots/inline.js';\nimport Quill from '../core/quill.js';\nimport Module from '../core/module.js';\nimport { blockDelta } from '../blots/block.js';\nimport BreakBlot from '../blots/break.js';\nimport CursorBlot from '../blots/cursor.js';\nimport TextBlot, { escapeText } from '../blots/text.js';\nimport CodeBlock, { CodeBlockContainer } from '../formats/code.js';\nimport { traverse } from './clipboard.js';\n\nconst TokenAttributor = new ClassAttributor('code-token', 'hljs', {\n scope: Scope.INLINE,\n});\nclass CodeToken extends Inline {\n static formats(node: Element, scroll: ScrollBlot) {\n while (node != null && node !== scroll.domNode) {\n if (node.classList && node.classList.contains(CodeBlock.className)) {\n // @ts-expect-error\n return super.formats(node, scroll);\n }\n // @ts-expect-error\n node = node.parentNode;\n }\n return undefined;\n }\n\n constructor(scroll: ScrollBlot, domNode: Node, value: unknown) {\n // @ts-expect-error\n super(scroll, domNode, value);\n TokenAttributor.add(this.domNode, value);\n }\n\n format(format: string, value: unknown) {\n if (format !== CodeToken.blotName) {\n super.format(format, value);\n } else if (value) {\n TokenAttributor.add(this.domNode, value);\n } else {\n TokenAttributor.remove(this.domNode);\n this.domNode.classList.remove(this.statics.className);\n }\n }\n\n optimize(...args: unknown[]) {\n // @ts-expect-error\n super.optimize(...args);\n if (!TokenAttributor.value(this.domNode)) {\n this.unwrap();\n }\n }\n}\nCodeToken.blotName = 'code-token';\nCodeToken.className = 'ql-token';\n\nclass SyntaxCodeBlock extends CodeBlock {\n static create(value: unknown) {\n const domNode = super.create(value);\n if (typeof value === 'string') {\n domNode.setAttribute('data-language', value);\n }\n return domNode;\n }\n\n static formats(domNode: Node) {\n // @ts-expect-error\n return domNode.getAttribute('data-language') || 'plain';\n }\n\n static register() {} // Syntax module will register\n\n format(name: string, value: unknown) {\n if (name === this.statics.blotName && value) {\n // @ts-expect-error\n this.domNode.setAttribute('data-language', value);\n } else {\n super.format(name, value);\n }\n }\n\n replaceWith(name: string | Blot, value?: any) {\n this.formatAt(0, this.length(), CodeToken.blotName, false);\n return super.replaceWith(name, value);\n }\n}\n\nclass SyntaxCodeBlockContainer extends CodeBlockContainer {\n forceNext?: boolean;\n cachedText?: string | null;\n\n attach() {\n super.attach();\n this.forceNext = false;\n // @ts-expect-error\n this.scroll.emitMount(this);\n }\n\n format(name: string, value: unknown) {\n if (name === SyntaxCodeBlock.blotName) {\n this.forceNext = true;\n this.children.forEach((child) => {\n // @ts-expect-error\n child.format(name, value);\n });\n }\n }\n\n formatAt(index: number, length: number, name: string, value: unknown) {\n if (name === SyntaxCodeBlock.blotName) {\n this.forceNext = true;\n }\n super.formatAt(index, length, name, value);\n }\n\n highlight(\n highlight: (text: string, language: string) => Delta,\n forced = false,\n ) {\n if (this.children.head == null) return;\n const nodes = Array.from(this.domNode.childNodes).filter(\n (node) => node !== this.uiNode,\n );\n const text = `${nodes.map((node) => node.textContent).join('\\n')}\\n`;\n const language = SyntaxCodeBlock.formats(this.children.head.domNode);\n if (forced || this.forceNext || this.cachedText !== text) {\n if (text.trim().length > 0 || this.cachedText == null) {\n const oldDelta = this.children.reduce((delta, child) => {\n // @ts-expect-error\n return delta.concat(blockDelta(child, false));\n }, new Delta());\n const delta = highlight(text, language);\n oldDelta.diff(delta).reduce((index, { retain, attributes }) => {\n // Should be all retains\n if (!retain) return index;\n if (attributes) {\n Object.keys(attributes).forEach((format) => {\n if (\n [SyntaxCodeBlock.blotName, CodeToken.blotName].includes(format)\n ) {\n // @ts-expect-error\n this.formatAt(index, retain, format, attributes[format]);\n }\n });\n }\n // @ts-expect-error\n return index + retain;\n }, 0);\n }\n this.cachedText = text;\n this.forceNext = false;\n }\n }\n\n html(index: number, length: number) {\n const [codeBlock] = this.children.find(index);\n const language = codeBlock\n ? SyntaxCodeBlock.formats(codeBlock.domNode)\n : 'plain';\n\n return `
    \\n${escapeText(\n      this.code(index, length),\n    )}\\n
    `;\n }\n\n optimize(context: Record) {\n super.optimize(context);\n if (\n this.parent != null &&\n this.children.head != null &&\n this.uiNode != null\n ) {\n const language = SyntaxCodeBlock.formats(this.children.head.domNode);\n // @ts-expect-error\n if (language !== this.uiNode.value) {\n // @ts-expect-error\n this.uiNode.value = language;\n }\n }\n }\n}\n\nSyntaxCodeBlockContainer.allowedChildren = [SyntaxCodeBlock];\nSyntaxCodeBlock.requiredContainer = SyntaxCodeBlockContainer;\nSyntaxCodeBlock.allowedChildren = [CodeToken, CursorBlot, TextBlot, BreakBlot];\n\ninterface SyntaxOptions {\n interval: number;\n languages: { key: string; label: string }[];\n hljs: any;\n}\n\nconst highlight = (lib: any, language: string, text: string) => {\n if (typeof lib.versionString === 'string') {\n const majorVersion = lib.versionString.split('.')[0];\n if (parseInt(majorVersion, 10) >= 11) {\n return lib.highlight(text, { language }).value;\n }\n }\n return lib.highlight(language, text).value;\n};\n\nclass Syntax extends Module {\n static DEFAULTS: SyntaxOptions & { hljs: any };\n\n static register() {\n Quill.register(CodeToken, true);\n Quill.register(SyntaxCodeBlock, true);\n Quill.register(SyntaxCodeBlockContainer, true);\n }\n\n languages: Record;\n\n constructor(quill: Quill, options: Partial) {\n super(quill, options);\n if (this.options.hljs == null) {\n throw new Error(\n 'Syntax module requires highlight.js. Please include the library on the page before Quill.',\n );\n }\n // @ts-expect-error Fix me later\n this.languages = this.options.languages.reduce(\n (memo: Record, { key }) => {\n memo[key] = true;\n return memo;\n },\n {},\n );\n this.highlightBlot = this.highlightBlot.bind(this);\n this.initListener();\n this.initTimer();\n }\n\n initListener() {\n this.quill.on(Quill.events.SCROLL_BLOT_MOUNT, (blot: Blot) => {\n if (!(blot instanceof SyntaxCodeBlockContainer)) return;\n const select = this.quill.root.ownerDocument.createElement('select');\n // @ts-expect-error Fix me later\n this.options.languages.forEach(({ key, label }) => {\n const option = select.ownerDocument.createElement('option');\n option.textContent = label;\n option.setAttribute('value', key);\n select.appendChild(option);\n });\n select.addEventListener('change', () => {\n blot.format(SyntaxCodeBlock.blotName, select.value);\n this.quill.root.focus(); // Prevent scrolling\n this.highlight(blot, true);\n });\n if (blot.uiNode == null) {\n blot.attachUI(select);\n if (blot.children.head) {\n select.value = SyntaxCodeBlock.formats(blot.children.head.domNode);\n }\n }\n });\n }\n\n initTimer() {\n let timer: ReturnType | null = null;\n this.quill.on(Quill.events.SCROLL_OPTIMIZE, () => {\n if (timer) {\n clearTimeout(timer);\n }\n timer = setTimeout(() => {\n this.highlight();\n timer = null;\n }, this.options.interval);\n });\n }\n\n highlight(blot: SyntaxCodeBlockContainer | null = null, force = false) {\n if (this.quill.selection.composing) return;\n this.quill.update(Quill.sources.USER);\n const range = this.quill.getSelection();\n const blots =\n blot == null\n ? this.quill.scroll.descendants(SyntaxCodeBlockContainer)\n : [blot];\n blots.forEach((container) => {\n container.highlight(this.highlightBlot, force);\n });\n this.quill.update(Quill.sources.SILENT);\n if (range != null) {\n this.quill.setSelection(range, Quill.sources.SILENT);\n }\n }\n\n highlightBlot(text: string, language = 'plain') {\n language = this.languages[language] ? language : 'plain';\n if (language === 'plain') {\n return escapeText(text)\n .split('\\n')\n .reduce((delta, line, i) => {\n if (i !== 0) {\n delta.insert('\\n', { [CodeBlock.blotName]: language });\n }\n return delta.insert(line);\n }, new Delta());\n }\n const container = this.quill.root.ownerDocument.createElement('div');\n container.classList.add(CodeBlock.className);\n container.innerHTML = highlight(this.options.hljs, language, text);\n return traverse(\n this.quill.scroll,\n container,\n [\n (node, delta) => {\n // @ts-expect-error\n const value = TokenAttributor.value(node);\n if (value) {\n return delta.compose(\n new Delta().retain(delta.length(), {\n [CodeToken.blotName]: value,\n }),\n );\n }\n return delta;\n },\n ],\n [\n (node, delta) => {\n // @ts-expect-error\n return node.data.split('\\n').reduce((memo, nodeText, i) => {\n if (i !== 0) memo.insert('\\n', { [CodeBlock.blotName]: language });\n return memo.insert(nodeText);\n }, delta);\n },\n ],\n new WeakMap(),\n );\n }\n}\nSyntax.DEFAULTS = {\n hljs: (() => {\n return window.hljs;\n })(),\n interval: 1000,\n languages: [\n { key: 'plain', label: 'Plain' },\n { key: 'bash', label: 'Bash' },\n { key: 'cpp', label: 'C++' },\n { key: 'cs', label: 'C#' },\n { key: 'css', label: 'CSS' },\n { key: 'diff', label: 'Diff' },\n { key: 'xml', label: 'HTML/XML' },\n { key: 'java', label: 'Java' },\n { key: 'javascript', label: 'JavaScript' },\n { key: 'markdown', label: 'Markdown' },\n { key: 'php', label: 'PHP' },\n { key: 'python', label: 'Python' },\n { key: 'ruby', label: 'Ruby' },\n { key: 'sql', label: 'SQL' },\n ],\n};\n\nexport { SyntaxCodeBlock as CodeBlock, CodeToken, Syntax as default };\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file diff --git a/public/assets/quill/modules/table.d.ts b/public/assets/quill/modules/table.d.ts new file mode 100644 index 0000000..12d1fd4 --- /dev/null +++ b/public/assets/quill/modules/table.d.ts @@ -0,0 +1,20 @@ +import Module from '../core/module.js'; +import { TableCell, TableRow } from '../formats/table.js'; +declare class Table extends Module { + static register(): void; + constructor(...args: ConstructorParameters); + balanceTables(): void; + deleteColumn(): void; + deleteRow(): void; + deleteTable(): void; + getTable(range?: import("../core/selection.js").Range | null): [null, null, null, -1] | [Table, TableRow, TableCell, number]; + insertColumn(offset: number): void; + insertColumnLeft(): void; + insertColumnRight(): void; + insertRow(offset: number): void; + insertRowAbove(): void; + insertRowBelow(): void; + insertTable(rows: number, columns: number): void; + listenBalanceCells(): void; +} +export default Table; diff --git a/public/assets/quill/modules/table.js b/public/assets/quill/modules/table.js new file mode 100644 index 0000000..3a357ae --- /dev/null +++ b/public/assets/quill/modules/table.js @@ -0,0 +1,125 @@ +import Delta from 'quill-delta'; +import Quill from '../core/quill.js'; +import Module from '../core/module.js'; +import { TableCell, TableRow, TableBody, TableContainer, tableId } from '../formats/table.js'; +class Table extends Module { + static register() { + Quill.register(TableCell); + Quill.register(TableRow); + Quill.register(TableBody); + Quill.register(TableContainer); + } + constructor() { + super(...arguments); + this.listenBalanceCells(); + } + balanceTables() { + this.quill.scroll.descendants(TableContainer).forEach(table => { + table.balanceCells(); + }); + } + deleteColumn() { + const [table,, cell] = this.getTable(); + if (cell == null) return; + // @ts-expect-error + table.deleteColumn(cell.cellOffset()); + this.quill.update(Quill.sources.USER); + } + deleteRow() { + const [, row] = this.getTable(); + if (row == null) return; + row.remove(); + this.quill.update(Quill.sources.USER); + } + deleteTable() { + const [table] = this.getTable(); + if (table == null) return; + // @ts-expect-error + const offset = table.offset(); + // @ts-expect-error + table.remove(); + this.quill.update(Quill.sources.USER); + this.quill.setSelection(offset, Quill.sources.SILENT); + } + getTable() { + let range = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.quill.getSelection(); + if (range == null) return [null, null, null, -1]; + const [cell, offset] = this.quill.getLine(range.index); + if (cell == null || cell.statics.blotName !== TableCell.blotName) { + return [null, null, null, -1]; + } + const row = cell.parent; + const table = row.parent.parent; + // @ts-expect-error + return [table, row, cell, offset]; + } + insertColumn(offset) { + const range = this.quill.getSelection(); + if (!range) return; + const [table, row, cell] = this.getTable(range); + if (cell == null) return; + const column = cell.cellOffset(); + table.insertColumn(column + offset); + this.quill.update(Quill.sources.USER); + let shift = row.rowOffset(); + if (offset === 0) { + shift += 1; + } + this.quill.setSelection(range.index + shift, range.length, Quill.sources.SILENT); + } + insertColumnLeft() { + this.insertColumn(0); + } + insertColumnRight() { + this.insertColumn(1); + } + insertRow(offset) { + const range = this.quill.getSelection(); + if (!range) return; + const [table, row, cell] = this.getTable(range); + if (cell == null) return; + const index = row.rowOffset(); + table.insertRow(index + offset); + this.quill.update(Quill.sources.USER); + if (offset > 0) { + this.quill.setSelection(range, Quill.sources.SILENT); + } else { + this.quill.setSelection(range.index + row.children.length, range.length, Quill.sources.SILENT); + } + } + insertRowAbove() { + this.insertRow(0); + } + insertRowBelow() { + this.insertRow(1); + } + insertTable(rows, columns) { + const range = this.quill.getSelection(); + if (range == null) return; + const delta = new Array(rows).fill(0).reduce(memo => { + const text = new Array(columns).fill('\n').join(''); + return memo.insert(text, { + table: tableId() + }); + }, new Delta().retain(range.index)); + this.quill.updateContents(delta, Quill.sources.USER); + this.quill.setSelection(range.index, Quill.sources.SILENT); + this.balanceTables(); + } + listenBalanceCells() { + this.quill.on(Quill.events.SCROLL_OPTIMIZE, mutations => { + mutations.some(mutation => { + if (['TD', 'TR', 'TBODY', 'TABLE'].includes(mutation.target.tagName)) { + this.quill.once(Quill.events.TEXT_CHANGE, (delta, old, source) => { + if (source !== Quill.sources.USER) return; + this.balanceTables(); + }); + return true; + } + return false; + }); + }); + } +} +export default Table; +//# sourceMappingURL=table.js.map \ No newline at end of file diff --git a/public/assets/quill/modules/table.js.map b/public/assets/quill/modules/table.js.map new file mode 100644 index 0000000..578d32e --- /dev/null +++ b/public/assets/quill/modules/table.js.map @@ -0,0 +1 @@ +{"version":3,"file":"table.js","names":["Delta","Quill","Module","TableCell","TableRow","TableBody","TableContainer","tableId","Table","register","constructor","arguments","listenBalanceCells","balanceTables","quill","scroll","descendants","forEach","table","balanceCells","deleteColumn","cell","getTable","cellOffset","update","sources","USER","deleteRow","row","remove","deleteTable","offset","setSelection","SILENT","range","length","undefined","getSelection","getLine","index","statics","blotName","parent","insertColumn","column","shift","rowOffset","insertColumnLeft","insertColumnRight","insertRow","children","insertRowAbove","insertRowBelow","insertTable","rows","columns","delta","Array","fill","reduce","memo","text","join","insert","retain","updateContents","on","events","SCROLL_OPTIMIZE","mutations","some","mutation","includes","target","tagName","once","TEXT_CHANGE","old","source"],"sources":["../../src/modules/table.ts"],"sourcesContent":["import Delta from 'quill-delta';\nimport Quill from '../core/quill.js';\nimport Module from '../core/module.js';\nimport {\n TableCell,\n TableRow,\n TableBody,\n TableContainer,\n tableId,\n} from '../formats/table.js';\n\nclass Table extends Module {\n static register() {\n Quill.register(TableCell);\n Quill.register(TableRow);\n Quill.register(TableBody);\n Quill.register(TableContainer);\n }\n\n constructor(...args: ConstructorParameters) {\n super(...args);\n this.listenBalanceCells();\n }\n\n balanceTables() {\n this.quill.scroll.descendants(TableContainer).forEach((table) => {\n table.balanceCells();\n });\n }\n\n deleteColumn() {\n const [table, , cell] = this.getTable();\n if (cell == null) return;\n // @ts-expect-error\n table.deleteColumn(cell.cellOffset());\n this.quill.update(Quill.sources.USER);\n }\n\n deleteRow() {\n const [, row] = this.getTable();\n if (row == null) return;\n row.remove();\n this.quill.update(Quill.sources.USER);\n }\n\n deleteTable() {\n const [table] = this.getTable();\n if (table == null) return;\n // @ts-expect-error\n const offset = table.offset();\n // @ts-expect-error\n table.remove();\n this.quill.update(Quill.sources.USER);\n this.quill.setSelection(offset, Quill.sources.SILENT);\n }\n\n getTable(\n range = this.quill.getSelection(),\n ): [null, null, null, -1] | [Table, TableRow, TableCell, number] {\n if (range == null) return [null, null, null, -1];\n const [cell, offset] = this.quill.getLine(range.index);\n if (cell == null || cell.statics.blotName !== TableCell.blotName) {\n return [null, null, null, -1];\n }\n const row = cell.parent;\n const table = row.parent.parent;\n // @ts-expect-error\n return [table, row, cell, offset];\n }\n\n insertColumn(offset: number) {\n const range = this.quill.getSelection();\n if (!range) return;\n const [table, row, cell] = this.getTable(range);\n if (cell == null) return;\n const column = cell.cellOffset();\n table.insertColumn(column + offset);\n this.quill.update(Quill.sources.USER);\n let shift = row.rowOffset();\n if (offset === 0) {\n shift += 1;\n }\n this.quill.setSelection(\n range.index + shift,\n range.length,\n Quill.sources.SILENT,\n );\n }\n\n insertColumnLeft() {\n this.insertColumn(0);\n }\n\n insertColumnRight() {\n this.insertColumn(1);\n }\n\n insertRow(offset: number) {\n const range = this.quill.getSelection();\n if (!range) return;\n const [table, row, cell] = this.getTable(range);\n if (cell == null) return;\n const index = row.rowOffset();\n table.insertRow(index + offset);\n this.quill.update(Quill.sources.USER);\n if (offset > 0) {\n this.quill.setSelection(range, Quill.sources.SILENT);\n } else {\n this.quill.setSelection(\n range.index + row.children.length,\n range.length,\n Quill.sources.SILENT,\n );\n }\n }\n\n insertRowAbove() {\n this.insertRow(0);\n }\n\n insertRowBelow() {\n this.insertRow(1);\n }\n\n insertTable(rows: number, columns: number) {\n const range = this.quill.getSelection();\n if (range == null) return;\n const delta = new Array(rows).fill(0).reduce((memo) => {\n const text = new Array(columns).fill('\\n').join('');\n return memo.insert(text, { table: tableId() });\n }, new Delta().retain(range.index));\n this.quill.updateContents(delta, Quill.sources.USER);\n this.quill.setSelection(range.index, Quill.sources.SILENT);\n this.balanceTables();\n }\n\n listenBalanceCells() {\n this.quill.on(\n Quill.events.SCROLL_OPTIMIZE,\n (mutations: MutationRecord[]) => {\n mutations.some((mutation) => {\n if (\n ['TD', 'TR', 'TBODY', 'TABLE'].includes(\n (mutation.target as HTMLElement).tagName,\n )\n ) {\n this.quill.once(Quill.events.TEXT_CHANGE, (delta, old, source) => {\n if (source !== Quill.sources.USER) return;\n this.balanceTables();\n });\n return true;\n }\n return false;\n });\n },\n );\n }\n}\n\nexport default Table;\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file diff --git a/public/assets/quill/modules/tableEmbed.d.ts b/public/assets/quill/modules/tableEmbed.d.ts new file mode 100644 index 0000000..0d0d083 --- /dev/null +++ b/public/assets/quill/modules/tableEmbed.d.ts @@ -0,0 +1,27 @@ +import Delta from 'quill-delta'; +import type { Op } from 'quill-delta'; +import Module from '../core/module.js'; +export type CellData = { + content?: Delta['ops']; + attributes?: Record; +}; +export type TableRowColumnOp = Omit & { + insert?: { + id: string; + }; +}; +export interface TableData { + rows?: Delta['ops']; + columns?: Delta['ops']; + cells?: Record; +} +export declare const composePosition: (delta: Delta, index: number) => number | null; +export declare const tableHandler: { + compose(a: TableData, b: TableData, keepNull?: boolean): TableData; + transform(a: TableData, b: TableData, priority: boolean): TableData; + invert(change: TableData, base: TableData): TableData; +}; +declare class TableEmbed extends Module { + static register(): void; +} +export default TableEmbed; diff --git a/public/assets/quill/modules/tableEmbed.js b/public/assets/quill/modules/tableEmbed.js new file mode 100644 index 0000000..2db3185 --- /dev/null +++ b/public/assets/quill/modules/tableEmbed.js @@ -0,0 +1,209 @@ +import Delta, { OpIterator } from 'quill-delta'; +import Module from '../core/module.js'; +const parseCellIdentity = identity => { + const parts = identity.split(':'); + return [Number(parts[0]) - 1, Number(parts[1]) - 1]; +}; +const stringifyCellIdentity = (row, column) => `${row + 1}:${column + 1}`; +export const composePosition = (delta, index) => { + let newIndex = index; + const thisIter = new OpIterator(delta.ops); + let offset = 0; + while (thisIter.hasNext() && offset <= newIndex) { + const length = thisIter.peekLength(); + const nextType = thisIter.peekType(); + thisIter.next(); + switch (nextType) { + case 'delete': + if (length > newIndex - offset) { + return null; + } + newIndex -= length; + break; + case 'insert': + newIndex += length; + offset += length; + break; + default: + offset += length; + break; + } + } + return newIndex; +}; +const compactCellData = _ref => { + let { + content, + attributes + } = _ref; + const data = {}; + if (content.length() > 0) { + data.content = content.ops; + } + if (attributes && Object.keys(attributes).length > 0) { + data.attributes = attributes; + } + return Object.keys(data).length > 0 ? data : null; +}; +const compactTableData = _ref2 => { + let { + rows, + columns, + cells + } = _ref2; + const data = {}; + if (rows.length() > 0) { + data.rows = rows.ops; + } + if (columns.length() > 0) { + data.columns = columns.ops; + } + if (Object.keys(cells).length) { + data.cells = cells; + } + return data; +}; +const reindexCellIdentities = (cells, _ref3) => { + let { + rows, + columns + } = _ref3; + const reindexedCells = {}; + Object.keys(cells).forEach(identity => { + let [row, column] = parseCellIdentity(identity); + + // @ts-expect-error Fix me later + row = composePosition(rows, row); + // @ts-expect-error Fix me later + column = composePosition(columns, column); + if (row !== null && column !== null) { + const newPosition = stringifyCellIdentity(row, column); + reindexedCells[newPosition] = cells[identity]; + } + }, false); + return reindexedCells; +}; +export const tableHandler = { + compose(a, b, keepNull) { + const rows = new Delta(a.rows || []).compose(new Delta(b.rows || [])); + const columns = new Delta(a.columns || []).compose(new Delta(b.columns || [])); + const cells = reindexCellIdentities(a.cells || {}, { + rows: new Delta(b.rows || []), + columns: new Delta(b.columns || []) + }); + Object.keys(b.cells || {}).forEach(identity => { + const aCell = cells[identity] || {}; + // @ts-expect-error Fix me later + const bCell = b.cells[identity]; + const content = new Delta(aCell.content || []).compose(new Delta(bCell.content || [])); + const attributes = Delta.AttributeMap.compose(aCell.attributes, bCell.attributes, keepNull); + const cell = compactCellData({ + content, + attributes + }); + if (cell) { + cells[identity] = cell; + } else { + delete cells[identity]; + } + }); + return compactTableData({ + rows, + columns, + cells + }); + }, + transform(a, b, priority) { + const aDeltas = { + rows: new Delta(a.rows || []), + columns: new Delta(a.columns || []) + }; + const bDeltas = { + rows: new Delta(b.rows || []), + columns: new Delta(b.columns || []) + }; + const rows = aDeltas.rows.transform(bDeltas.rows, priority); + const columns = aDeltas.columns.transform(bDeltas.columns, priority); + const cells = reindexCellIdentities(b.cells || {}, { + rows: bDeltas.rows.transform(aDeltas.rows, !priority), + columns: bDeltas.columns.transform(aDeltas.columns, !priority) + }); + Object.keys(a.cells || {}).forEach(identity => { + let [row, column] = parseCellIdentity(identity); + // @ts-expect-error Fix me later + row = composePosition(rows, row); + // @ts-expect-error Fix me later + column = composePosition(columns, column); + if (row !== null && column !== null) { + const newIdentity = stringifyCellIdentity(row, column); + + // @ts-expect-error Fix me later + const aCell = a.cells[identity]; + const bCell = cells[newIdentity]; + if (bCell) { + const content = new Delta(aCell.content || []).transform(new Delta(bCell.content || []), priority); + const attributes = Delta.AttributeMap.transform(aCell.attributes, bCell.attributes, priority); + const cell = compactCellData({ + content, + attributes + }); + if (cell) { + cells[newIdentity] = cell; + } else { + delete cells[newIdentity]; + } + } + } + }); + return compactTableData({ + rows, + columns, + cells + }); + }, + invert(change, base) { + const rows = new Delta(change.rows || []).invert(new Delta(base.rows || [])); + const columns = new Delta(change.columns || []).invert(new Delta(base.columns || [])); + const cells = reindexCellIdentities(change.cells || {}, { + rows, + columns + }); + Object.keys(cells).forEach(identity => { + const changeCell = cells[identity] || {}; + const baseCell = (base.cells || {})[identity] || {}; + const content = new Delta(changeCell.content || []).invert(new Delta(baseCell.content || [])); + const attributes = Delta.AttributeMap.invert(changeCell.attributes, baseCell.attributes); + const cell = compactCellData({ + content, + attributes + }); + if (cell) { + cells[identity] = cell; + } else { + delete cells[identity]; + } + }); + + // Cells may be removed when their row or column is removed + // by row/column deltas. We should add them back. + Object.keys(base.cells || {}).forEach(identity => { + const [row, column] = parseCellIdentity(identity); + if (composePosition(new Delta(change.rows || []), row) === null || composePosition(new Delta(change.columns || []), column) === null) { + // @ts-expect-error Fix me later + cells[identity] = base.cells[identity]; + } + }); + return compactTableData({ + rows, + columns, + cells + }); + } +}; +class TableEmbed extends Module { + static register() { + Delta.registerEmbed('table-embed', tableHandler); + } +} +export default TableEmbed; +//# sourceMappingURL=tableEmbed.js.map \ No newline at end of file diff --git a/public/assets/quill/modules/tableEmbed.js.map b/public/assets/quill/modules/tableEmbed.js.map new file mode 100644 index 0000000..f54e788 --- /dev/null +++ b/public/assets/quill/modules/tableEmbed.js.map @@ -0,0 +1 @@ +{"version":3,"file":"tableEmbed.js","names":["Delta","OpIterator","Module","parseCellIdentity","identity","parts","split","Number","stringifyCellIdentity","row","column","composePosition","delta","index","newIndex","thisIter","ops","offset","hasNext","length","peekLength","nextType","peekType","next","compactCellData","_ref","content","attributes","data","Object","keys","compactTableData","_ref2","rows","columns","cells","reindexCellIdentities","_ref3","reindexedCells","forEach","newPosition","tableHandler","compose","a","b","keepNull","aCell","bCell","AttributeMap","cell","transform","priority","aDeltas","bDeltas","newIdentity","invert","change","base","changeCell","baseCell","TableEmbed","register","registerEmbed"],"sources":["../../src/modules/tableEmbed.ts"],"sourcesContent":["import Delta, { OpIterator } from 'quill-delta';\nimport type { Op, AttributeMap } from 'quill-delta';\nimport Module from '../core/module.js';\n\nexport type CellData = {\n content?: Delta['ops'];\n attributes?: Record;\n};\n\nexport type TableRowColumnOp = Omit & {\n insert?: { id: string };\n};\n\nexport interface TableData {\n rows?: Delta['ops'];\n columns?: Delta['ops'];\n cells?: Record;\n}\n\nconst parseCellIdentity = (identity: string) => {\n const parts = identity.split(':');\n return [Number(parts[0]) - 1, Number(parts[1]) - 1];\n};\n\nconst stringifyCellIdentity = (row: number, column: number) =>\n `${row + 1}:${column + 1}`;\n\nexport const composePosition = (delta: Delta, index: number) => {\n let newIndex = index;\n const thisIter = new OpIterator(delta.ops);\n let offset = 0;\n while (thisIter.hasNext() && offset <= newIndex) {\n const length = thisIter.peekLength();\n const nextType = thisIter.peekType();\n thisIter.next();\n switch (nextType) {\n case 'delete':\n if (length > newIndex - offset) {\n return null;\n }\n newIndex -= length;\n break;\n case 'insert':\n newIndex += length;\n offset += length;\n break;\n default:\n offset += length;\n break;\n }\n }\n return newIndex;\n};\n\nconst compactCellData = ({\n content,\n attributes,\n}: {\n content: Delta;\n attributes: AttributeMap | undefined;\n}) => {\n const data: CellData = {};\n if (content.length() > 0) {\n data.content = content.ops;\n }\n if (attributes && Object.keys(attributes).length > 0) {\n data.attributes = attributes;\n }\n return Object.keys(data).length > 0 ? data : null;\n};\n\nconst compactTableData = ({\n rows,\n columns,\n cells,\n}: {\n rows: Delta;\n columns: Delta;\n cells: Record;\n}) => {\n const data: TableData = {};\n if (rows.length() > 0) {\n data.rows = rows.ops;\n }\n\n if (columns.length() > 0) {\n data.columns = columns.ops;\n }\n\n if (Object.keys(cells).length) {\n data.cells = cells;\n }\n\n return data;\n};\n\nconst reindexCellIdentities = (\n cells: Record,\n { rows, columns }: { rows: Delta; columns: Delta },\n) => {\n const reindexedCells: Record = {};\n Object.keys(cells).forEach((identity) => {\n let [row, column] = parseCellIdentity(identity);\n\n // @ts-expect-error Fix me later\n row = composePosition(rows, row);\n // @ts-expect-error Fix me later\n column = composePosition(columns, column);\n\n if (row !== null && column !== null) {\n const newPosition = stringifyCellIdentity(row, column);\n reindexedCells[newPosition] = cells[identity];\n }\n }, false);\n return reindexedCells;\n};\n\nexport const tableHandler = {\n compose(a: TableData, b: TableData, keepNull?: boolean) {\n const rows = new Delta(a.rows || []).compose(new Delta(b.rows || []));\n const columns = new Delta(a.columns || []).compose(\n new Delta(b.columns || []),\n );\n\n const cells = reindexCellIdentities(a.cells || {}, {\n rows: new Delta(b.rows || []),\n columns: new Delta(b.columns || []),\n });\n\n Object.keys(b.cells || {}).forEach((identity) => {\n const aCell = cells[identity] || {};\n // @ts-expect-error Fix me later\n const bCell = b.cells[identity];\n\n const content = new Delta(aCell.content || []).compose(\n new Delta(bCell.content || []),\n );\n\n const attributes = Delta.AttributeMap.compose(\n aCell.attributes,\n bCell.attributes,\n keepNull,\n );\n\n const cell = compactCellData({ content, attributes });\n if (cell) {\n cells[identity] = cell;\n } else {\n delete cells[identity];\n }\n });\n\n return compactTableData({ rows, columns, cells });\n },\n transform(a: TableData, b: TableData, priority: boolean) {\n const aDeltas = {\n rows: new Delta(a.rows || []),\n columns: new Delta(a.columns || []),\n };\n\n const bDeltas = {\n rows: new Delta(b.rows || []),\n columns: new Delta(b.columns || []),\n };\n\n const rows = aDeltas.rows.transform(bDeltas.rows, priority);\n const columns = aDeltas.columns.transform(bDeltas.columns, priority);\n\n const cells = reindexCellIdentities(b.cells || {}, {\n rows: bDeltas.rows.transform(aDeltas.rows, !priority),\n columns: bDeltas.columns.transform(aDeltas.columns, !priority),\n });\n\n Object.keys(a.cells || {}).forEach((identity) => {\n let [row, column] = parseCellIdentity(identity);\n // @ts-expect-error Fix me later\n row = composePosition(rows, row);\n // @ts-expect-error Fix me later\n column = composePosition(columns, column);\n\n if (row !== null && column !== null) {\n const newIdentity = stringifyCellIdentity(row, column);\n\n // @ts-expect-error Fix me later\n const aCell = a.cells[identity];\n const bCell = cells[newIdentity];\n if (bCell) {\n const content = new Delta(aCell.content || []).transform(\n new Delta(bCell.content || []),\n priority,\n );\n\n const attributes = Delta.AttributeMap.transform(\n aCell.attributes,\n bCell.attributes,\n priority,\n );\n\n const cell = compactCellData({ content, attributes });\n if (cell) {\n cells[newIdentity] = cell;\n } else {\n delete cells[newIdentity];\n }\n }\n }\n });\n\n return compactTableData({ rows, columns, cells });\n },\n invert(change: TableData, base: TableData) {\n const rows = new Delta(change.rows || []).invert(\n new Delta(base.rows || []),\n );\n const columns = new Delta(change.columns || []).invert(\n new Delta(base.columns || []),\n );\n const cells = reindexCellIdentities(change.cells || {}, {\n rows,\n columns,\n });\n Object.keys(cells).forEach((identity) => {\n const changeCell = cells[identity] || {};\n const baseCell = (base.cells || {})[identity] || {};\n const content = new Delta(changeCell.content || []).invert(\n new Delta(baseCell.content || []),\n );\n const attributes = Delta.AttributeMap.invert(\n changeCell.attributes,\n baseCell.attributes,\n );\n const cell = compactCellData({ content, attributes });\n if (cell) {\n cells[identity] = cell;\n } else {\n delete cells[identity];\n }\n });\n\n // Cells may be removed when their row or column is removed\n // by row/column deltas. We should add them back.\n Object.keys(base.cells || {}).forEach((identity) => {\n const [row, column] = parseCellIdentity(identity);\n if (\n composePosition(new Delta(change.rows || []), row) === null ||\n composePosition(new Delta(change.columns || []), column) === null\n ) {\n // @ts-expect-error Fix me later\n cells[identity] = base.cells[identity];\n }\n });\n\n return compactTableData({ rows, columns, cells });\n },\n};\n\nclass TableEmbed extends Module {\n static register() {\n Delta.registerEmbed('table-embed', tableHandler);\n }\n}\n\nexport default TableEmbed;\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file diff --git a/public/assets/quill/modules/toolbar.d.ts b/public/assets/quill/modules/toolbar.d.ts new file mode 100644 index 0000000..f8e662f --- /dev/null +++ b/public/assets/quill/modules/toolbar.d.ts @@ -0,0 +1,24 @@ +import Quill from '../core/quill.js'; +import Module from '../core/module.js'; +import type { Range } from '../core/selection.js'; +type Handler = (this: Toolbar, value: any) => void; +export type ToolbarConfig = Array>>; +export interface ToolbarProps { + container?: HTMLElement | ToolbarConfig | null; + handlers?: Record; + option?: number; + module?: boolean; + theme?: boolean; +} +declare class Toolbar extends Module { + static DEFAULTS: ToolbarProps; + container?: HTMLElement | null; + controls: [string, HTMLElement][]; + handlers: Record; + constructor(quill: Quill, options: Partial); + addHandler(format: string, handler: Handler): void; + attach(input: HTMLElement): void; + update(range: Range | null): void; +} +declare function addControls(container: HTMLElement, groups: (string | Record)[][] | (string | Record)[]): void; +export { Toolbar as default, addControls }; diff --git a/public/assets/quill/modules/toolbar.js b/public/assets/quill/modules/toolbar.js new file mode 100644 index 0000000..9d3fb61 --- /dev/null +++ b/public/assets/quill/modules/toolbar.js @@ -0,0 +1,265 @@ +import Delta from 'quill-delta'; +import { EmbedBlot, Scope } from 'parchment'; +import Quill from '../core/quill.js'; +import logger from '../core/logger.js'; +import Module from '../core/module.js'; +const debug = logger('quill:toolbar'); +class Toolbar extends Module { + constructor(quill, options) { + super(quill, options); + if (Array.isArray(this.options.container)) { + const container = document.createElement('div'); + container.setAttribute('role', 'toolbar'); + addControls(container, this.options.container); + quill.container?.parentNode?.insertBefore(container, quill.container); + this.container = container; + } else if (typeof this.options.container === 'string') { + this.container = document.querySelector(this.options.container); + } else { + this.container = this.options.container; + } + if (!(this.container instanceof HTMLElement)) { + debug.error('Container required for toolbar', this.options); + return; + } + this.container.classList.add('ql-toolbar'); + this.controls = []; + this.handlers = {}; + if (this.options.handlers) { + Object.keys(this.options.handlers).forEach(format => { + const handler = this.options.handlers?.[format]; + if (handler) { + this.addHandler(format, handler); + } + }); + } + Array.from(this.container.querySelectorAll('button, select')).forEach(input => { + // @ts-expect-error + this.attach(input); + }); + this.quill.on(Quill.events.EDITOR_CHANGE, () => { + const [range] = this.quill.selection.getRange(); // quill.getSelection triggers update + this.update(range); + }); + } + addHandler(format, handler) { + this.handlers[format] = handler; + } + attach(input) { + let format = Array.from(input.classList).find(className => { + return className.indexOf('ql-') === 0; + }); + if (!format) return; + format = format.slice('ql-'.length); + if (input.tagName === 'BUTTON') { + input.setAttribute('type', 'button'); + } + if (this.handlers[format] == null && this.quill.scroll.query(format) == null) { + debug.warn('ignoring attaching to nonexistent format', format, input); + return; + } + const eventName = input.tagName === 'SELECT' ? 'change' : 'click'; + input.addEventListener(eventName, e => { + let value; + if (input.tagName === 'SELECT') { + // @ts-expect-error + if (input.selectedIndex < 0) return; + // @ts-expect-error + const selected = input.options[input.selectedIndex]; + if (selected.hasAttribute('selected')) { + value = false; + } else { + value = selected.value || false; + } + } else { + if (input.classList.contains('ql-active')) { + value = false; + } else { + // @ts-expect-error + value = input.value || !input.hasAttribute('value'); + } + e.preventDefault(); + } + this.quill.focus(); + const [range] = this.quill.selection.getRange(); + if (this.handlers[format] != null) { + this.handlers[format].call(this, value); + } else if ( + // @ts-expect-error + this.quill.scroll.query(format).prototype instanceof EmbedBlot) { + value = prompt(`Enter ${format}`); // eslint-disable-line no-alert + if (!value) return; + this.quill.updateContents(new Delta() + // @ts-expect-error Fix me later + .retain(range.index) + // @ts-expect-error Fix me later + .delete(range.length).insert({ + [format]: value + }), Quill.sources.USER); + } else { + this.quill.format(format, value, Quill.sources.USER); + } + this.update(range); + }); + this.controls.push([format, input]); + } + update(range) { + const formats = range == null ? {} : this.quill.getFormat(range); + this.controls.forEach(pair => { + const [format, input] = pair; + if (input.tagName === 'SELECT') { + let option = null; + if (range == null) { + option = null; + } else if (formats[format] == null) { + option = input.querySelector('option[selected]'); + } else if (!Array.isArray(formats[format])) { + let value = formats[format]; + if (typeof value === 'string') { + value = value.replace(/"/g, '\\"'); + } + option = input.querySelector(`option[value="${value}"]`); + } + if (option == null) { + // @ts-expect-error TODO fix me later + input.value = ''; // TODO make configurable? + // @ts-expect-error TODO fix me later + input.selectedIndex = -1; + } else { + option.selected = true; + } + } else if (range == null) { + input.classList.remove('ql-active'); + input.setAttribute('aria-pressed', 'false'); + } else if (input.hasAttribute('value')) { + // both being null should match (default values) + // '1' should match with 1 (headers) + const value = formats[format]; + const isActive = value === input.getAttribute('value') || value != null && value.toString() === input.getAttribute('value') || value == null && !input.getAttribute('value'); + input.classList.toggle('ql-active', isActive); + input.setAttribute('aria-pressed', isActive.toString()); + } else { + const isActive = formats[format] != null; + input.classList.toggle('ql-active', isActive); + input.setAttribute('aria-pressed', isActive.toString()); + } + }); + } +} +Toolbar.DEFAULTS = {}; +function addButton(container, format, value) { + const input = document.createElement('button'); + input.setAttribute('type', 'button'); + input.classList.add(`ql-${format}`); + input.setAttribute('aria-pressed', 'false'); + if (value != null) { + input.value = value; + input.setAttribute('aria-label', `${format}: ${value}`); + } else { + input.setAttribute('aria-label', format); + } + container.appendChild(input); +} +function addControls(container, groups) { + if (!Array.isArray(groups[0])) { + // @ts-expect-error + groups = [groups]; + } + groups.forEach(controls => { + const group = document.createElement('span'); + group.classList.add('ql-formats'); + controls.forEach(control => { + if (typeof control === 'string') { + addButton(group, control); + } else { + const format = Object.keys(control)[0]; + const value = control[format]; + if (Array.isArray(value)) { + addSelect(group, format, value); + } else { + addButton(group, format, value); + } + } + }); + container.appendChild(group); + }); +} +function addSelect(container, format, values) { + const input = document.createElement('select'); + input.classList.add(`ql-${format}`); + values.forEach(value => { + const option = document.createElement('option'); + if (value !== false) { + option.setAttribute('value', String(value)); + } else { + option.setAttribute('selected', 'selected'); + } + input.appendChild(option); + }); + container.appendChild(input); +} +Toolbar.DEFAULTS = { + container: null, + handlers: { + clean() { + const range = this.quill.getSelection(); + if (range == null) return; + if (range.length === 0) { + const formats = this.quill.getFormat(); + Object.keys(formats).forEach(name => { + // Clean functionality in existing apps only clean inline formats + if (this.quill.scroll.query(name, Scope.INLINE) != null) { + this.quill.format(name, false, Quill.sources.USER); + } + }); + } else { + this.quill.removeFormat(range.index, range.length, Quill.sources.USER); + } + }, + direction(value) { + const { + align + } = this.quill.getFormat(); + if (value === 'rtl' && align == null) { + this.quill.format('align', 'right', Quill.sources.USER); + } else if (!value && align === 'right') { + this.quill.format('align', false, Quill.sources.USER); + } + this.quill.format('direction', value, Quill.sources.USER); + }, + indent(value) { + const range = this.quill.getSelection(); + // @ts-expect-error + const formats = this.quill.getFormat(range); + // @ts-expect-error + const indent = parseInt(formats.indent || 0, 10); + if (value === '+1' || value === '-1') { + let modifier = value === '+1' ? 1 : -1; + if (formats.direction === 'rtl') modifier *= -1; + this.quill.format('indent', indent + modifier, Quill.sources.USER); + } + }, + link(value) { + if (value === true) { + value = prompt('Enter link URL:'); // eslint-disable-line no-alert + } + this.quill.format('link', value, Quill.sources.USER); + }, + list(value) { + const range = this.quill.getSelection(); + // @ts-expect-error + const formats = this.quill.getFormat(range); + if (value === 'check') { + if (formats.list === 'checked' || formats.list === 'unchecked') { + this.quill.format('list', false, Quill.sources.USER); + } else { + this.quill.format('list', 'unchecked', Quill.sources.USER); + } + } else { + this.quill.format('list', value, Quill.sources.USER); + } + } + } +}; +export { Toolbar as default, addControls }; +//# sourceMappingURL=toolbar.js.map \ No newline at end of file diff --git a/public/assets/quill/modules/toolbar.js.map b/public/assets/quill/modules/toolbar.js.map new file mode 100644 index 0000000..b819ee4 --- /dev/null +++ b/public/assets/quill/modules/toolbar.js.map @@ -0,0 +1 @@ +{"version":3,"file":"toolbar.js","names":["Delta","EmbedBlot","Scope","Quill","logger","Module","debug","Toolbar","constructor","quill","options","Array","isArray","container","document","createElement","setAttribute","addControls","parentNode","insertBefore","querySelector","HTMLElement","error","classList","add","controls","handlers","Object","keys","forEach","format","handler","addHandler","from","querySelectorAll","input","attach","on","events","EDITOR_CHANGE","range","selection","getRange","update","find","className","indexOf","slice","length","tagName","scroll","query","warn","eventName","addEventListener","e","value","selectedIndex","selected","hasAttribute","contains","preventDefault","focus","call","prototype","prompt","updateContents","retain","index","delete","insert","sources","USER","push","formats","getFormat","pair","option","replace","remove","isActive","getAttribute","toString","toggle","DEFAULTS","addButton","appendChild","groups","group","control","addSelect","values","String","clean","getSelection","name","INLINE","removeFormat","direction","align","indent","parseInt","modifier","link","list","default"],"sources":["../../src/modules/toolbar.ts"],"sourcesContent":["import Delta from 'quill-delta';\nimport { EmbedBlot, Scope } from 'parchment';\nimport Quill from '../core/quill.js';\nimport logger from '../core/logger.js';\nimport Module from '../core/module.js';\nimport type { Range } from '../core/selection.js';\n\nconst debug = logger('quill:toolbar');\n\ntype Handler = (this: Toolbar, value: any) => void;\n\nexport type ToolbarConfig = Array<\n string[] | Array>\n>;\nexport interface ToolbarProps {\n container?: HTMLElement | ToolbarConfig | null;\n handlers?: Record;\n option?: number;\n module?: boolean;\n theme?: boolean;\n}\n\nclass Toolbar extends Module {\n static DEFAULTS: ToolbarProps;\n\n container?: HTMLElement | null;\n controls: [string, HTMLElement][];\n handlers: Record;\n\n constructor(quill: Quill, options: Partial) {\n super(quill, options);\n if (Array.isArray(this.options.container)) {\n const container = document.createElement('div');\n container.setAttribute('role', 'toolbar');\n addControls(container, this.options.container);\n quill.container?.parentNode?.insertBefore(container, quill.container);\n this.container = container;\n } else if (typeof this.options.container === 'string') {\n this.container = document.querySelector(this.options.container);\n } else {\n this.container = this.options.container;\n }\n if (!(this.container instanceof HTMLElement)) {\n debug.error('Container required for toolbar', this.options);\n return;\n }\n this.container.classList.add('ql-toolbar');\n this.controls = [];\n this.handlers = {};\n if (this.options.handlers) {\n Object.keys(this.options.handlers).forEach((format) => {\n const handler = this.options.handlers?.[format];\n if (handler) {\n this.addHandler(format, handler);\n }\n });\n }\n Array.from(this.container.querySelectorAll('button, select')).forEach(\n (input) => {\n // @ts-expect-error\n this.attach(input);\n },\n );\n this.quill.on(Quill.events.EDITOR_CHANGE, () => {\n const [range] = this.quill.selection.getRange(); // quill.getSelection triggers update\n this.update(range);\n });\n }\n\n addHandler(format: string, handler: Handler) {\n this.handlers[format] = handler;\n }\n\n attach(input: HTMLElement) {\n let format = Array.from(input.classList).find((className) => {\n return className.indexOf('ql-') === 0;\n });\n if (!format) return;\n format = format.slice('ql-'.length);\n if (input.tagName === 'BUTTON') {\n input.setAttribute('type', 'button');\n }\n if (\n this.handlers[format] == null &&\n this.quill.scroll.query(format) == null\n ) {\n debug.warn('ignoring attaching to nonexistent format', format, input);\n return;\n }\n const eventName = input.tagName === 'SELECT' ? 'change' : 'click';\n input.addEventListener(eventName, (e) => {\n let value;\n if (input.tagName === 'SELECT') {\n // @ts-expect-error\n if (input.selectedIndex < 0) return;\n // @ts-expect-error\n const selected = input.options[input.selectedIndex];\n if (selected.hasAttribute('selected')) {\n value = false;\n } else {\n value = selected.value || false;\n }\n } else {\n if (input.classList.contains('ql-active')) {\n value = false;\n } else {\n // @ts-expect-error\n value = input.value || !input.hasAttribute('value');\n }\n e.preventDefault();\n }\n this.quill.focus();\n const [range] = this.quill.selection.getRange();\n if (this.handlers[format] != null) {\n this.handlers[format].call(this, value);\n } else if (\n // @ts-expect-error\n this.quill.scroll.query(format).prototype instanceof EmbedBlot\n ) {\n value = prompt(`Enter ${format}`); // eslint-disable-line no-alert\n if (!value) return;\n this.quill.updateContents(\n new Delta()\n // @ts-expect-error Fix me later\n .retain(range.index)\n // @ts-expect-error Fix me later\n .delete(range.length)\n .insert({ [format]: value }),\n Quill.sources.USER,\n );\n } else {\n this.quill.format(format, value, Quill.sources.USER);\n }\n this.update(range);\n });\n this.controls.push([format, input]);\n }\n\n update(range: Range | null) {\n const formats = range == null ? {} : this.quill.getFormat(range);\n this.controls.forEach((pair) => {\n const [format, input] = pair;\n if (input.tagName === 'SELECT') {\n let option: HTMLOptionElement | null = null;\n if (range == null) {\n option = null;\n } else if (formats[format] == null) {\n option = input.querySelector('option[selected]');\n } else if (!Array.isArray(formats[format])) {\n let value = formats[format];\n if (typeof value === 'string') {\n value = value.replace(/\"/g, '\\\\\"');\n }\n option = input.querySelector(`option[value=\"${value}\"]`);\n }\n if (option == null) {\n // @ts-expect-error TODO fix me later\n input.value = ''; // TODO make configurable?\n // @ts-expect-error TODO fix me later\n input.selectedIndex = -1;\n } else {\n option.selected = true;\n }\n } else if (range == null) {\n input.classList.remove('ql-active');\n input.setAttribute('aria-pressed', 'false');\n } else if (input.hasAttribute('value')) {\n // both being null should match (default values)\n // '1' should match with 1 (headers)\n const value = formats[format] as boolean | number | string | object;\n const isActive =\n value === input.getAttribute('value') ||\n (value != null && value.toString() === input.getAttribute('value')) ||\n (value == null && !input.getAttribute('value'));\n input.classList.toggle('ql-active', isActive);\n input.setAttribute('aria-pressed', isActive.toString());\n } else {\n const isActive = formats[format] != null;\n input.classList.toggle('ql-active', isActive);\n input.setAttribute('aria-pressed', isActive.toString());\n }\n });\n }\n}\nToolbar.DEFAULTS = {};\n\nfunction addButton(container: HTMLElement, format: string, value?: string) {\n const input = document.createElement('button');\n input.setAttribute('type', 'button');\n input.classList.add(`ql-${format}`);\n input.setAttribute('aria-pressed', 'false');\n if (value != null) {\n input.value = value;\n input.setAttribute('aria-label', `${format}: ${value}`);\n } else {\n input.setAttribute('aria-label', format);\n }\n container.appendChild(input);\n}\n\nfunction addControls(\n container: HTMLElement,\n groups:\n | (string | Record)[][]\n | (string | Record)[],\n) {\n if (!Array.isArray(groups[0])) {\n // @ts-expect-error\n groups = [groups];\n }\n groups.forEach((controls: any) => {\n const group = document.createElement('span');\n group.classList.add('ql-formats');\n controls.forEach((control: any) => {\n if (typeof control === 'string') {\n addButton(group, control);\n } else {\n const format = Object.keys(control)[0];\n const value = control[format];\n if (Array.isArray(value)) {\n addSelect(group, format, value);\n } else {\n addButton(group, format, value);\n }\n }\n });\n container.appendChild(group);\n });\n}\n\nfunction addSelect(\n container: HTMLElement,\n format: string,\n values: Array,\n) {\n const input = document.createElement('select');\n input.classList.add(`ql-${format}`);\n values.forEach((value) => {\n const option = document.createElement('option');\n if (value !== false) {\n option.setAttribute('value', String(value));\n } else {\n option.setAttribute('selected', 'selected');\n }\n input.appendChild(option);\n });\n container.appendChild(input);\n}\n\nToolbar.DEFAULTS = {\n container: null,\n handlers: {\n clean() {\n const range = this.quill.getSelection();\n if (range == null) return;\n if (range.length === 0) {\n const formats = this.quill.getFormat();\n Object.keys(formats).forEach((name) => {\n // Clean functionality in existing apps only clean inline formats\n if (this.quill.scroll.query(name, Scope.INLINE) != null) {\n this.quill.format(name, false, Quill.sources.USER);\n }\n });\n } else {\n this.quill.removeFormat(range.index, range.length, Quill.sources.USER);\n }\n },\n direction(value) {\n const { align } = this.quill.getFormat();\n if (value === 'rtl' && align == null) {\n this.quill.format('align', 'right', Quill.sources.USER);\n } else if (!value && align === 'right') {\n this.quill.format('align', false, Quill.sources.USER);\n }\n this.quill.format('direction', value, Quill.sources.USER);\n },\n indent(value) {\n const range = this.quill.getSelection();\n // @ts-expect-error\n const formats = this.quill.getFormat(range);\n // @ts-expect-error\n const indent = parseInt(formats.indent || 0, 10);\n if (value === '+1' || value === '-1') {\n let modifier = value === '+1' ? 1 : -1;\n if (formats.direction === 'rtl') modifier *= -1;\n this.quill.format('indent', indent + modifier, Quill.sources.USER);\n }\n },\n link(value) {\n if (value === true) {\n value = prompt('Enter link URL:'); // eslint-disable-line no-alert\n }\n this.quill.format('link', value, Quill.sources.USER);\n },\n list(value) {\n const range = this.quill.getSelection();\n // @ts-expect-error\n const formats = this.quill.getFormat(range);\n if (value === 'check') {\n if (formats.list === 'checked' || formats.list === 'unchecked') {\n this.quill.format('list', false, Quill.sources.USER);\n } else {\n this.quill.format('list', 'unchecked', Quill.sources.USER);\n }\n } else {\n this.quill.format('list', value, Quill.sources.USER);\n }\n },\n },\n};\n\nexport { Toolbar as default, addControls };\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file diff --git a/public/assets/quill/modules/uiNode.d.ts b/public/assets/quill/modules/uiNode.d.ts new file mode 100644 index 0000000..3c77e5e --- /dev/null +++ b/public/assets/quill/modules/uiNode.d.ts @@ -0,0 +1,19 @@ +import Module from '../core/module.js'; +import Quill from '../core/quill.js'; +export declare const TTL_FOR_VALID_SELECTION_CHANGE = 100; +declare class UINode extends Module { + isListening: boolean; + selectionChangeDeadline: number; + constructor(quill: Quill, options: Record); + private handleArrowKeys; + private handleNavigationShortcuts; + /** + * We only listen to the `selectionchange` event when + * there is an intention of moving the caret to the beginning using shortcuts. + * This is primarily implemented to prevent infinite loops, as we are changing + * the selection within the handler of a `selectionchange` event. + */ + private ensureListeningToSelectionChange; + private handleSelectionChange; +} +export default UINode; diff --git a/public/assets/quill/modules/uiNode.js b/public/assets/quill/modules/uiNode.js new file mode 100644 index 0000000..b41da83 --- /dev/null +++ b/public/assets/quill/modules/uiNode.js @@ -0,0 +1,95 @@ +import { ParentBlot } from 'parchment'; +import Module from '../core/module.js'; +import Quill from '../core/quill.js'; +const isMac = /Mac/i.test(navigator.platform); + +// Export for testing +export const TTL_FOR_VALID_SELECTION_CHANGE = 100; + +// A loose check to determine if the shortcut can move the caret before a UI node: +// [CARET]
    [CONTENT]
    +const canMoveCaretBeforeUINode = event => { + if (event.key === 'ArrowLeft' || event.key === 'ArrowRight' || + // RTL scripts or moving from the end of the previous line + event.key === 'ArrowUp' || event.key === 'ArrowDown' || event.key === 'Home') { + return true; + } + if (isMac && event.key === 'a' && event.ctrlKey === true) { + return true; + } + return false; +}; +class UINode extends Module { + isListening = false; + selectionChangeDeadline = 0; + constructor(quill, options) { + super(quill, options); + this.handleArrowKeys(); + this.handleNavigationShortcuts(); + } + handleArrowKeys() { + this.quill.keyboard.addBinding({ + key: ['ArrowLeft', 'ArrowRight'], + offset: 0, + shiftKey: null, + handler(range, _ref) { + let { + line, + event + } = _ref; + if (!(line instanceof ParentBlot) || !line.uiNode) { + return true; + } + const isRTL = getComputedStyle(line.domNode)['direction'] === 'rtl'; + if (isRTL && event.key !== 'ArrowRight' || !isRTL && event.key !== 'ArrowLeft') { + return true; + } + this.quill.setSelection(range.index - 1, range.length + (event.shiftKey ? 1 : 0), Quill.sources.USER); + return false; + } + }); + } + handleNavigationShortcuts() { + this.quill.root.addEventListener('keydown', event => { + if (!event.defaultPrevented && canMoveCaretBeforeUINode(event)) { + this.ensureListeningToSelectionChange(); + } + }); + } + + /** + * We only listen to the `selectionchange` event when + * there is an intention of moving the caret to the beginning using shortcuts. + * This is primarily implemented to prevent infinite loops, as we are changing + * the selection within the handler of a `selectionchange` event. + */ + ensureListeningToSelectionChange() { + this.selectionChangeDeadline = Date.now() + TTL_FOR_VALID_SELECTION_CHANGE; + if (this.isListening) return; + this.isListening = true; + const listener = () => { + this.isListening = false; + if (Date.now() <= this.selectionChangeDeadline) { + this.handleSelectionChange(); + } + }; + document.addEventListener('selectionchange', listener, { + once: true + }); + } + handleSelectionChange() { + const selection = document.getSelection(); + if (!selection) return; + const range = selection.getRangeAt(0); + if (range.collapsed !== true || range.startOffset !== 0) return; + const line = this.quill.scroll.find(range.startContainer); + if (!(line instanceof ParentBlot) || !line.uiNode) return; + const newRange = document.createRange(); + newRange.setStartAfter(line.uiNode); + newRange.setEndAfter(line.uiNode); + selection.removeAllRanges(); + selection.addRange(newRange); + } +} +export default UINode; +//# sourceMappingURL=uiNode.js.map \ No newline at end of file diff --git a/public/assets/quill/modules/uiNode.js.map b/public/assets/quill/modules/uiNode.js.map new file mode 100644 index 0000000..9f0de34 --- /dev/null +++ b/public/assets/quill/modules/uiNode.js.map @@ -0,0 +1 @@ +{"version":3,"file":"uiNode.js","names":["ParentBlot","Module","Quill","isMac","test","navigator","platform","TTL_FOR_VALID_SELECTION_CHANGE","canMoveCaretBeforeUINode","event","key","ctrlKey","UINode","isListening","selectionChangeDeadline","constructor","quill","options","handleArrowKeys","handleNavigationShortcuts","keyboard","addBinding","offset","shiftKey","handler","range","_ref","line","uiNode","isRTL","getComputedStyle","domNode","setSelection","index","length","sources","USER","root","addEventListener","defaultPrevented","ensureListeningToSelectionChange","Date","now","listener","handleSelectionChange","document","once","selection","getSelection","getRangeAt","collapsed","startOffset","scroll","find","startContainer","newRange","createRange","setStartAfter","setEndAfter","removeAllRanges","addRange"],"sources":["../../src/modules/uiNode.ts"],"sourcesContent":["import { ParentBlot } from 'parchment';\nimport Module from '../core/module.js';\nimport Quill from '../core/quill.js';\n\nconst isMac = /Mac/i.test(navigator.platform);\n\n// Export for testing\nexport const TTL_FOR_VALID_SELECTION_CHANGE = 100;\n\n// A loose check to determine if the shortcut can move the caret before a UI node:\n// [CARET]
    [CONTENT]
    \nconst canMoveCaretBeforeUINode = (event: KeyboardEvent) => {\n if (\n event.key === 'ArrowLeft' ||\n event.key === 'ArrowRight' || // RTL scripts or moving from the end of the previous line\n event.key === 'ArrowUp' ||\n event.key === 'ArrowDown' ||\n event.key === 'Home'\n ) {\n return true;\n }\n\n if (isMac && event.key === 'a' && event.ctrlKey === true) {\n return true;\n }\n\n return false;\n};\n\nclass UINode extends Module {\n isListening = false;\n selectionChangeDeadline = 0;\n\n constructor(quill: Quill, options: Record) {\n super(quill, options);\n\n this.handleArrowKeys();\n this.handleNavigationShortcuts();\n }\n\n private handleArrowKeys() {\n this.quill.keyboard.addBinding({\n key: ['ArrowLeft', 'ArrowRight'],\n offset: 0,\n shiftKey: null,\n handler(range, { line, event }) {\n if (!(line instanceof ParentBlot) || !line.uiNode) {\n return true;\n }\n\n const isRTL = getComputedStyle(line.domNode)['direction'] === 'rtl';\n if (\n (isRTL && event.key !== 'ArrowRight') ||\n (!isRTL && event.key !== 'ArrowLeft')\n ) {\n return true;\n }\n\n this.quill.setSelection(\n range.index - 1,\n range.length + (event.shiftKey ? 1 : 0),\n Quill.sources.USER,\n );\n return false;\n },\n });\n }\n\n private handleNavigationShortcuts() {\n this.quill.root.addEventListener('keydown', (event) => {\n if (!event.defaultPrevented && canMoveCaretBeforeUINode(event)) {\n this.ensureListeningToSelectionChange();\n }\n });\n }\n\n /**\n * We only listen to the `selectionchange` event when\n * there is an intention of moving the caret to the beginning using shortcuts.\n * This is primarily implemented to prevent infinite loops, as we are changing\n * the selection within the handler of a `selectionchange` event.\n */\n private ensureListeningToSelectionChange() {\n this.selectionChangeDeadline = Date.now() + TTL_FOR_VALID_SELECTION_CHANGE;\n\n if (this.isListening) return;\n this.isListening = true;\n\n const listener = () => {\n this.isListening = false;\n\n if (Date.now() <= this.selectionChangeDeadline) {\n this.handleSelectionChange();\n }\n };\n\n document.addEventListener('selectionchange', listener, {\n once: true,\n });\n }\n\n private handleSelectionChange() {\n const selection = document.getSelection();\n if (!selection) return;\n const range = selection.getRangeAt(0);\n if (range.collapsed !== true || range.startOffset !== 0) return;\n\n const line = this.quill.scroll.find(range.startContainer);\n if (!(line instanceof ParentBlot) || !line.uiNode) return;\n\n const newRange = document.createRange();\n newRange.setStartAfter(line.uiNode);\n newRange.setEndAfter(line.uiNode);\n selection.removeAllRanges();\n selection.addRange(newRange);\n }\n}\n\nexport default UINode;\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file diff --git a/public/assets/quill/modules/uploader.d.ts b/public/assets/quill/modules/uploader.d.ts new file mode 100644 index 0000000..b02e9af --- /dev/null +++ b/public/assets/quill/modules/uploader.d.ts @@ -0,0 +1,15 @@ +import type Quill from '../core/quill.js'; +import Module from '../core/module.js'; +import type { Range } from '../core/selection.js'; +interface UploaderOptions { + mimetypes: string[]; + handler: (this: { + quill: Quill; + }, range: Range, files: File[]) => void; +} +declare class Uploader extends Module { + static DEFAULTS: UploaderOptions; + constructor(quill: Quill, options: Partial); + upload(range: Range, files: FileList | File[]): void; +} +export default Uploader; diff --git a/public/assets/quill/modules/uploader.js b/public/assets/quill/modules/uploader.js new file mode 100644 index 0000000..d7e2dfd --- /dev/null +++ b/public/assets/quill/modules/uploader.js @@ -0,0 +1,69 @@ +import Delta from 'quill-delta'; +import Emitter from '../core/emitter.js'; +import Module from '../core/module.js'; +class Uploader extends Module { + constructor(quill, options) { + super(quill, options); + quill.root.addEventListener('drop', e => { + e.preventDefault(); + let native = null; + if (document.caretRangeFromPoint) { + native = document.caretRangeFromPoint(e.clientX, e.clientY); + // @ts-expect-error + } else if (document.caretPositionFromPoint) { + // @ts-expect-error + const position = document.caretPositionFromPoint(e.clientX, e.clientY); + native = document.createRange(); + native.setStart(position.offsetNode, position.offset); + native.setEnd(position.offsetNode, position.offset); + } + const normalized = native && quill.selection.normalizeNative(native); + if (normalized) { + const range = quill.selection.normalizedToRange(normalized); + if (e.dataTransfer?.files) { + this.upload(range, e.dataTransfer.files); + } + } + }); + } + upload(range, files) { + const uploads = []; + Array.from(files).forEach(file => { + if (file && this.options.mimetypes?.includes(file.type)) { + uploads.push(file); + } + }); + if (uploads.length > 0) { + // @ts-expect-error Fix me later + this.options.handler.call(this, range, uploads); + } + } +} +Uploader.DEFAULTS = { + mimetypes: ['image/png', 'image/jpeg'], + handler(range, files) { + if (!this.quill.scroll.query('image')) { + return; + } + const promises = files.map(file => { + return new Promise(resolve => { + const reader = new FileReader(); + reader.onload = () => { + resolve(reader.result); + }; + reader.readAsDataURL(file); + }); + }); + Promise.all(promises).then(images => { + const update = images.reduce((delta, image) => { + return delta.insert({ + image + }); + }, new Delta().retain(range.index).delete(range.length)); + this.quill.updateContents(update, Emitter.sources.USER); + this.quill.setSelection(range.index + images.length, Emitter.sources.SILENT); + }); + } +}; +export default Uploader; +//# sourceMappingURL=uploader.js.map \ No newline at end of file diff --git a/public/assets/quill/modules/uploader.js.map b/public/assets/quill/modules/uploader.js.map new file mode 100644 index 0000000..284b37b --- /dev/null +++ b/public/assets/quill/modules/uploader.js.map @@ -0,0 +1 @@ +{"version":3,"file":"uploader.js","names":["Delta","Emitter","Module","Uploader","constructor","quill","options","root","addEventListener","e","preventDefault","native","document","caretRangeFromPoint","clientX","clientY","caretPositionFromPoint","position","createRange","setStart","offsetNode","offset","setEnd","normalized","selection","normalizeNative","range","normalizedToRange","dataTransfer","files","upload","uploads","Array","from","forEach","file","mimetypes","includes","type","push","length","handler","call","DEFAULTS","scroll","query","promises","map","Promise","resolve","reader","FileReader","onload","result","readAsDataURL","all","then","images","update","reduce","delta","image","insert","retain","index","delete","updateContents","sources","USER","setSelection","SILENT"],"sources":["../../src/modules/uploader.ts"],"sourcesContent":["import Delta from 'quill-delta';\nimport type Quill from '../core/quill.js';\nimport Emitter from '../core/emitter.js';\nimport Module from '../core/module.js';\nimport type { Range } from '../core/selection.js';\n\ninterface UploaderOptions {\n mimetypes: string[];\n handler: (this: { quill: Quill }, range: Range, files: File[]) => void;\n}\n\nclass Uploader extends Module {\n static DEFAULTS: UploaderOptions;\n\n constructor(quill: Quill, options: Partial) {\n super(quill, options);\n quill.root.addEventListener('drop', (e) => {\n e.preventDefault();\n let native: ReturnType | null = null;\n if (document.caretRangeFromPoint) {\n native = document.caretRangeFromPoint(e.clientX, e.clientY);\n // @ts-expect-error\n } else if (document.caretPositionFromPoint) {\n // @ts-expect-error\n const position = document.caretPositionFromPoint(e.clientX, e.clientY);\n native = document.createRange();\n native.setStart(position.offsetNode, position.offset);\n native.setEnd(position.offsetNode, position.offset);\n }\n\n const normalized = native && quill.selection.normalizeNative(native);\n if (normalized) {\n const range = quill.selection.normalizedToRange(normalized);\n if (e.dataTransfer?.files) {\n this.upload(range, e.dataTransfer.files);\n }\n }\n });\n }\n\n upload(range: Range, files: FileList | File[]) {\n const uploads: File[] = [];\n Array.from(files).forEach((file) => {\n if (file && this.options.mimetypes?.includes(file.type)) {\n uploads.push(file);\n }\n });\n if (uploads.length > 0) {\n // @ts-expect-error Fix me later\n this.options.handler.call(this, range, uploads);\n }\n }\n}\n\nUploader.DEFAULTS = {\n mimetypes: ['image/png', 'image/jpeg'],\n handler(range: Range, files: File[]) {\n if (!this.quill.scroll.query('image')) {\n return;\n }\n const promises = files.map>((file) => {\n return new Promise((resolve) => {\n const reader = new FileReader();\n reader.onload = () => {\n resolve(reader.result as string);\n };\n reader.readAsDataURL(file);\n });\n });\n Promise.all(promises).then((images) => {\n const update = images.reduce((delta: Delta, image) => {\n return delta.insert({ image });\n }, new Delta().retain(range.index).delete(range.length)) as Delta;\n this.quill.updateContents(update, Emitter.sources.USER);\n this.quill.setSelection(\n range.index + images.length,\n Emitter.sources.SILENT,\n );\n });\n },\n};\n\nexport default Uploader;\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,aAAa;AAE/B,OAAOC,OAAO,MAAM,oBAAoB;AACxC,OAAOC,MAAM,MAAM,mBAAmB;AAQtC,MAAMC,QAAQ,SAASD,MAAM,CAAkB;EAG7CE,WAAWA,CAACC,KAAY,EAAEC,OAAiC,EAAE;IAC3D,KAAK,CAACD,KAAK,EAAEC,OAAO,CAAC;IACrBD,KAAK,CAACE,IAAI,CAACC,gBAAgB,CAAC,MAAM,EAAGC,CAAC,IAAK;MACzCA,CAAC,CAACC,cAAc,CAAC,CAAC;MAClB,IAAIC,MAAsD,GAAG,IAAI;MACjE,IAAIC,QAAQ,CAACC,mBAAmB,EAAE;QAChCF,MAAM,GAAGC,QAAQ,CAACC,mBAAmB,CAACJ,CAAC,CAACK,OAAO,EAAEL,CAAC,CAACM,OAAO,CAAC;QAC3D;MACF,CAAC,MAAM,IAAIH,QAAQ,CAACI,sBAAsB,EAAE;QAC1C;QACA,MAAMC,QAAQ,GAAGL,QAAQ,CAACI,sBAAsB,CAACP,CAAC,CAACK,OAAO,EAAEL,CAAC,CAACM,OAAO,CAAC;QACtEJ,MAAM,GAAGC,QAAQ,CAACM,WAAW,CAAC,CAAC;QAC/BP,MAAM,CAACQ,QAAQ,CAACF,QAAQ,CAACG,UAAU,EAAEH,QAAQ,CAACI,MAAM,CAAC;QACrDV,MAAM,CAACW,MAAM,CAACL,QAAQ,CAACG,UAAU,EAAEH,QAAQ,CAACI,MAAM,CAAC;MACrD;MAEA,MAAME,UAAU,GAAGZ,MAAM,IAAIN,KAAK,CAACmB,SAAS,CAACC,eAAe,CAACd,MAAM,CAAC;MACpE,IAAIY,UAAU,EAAE;QACd,MAAMG,KAAK,GAAGrB,KAAK,CAACmB,SAAS,CAACG,iBAAiB,CAACJ,UAAU,CAAC;QAC3D,IAAId,CAAC,CAACmB,YAAY,EAAEC,KAAK,EAAE;UACzB,IAAI,CAACC,MAAM,CAACJ,KAAK,EAAEjB,CAAC,CAACmB,YAAY,CAACC,KAAK,CAAC;QAC1C;MACF;IACF,CAAC,CAAC;EACJ;EAEAC,MAAMA,CAACJ,KAAY,EAAEG,KAAwB,EAAE;IAC7C,MAAME,OAAe,GAAG,EAAE;IAC1BC,KAAK,CAACC,IAAI,CAACJ,KAAK,CAAC,CAACK,OAAO,CAAEC,IAAI,IAAK;MAClC,IAAIA,IAAI,IAAI,IAAI,CAAC7B,OAAO,CAAC8B,SAAS,EAAEC,QAAQ,CAACF,IAAI,CAACG,IAAI,CAAC,EAAE;QACvDP,OAAO,CAACQ,IAAI,CAACJ,IAAI,CAAC;MACpB;IACF,CAAC,CAAC;IACF,IAAIJ,OAAO,CAACS,MAAM,GAAG,CAAC,EAAE;MACtB;MACA,IAAI,CAAClC,OAAO,CAACmC,OAAO,CAACC,IAAI,CAAC,IAAI,EAAEhB,KAAK,EAAEK,OAAO,CAAC;IACjD;EACF;AACF;AAEA5B,QAAQ,CAACwC,QAAQ,GAAG;EAClBP,SAAS,EAAE,CAAC,WAAW,EAAE,YAAY,CAAC;EACtCK,OAAOA,CAACf,KAAY,EAAEG,KAAa,EAAE;IACnC,IAAI,CAAC,IAAI,CAACxB,KAAK,CAACuC,MAAM,CAACC,KAAK,CAAC,OAAO,CAAC,EAAE;MACrC;IACF;IACA,MAAMC,QAAQ,GAAGjB,KAAK,CAACkB,GAAG,CAAmBZ,IAAI,IAAK;MACpD,OAAO,IAAIa,OAAO,CAAEC,OAAO,IAAK;QAC9B,MAAMC,MAAM,GAAG,IAAIC,UAAU,CAAC,CAAC;QAC/BD,MAAM,CAACE,MAAM,GAAG,MAAM;UACpBH,OAAO,CAACC,MAAM,CAACG,MAAgB,CAAC;QAClC,CAAC;QACDH,MAAM,CAACI,aAAa,CAACnB,IAAI,CAAC;MAC5B,CAAC,CAAC;IACJ,CAAC,CAAC;IACFa,OAAO,CAACO,GAAG,CAACT,QAAQ,CAAC,CAACU,IAAI,CAAEC,MAAM,IAAK;MACrC,MAAMC,MAAM,GAAGD,MAAM,CAACE,MAAM,CAAC,CAACC,KAAY,EAAEC,KAAK,KAAK;QACpD,OAAOD,KAAK,CAACE,MAAM,CAAC;UAAED;QAAM,CAAC,CAAC;MAChC,CAAC,EAAE,IAAI7D,KAAK,CAAC,CAAC,CAAC+D,MAAM,CAACrC,KAAK,CAACsC,KAAK,CAAC,CAACC,MAAM,CAACvC,KAAK,CAACc,MAAM,CAAC,CAAU;MACjE,IAAI,CAACnC,KAAK,CAAC6D,cAAc,CAACR,MAAM,EAAEzD,OAAO,CAACkE,OAAO,CAACC,IAAI,CAAC;MACvD,IAAI,CAAC/D,KAAK,CAACgE,YAAY,CACrB3C,KAAK,CAACsC,KAAK,GAAGP,MAAM,CAACjB,MAAM,EAC3BvC,OAAO,CAACkE,OAAO,CAACG,MAClB,CAAC;IACH,CAAC,CAAC;EACJ;AACF,CAAC;AAED,eAAenE,QAAQ","ignoreList":[]} \ No newline at end of file diff --git a/public/assets/quill/package.json b/public/assets/quill/package.json new file mode 100644 index 0000000..4dd6a2e --- /dev/null +++ b/public/assets/quill/package.json @@ -0,0 +1,101 @@ +{ + "name": "quill", + "version": "2.0.3", + "description": "Your powerful, rich text editor", + "author": "Jason Chen ", + "homepage": "https://quilljs.com", + "main": "quill.js", + "type": "module", + "dependencies": { + "eventemitter3": "^5.0.1", + "lodash-es": "^4.17.21", + "parchment": "^3.0.0", + "quill-delta": "^5.1.0" + }, + "devDependencies": { + "@babel/cli": "^7.23.9", + "@babel/core": "^7.24.0", + "@babel/preset-env": "^7.24.0", + "@babel/preset-typescript": "^7.23.3", + "@playwright/test": "1.44.1", + "@types/highlight.js": "^9.12.4", + "@types/lodash-es": "^4.17.12", + "@types/node": "^20.10.0", + "@types/webpack": "^5.28.5", + "@typescript-eslint/eslint-plugin": "^7.2.0", + "@typescript-eslint/parser": "^7.2.0", + "@vitest/browser": "^1.1.3", + "babel-loader": "^9.1.3", + "babel-plugin-transform-define": "^2.1.4", + "css-loader": "^6.10.0", + "eslint": "^8.57.0", + "eslint-config-prettier": "^9.1.0", + "eslint-import-resolver-typescript": "^3.6.1", + "eslint-import-resolver-webpack": "^0.13.8", + "eslint-plugin-import": "^2.29.1", + "eslint-plugin-jsx-a11y": "^6.8.0", + "eslint-plugin-prettier": "^5.1.3", + "eslint-plugin-require-extensions": "^0.1.3", + "glob": "10.4.2", + "highlight.js": "^9.18.1", + "html-loader": "^4.2.0", + "html-webpack-plugin": "^5.5.3", + "jsdom": "^22.1.0", + "mini-css-extract-plugin": "^2.7.6", + "prettier": "^3.0.3", + "source-map-loader": "^5.0.0", + "style-loader": "^3.3.3", + "stylus": "^0.62.0", + "stylus-loader": "^7.1.3", + "svgo": "^3.2.0", + "terser-webpack-plugin": "^5.3.9", + "transpile-webpack-plugin": "^1.1.3", + "ts-loader": "^9.5.1", + "ts-node": "^10.9.2", + "typescript": "^5.4.2", + "vitest": "^1.1.3", + "webpack": "^5.89.0", + "webpack-cli": "^5.1.4", + "webpack-dev-server": "^4.15.1", + "webpack-merge": "^5.10.0" + }, + "license": "BSD-3-Clause", + "repository": { + "type": "git", + "url": "git+https://github.com/slab/quill.git", + "directory": "packages/quill" + }, + "bugs": { + "url": "https://github.com/slab/quill/issues" + }, + "prettier": { + "singleQuote": true + }, + "browserslist": [ + "defaults" + ], + "scripts": { + "build": "./scripts/build production", + "lint": "run-s lint:*", + "lint:eslint": "eslint .", + "lint:tsc": "tsc --noEmit --skipLibCheck", + "start": "[[ -z \"$npm_package_config_ports_webpack\" ]] && webpack-dev-server || webpack-dev-server --port $npm_package_config_ports_webpack", + "test": "run-s test:*", + "test:unit": "vitest --config test/unit/vitest.config.ts", + "test:fuzz": "vitest --config test/fuzz/vitest.config.ts", + "test:e2e": "playwright test" + }, + "keywords": [ + "quill", + "editor", + "rich text", + "wysiwyg", + "operational transformation", + "ot", + "framework" + ], + "engines": { + "npm": ">=8.2.3" + }, + "engineStrict": true +} diff --git a/public/assets/quill/quill.d.ts b/public/assets/quill/quill.d.ts new file mode 100644 index 0000000..35c2e65 --- /dev/null +++ b/public/assets/quill/quill.d.ts @@ -0,0 +1,5 @@ +import Quill from './core.js'; +import type { Bounds, DebugLevel, EmitterSource, ExpandedQuillOptions, QuillOptions } from './core.js'; +export { AttributeMap, Delta, Module, Op, OpIterator, Parchment, Range, } from './core.js'; +export type { Bounds, DebugLevel, EmitterSource, ExpandedQuillOptions, QuillOptions, }; +export default Quill; diff --git a/public/assets/quill/quill.js b/public/assets/quill/quill.js new file mode 100644 index 0000000..92c4544 --- /dev/null +++ b/public/assets/quill/quill.js @@ -0,0 +1,82 @@ +import Quill from './core.js'; +import { AlignClass, AlignStyle } from './formats/align.js'; +import { DirectionAttribute, DirectionClass, DirectionStyle } from './formats/direction.js'; +import Indent from './formats/indent.js'; +import Blockquote from './formats/blockquote.js'; +import Header from './formats/header.js'; +import List from './formats/list.js'; +import { BackgroundClass, BackgroundStyle } from './formats/background.js'; +import { ColorClass, ColorStyle } from './formats/color.js'; +import { FontClass, FontStyle } from './formats/font.js'; +import { SizeClass, SizeStyle } from './formats/size.js'; +import Bold from './formats/bold.js'; +import Italic from './formats/italic.js'; +import Link from './formats/link.js'; +import Script from './formats/script.js'; +import Strike from './formats/strike.js'; +import Underline from './formats/underline.js'; +import Formula from './formats/formula.js'; +import Image from './formats/image.js'; +import Video from './formats/video.js'; +import CodeBlock, { Code as InlineCode } from './formats/code.js'; +import Syntax from './modules/syntax.js'; +import Table from './modules/table.js'; +import Toolbar from './modules/toolbar.js'; +import Icons from './ui/icons.js'; +import Picker from './ui/picker.js'; +import ColorPicker from './ui/color-picker.js'; +import IconPicker from './ui/icon-picker.js'; +import Tooltip from './ui/tooltip.js'; +import BubbleTheme from './themes/bubble.js'; +import SnowTheme from './themes/snow.js'; +Quill.register({ + 'attributors/attribute/direction': DirectionAttribute, + 'attributors/class/align': AlignClass, + 'attributors/class/background': BackgroundClass, + 'attributors/class/color': ColorClass, + 'attributors/class/direction': DirectionClass, + 'attributors/class/font': FontClass, + 'attributors/class/size': SizeClass, + 'attributors/style/align': AlignStyle, + 'attributors/style/background': BackgroundStyle, + 'attributors/style/color': ColorStyle, + 'attributors/style/direction': DirectionStyle, + 'attributors/style/font': FontStyle, + 'attributors/style/size': SizeStyle +}, true); +Quill.register({ + 'formats/align': AlignClass, + 'formats/direction': DirectionClass, + 'formats/indent': Indent, + 'formats/background': BackgroundStyle, + 'formats/color': ColorStyle, + 'formats/font': FontClass, + 'formats/size': SizeClass, + 'formats/blockquote': Blockquote, + 'formats/code-block': CodeBlock, + 'formats/header': Header, + 'formats/list': List, + 'formats/bold': Bold, + 'formats/code': InlineCode, + 'formats/italic': Italic, + 'formats/link': Link, + 'formats/script': Script, + 'formats/strike': Strike, + 'formats/underline': Underline, + 'formats/formula': Formula, + 'formats/image': Image, + 'formats/video': Video, + 'modules/syntax': Syntax, + 'modules/table': Table, + 'modules/toolbar': Toolbar, + 'themes/bubble': BubbleTheme, + 'themes/snow': SnowTheme, + 'ui/icons': Icons, + 'ui/picker': Picker, + 'ui/icon-picker': IconPicker, + 'ui/color-picker': ColorPicker, + 'ui/tooltip': Tooltip +}, true); +export { AttributeMap, Delta, Module, Op, OpIterator, Parchment, Range } from './core.js'; +export default Quill; +//# sourceMappingURL=quill.js.map \ No newline at end of file diff --git a/public/assets/quill/quill.js.map b/public/assets/quill/quill.js.map new file mode 100644 index 0000000..7ac9343 --- /dev/null +++ b/public/assets/quill/quill.js.map @@ -0,0 +1 @@ +{"version":3,"file":"quill.js","names":["Quill","AlignClass","AlignStyle","DirectionAttribute","DirectionClass","DirectionStyle","Indent","Blockquote","Header","List","BackgroundClass","BackgroundStyle","ColorClass","ColorStyle","FontClass","FontStyle","SizeClass","SizeStyle","Bold","Italic","Link","Script","Strike","Underline","Formula","Image","Video","CodeBlock","Code","InlineCode","Syntax","Table","Toolbar","Icons","Picker","ColorPicker","IconPicker","Tooltip","BubbleTheme","SnowTheme","register","AttributeMap","Delta","Module","Op","OpIterator","Parchment","Range"],"sources":["../src/quill.ts"],"sourcesContent":["import Quill from './core.js';\nimport type {\n Bounds,\n DebugLevel,\n EmitterSource,\n ExpandedQuillOptions,\n QuillOptions,\n} from './core.js';\n\nimport { AlignClass, AlignStyle } from './formats/align.js';\nimport {\n DirectionAttribute,\n DirectionClass,\n DirectionStyle,\n} from './formats/direction.js';\nimport Indent from './formats/indent.js';\n\nimport Blockquote from './formats/blockquote.js';\nimport Header from './formats/header.js';\nimport List from './formats/list.js';\n\nimport { BackgroundClass, BackgroundStyle } from './formats/background.js';\nimport { ColorClass, ColorStyle } from './formats/color.js';\nimport { FontClass, FontStyle } from './formats/font.js';\nimport { SizeClass, SizeStyle } from './formats/size.js';\n\nimport Bold from './formats/bold.js';\nimport Italic from './formats/italic.js';\nimport Link from './formats/link.js';\nimport Script from './formats/script.js';\nimport Strike from './formats/strike.js';\nimport Underline from './formats/underline.js';\n\nimport Formula from './formats/formula.js';\nimport Image from './formats/image.js';\nimport Video from './formats/video.js';\n\nimport CodeBlock, { Code as InlineCode } from './formats/code.js';\n\nimport Syntax from './modules/syntax.js';\nimport Table from './modules/table.js';\nimport Toolbar from './modules/toolbar.js';\n\nimport Icons from './ui/icons.js';\nimport Picker from './ui/picker.js';\nimport ColorPicker from './ui/color-picker.js';\nimport IconPicker from './ui/icon-picker.js';\nimport Tooltip from './ui/tooltip.js';\n\nimport BubbleTheme from './themes/bubble.js';\nimport SnowTheme from './themes/snow.js';\n\nQuill.register(\n {\n 'attributors/attribute/direction': DirectionAttribute,\n\n 'attributors/class/align': AlignClass,\n 'attributors/class/background': BackgroundClass,\n 'attributors/class/color': ColorClass,\n 'attributors/class/direction': DirectionClass,\n 'attributors/class/font': FontClass,\n 'attributors/class/size': SizeClass,\n\n 'attributors/style/align': AlignStyle,\n 'attributors/style/background': BackgroundStyle,\n 'attributors/style/color': ColorStyle,\n 'attributors/style/direction': DirectionStyle,\n 'attributors/style/font': FontStyle,\n 'attributors/style/size': SizeStyle,\n },\n true,\n);\n\nQuill.register(\n {\n 'formats/align': AlignClass,\n 'formats/direction': DirectionClass,\n 'formats/indent': Indent,\n\n 'formats/background': BackgroundStyle,\n 'formats/color': ColorStyle,\n 'formats/font': FontClass,\n 'formats/size': SizeClass,\n\n 'formats/blockquote': Blockquote,\n 'formats/code-block': CodeBlock,\n 'formats/header': Header,\n 'formats/list': List,\n\n 'formats/bold': Bold,\n 'formats/code': InlineCode,\n 'formats/italic': Italic,\n 'formats/link': Link,\n 'formats/script': Script,\n 'formats/strike': Strike,\n 'formats/underline': Underline,\n\n 'formats/formula': Formula,\n 'formats/image': Image,\n 'formats/video': Video,\n\n 'modules/syntax': Syntax,\n 'modules/table': Table,\n 'modules/toolbar': Toolbar,\n\n 'themes/bubble': BubbleTheme,\n 'themes/snow': SnowTheme,\n\n 'ui/icons': Icons,\n 'ui/picker': Picker,\n 'ui/icon-picker': IconPicker,\n 'ui/color-picker': ColorPicker,\n 'ui/tooltip': Tooltip,\n },\n true,\n);\n\nexport {\n AttributeMap,\n Delta,\n Module,\n Op,\n OpIterator,\n Parchment,\n Range,\n} from './core.js';\nexport type {\n Bounds,\n DebugLevel,\n EmitterSource,\n ExpandedQuillOptions,\n QuillOptions,\n};\n\nexport default Quill;\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file diff --git a/public/assets/quill/themes/base.d.ts b/public/assets/quill/themes/base.d.ts new file mode 100644 index 0000000..a91126a --- /dev/null +++ b/public/assets/quill/themes/base.d.ts @@ -0,0 +1,35 @@ +import type Quill from '../core/quill.js'; +import Theme from '../core/theme.js'; +import type { ThemeOptions } from '../core/theme.js'; +import Picker from '../ui/picker.js'; +import Tooltip from '../ui/tooltip.js'; +import type { Range } from '../core/selection.js'; +import type Clipboard from '../modules/clipboard.js'; +import type History from '../modules/history.js'; +import type Keyboard from '../modules/keyboard.js'; +import type Uploader from '../modules/uploader.js'; +import type Selection from '../core/selection.js'; +declare class BaseTheme extends Theme { + pickers: Picker[]; + tooltip?: Tooltip; + constructor(quill: Quill, options: ThemeOptions); + addModule(name: 'clipboard'): Clipboard; + addModule(name: 'keyboard'): Keyboard; + addModule(name: 'uploader'): Uploader; + addModule(name: 'history'): History; + addModule(name: 'selection'): Selection; + addModule(name: string): unknown; + buildButtons(buttons: NodeListOf, icons: Record | string>): void; + buildPickers(selects: NodeListOf, icons: Record>): void; +} +declare class BaseTooltip extends Tooltip { + textbox: HTMLInputElement | null; + linkRange?: Range; + constructor(quill: Quill, boundsContainer?: HTMLElement); + listen(): void; + cancel(): void; + edit(mode?: string, preview?: string | null): void; + restoreFocus(): void; + save(): void; +} +export { BaseTooltip, BaseTheme as default }; diff --git a/public/assets/quill/themes/base.js b/public/assets/quill/themes/base.js new file mode 100644 index 0000000..9045bbe --- /dev/null +++ b/public/assets/quill/themes/base.js @@ -0,0 +1,257 @@ +import { merge } from 'lodash-es'; +import Emitter from '../core/emitter.js'; +import Theme from '../core/theme.js'; +import ColorPicker from '../ui/color-picker.js'; +import IconPicker from '../ui/icon-picker.js'; +import Picker from '../ui/picker.js'; +import Tooltip from '../ui/tooltip.js'; +const ALIGNS = [false, 'center', 'right', 'justify']; +const COLORS = ['#000000', '#e60000', '#ff9900', '#ffff00', '#008a00', '#0066cc', '#9933ff', '#ffffff', '#facccc', '#ffebcc', '#ffffcc', '#cce8cc', '#cce0f5', '#ebd6ff', '#bbbbbb', '#f06666', '#ffc266', '#ffff66', '#66b966', '#66a3e0', '#c285ff', '#888888', '#a10000', '#b26b00', '#b2b200', '#006100', '#0047b2', '#6b24b2', '#444444', '#5c0000', '#663d00', '#666600', '#003700', '#002966', '#3d1466']; +const FONTS = [false, 'serif', 'monospace']; +const HEADERS = ['1', '2', '3', false]; +const SIZES = ['small', false, 'large', 'huge']; +class BaseTheme extends Theme { + constructor(quill, options) { + super(quill, options); + const listener = e => { + if (!document.body.contains(quill.root)) { + document.body.removeEventListener('click', listener); + return; + } + if (this.tooltip != null && + // @ts-expect-error + !this.tooltip.root.contains(e.target) && + // @ts-expect-error + document.activeElement !== this.tooltip.textbox && !this.quill.hasFocus()) { + this.tooltip.hide(); + } + if (this.pickers != null) { + this.pickers.forEach(picker => { + // @ts-expect-error + if (!picker.container.contains(e.target)) { + picker.close(); + } + }); + } + }; + quill.emitter.listenDOM('click', document.body, listener); + } + addModule(name) { + const module = super.addModule(name); + if (name === 'toolbar') { + // @ts-expect-error + this.extendToolbar(module); + } + return module; + } + buildButtons(buttons, icons) { + Array.from(buttons).forEach(button => { + const className = button.getAttribute('class') || ''; + className.split(/\s+/).forEach(name => { + if (!name.startsWith('ql-')) return; + name = name.slice('ql-'.length); + if (icons[name] == null) return; + if (name === 'direction') { + // @ts-expect-error + button.innerHTML = icons[name][''] + icons[name].rtl; + } else if (typeof icons[name] === 'string') { + // @ts-expect-error + button.innerHTML = icons[name]; + } else { + // @ts-expect-error + const value = button.value || ''; + // @ts-expect-error + if (value != null && icons[name][value]) { + // @ts-expect-error + button.innerHTML = icons[name][value]; + } + } + }); + }); + } + buildPickers(selects, icons) { + this.pickers = Array.from(selects).map(select => { + if (select.classList.contains('ql-align')) { + if (select.querySelector('option') == null) { + fillSelect(select, ALIGNS); + } + if (typeof icons.align === 'object') { + return new IconPicker(select, icons.align); + } + } + if (select.classList.contains('ql-background') || select.classList.contains('ql-color')) { + const format = select.classList.contains('ql-background') ? 'background' : 'color'; + if (select.querySelector('option') == null) { + fillSelect(select, COLORS, format === 'background' ? '#ffffff' : '#000000'); + } + return new ColorPicker(select, icons[format]); + } + if (select.querySelector('option') == null) { + if (select.classList.contains('ql-font')) { + fillSelect(select, FONTS); + } else if (select.classList.contains('ql-header')) { + fillSelect(select, HEADERS); + } else if (select.classList.contains('ql-size')) { + fillSelect(select, SIZES); + } + } + return new Picker(select); + }); + const update = () => { + this.pickers.forEach(picker => { + picker.update(); + }); + }; + this.quill.on(Emitter.events.EDITOR_CHANGE, update); + } +} +BaseTheme.DEFAULTS = merge({}, Theme.DEFAULTS, { + modules: { + toolbar: { + handlers: { + formula() { + this.quill.theme.tooltip.edit('formula'); + }, + image() { + let fileInput = this.container.querySelector('input.ql-image[type=file]'); + if (fileInput == null) { + fileInput = document.createElement('input'); + fileInput.setAttribute('type', 'file'); + fileInput.setAttribute('accept', this.quill.uploader.options.mimetypes.join(', ')); + fileInput.classList.add('ql-image'); + fileInput.addEventListener('change', () => { + const range = this.quill.getSelection(true); + this.quill.uploader.upload(range, fileInput.files); + fileInput.value = ''; + }); + this.container.appendChild(fileInput); + } + fileInput.click(); + }, + video() { + this.quill.theme.tooltip.edit('video'); + } + } + } + } +}); +class BaseTooltip extends Tooltip { + constructor(quill, boundsContainer) { + super(quill, boundsContainer); + this.textbox = this.root.querySelector('input[type="text"]'); + this.listen(); + } + listen() { + // @ts-expect-error Fix me later + this.textbox.addEventListener('keydown', event => { + if (event.key === 'Enter') { + this.save(); + event.preventDefault(); + } else if (event.key === 'Escape') { + this.cancel(); + event.preventDefault(); + } + }); + } + cancel() { + this.hide(); + this.restoreFocus(); + } + edit() { + let mode = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'link'; + let preview = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; + this.root.classList.remove('ql-hidden'); + this.root.classList.add('ql-editing'); + if (this.textbox == null) return; + if (preview != null) { + this.textbox.value = preview; + } else if (mode !== this.root.getAttribute('data-mode')) { + this.textbox.value = ''; + } + const bounds = this.quill.getBounds(this.quill.selection.savedRange); + if (bounds != null) { + this.position(bounds); + } + this.textbox.select(); + this.textbox.setAttribute('placeholder', this.textbox.getAttribute(`data-${mode}`) || ''); + this.root.setAttribute('data-mode', mode); + } + restoreFocus() { + this.quill.focus({ + preventScroll: true + }); + } + save() { + // @ts-expect-error Fix me later + let { + value + } = this.textbox; + switch (this.root.getAttribute('data-mode')) { + case 'link': + { + const { + scrollTop + } = this.quill.root; + if (this.linkRange) { + this.quill.formatText(this.linkRange, 'link', value, Emitter.sources.USER); + delete this.linkRange; + } else { + this.restoreFocus(); + this.quill.format('link', value, Emitter.sources.USER); + } + this.quill.root.scrollTop = scrollTop; + break; + } + case 'video': + { + value = extractVideoUrl(value); + } + // eslint-disable-next-line no-fallthrough + case 'formula': + { + if (!value) break; + const range = this.quill.getSelection(true); + if (range != null) { + const index = range.index + range.length; + this.quill.insertEmbed(index, + // @ts-expect-error Fix me later + this.root.getAttribute('data-mode'), value, Emitter.sources.USER); + if (this.root.getAttribute('data-mode') === 'formula') { + this.quill.insertText(index + 1, ' ', Emitter.sources.USER); + } + this.quill.setSelection(index + 2, Emitter.sources.USER); + } + break; + } + default: + } + // @ts-expect-error Fix me later + this.textbox.value = ''; + this.hide(); + } +} +function extractVideoUrl(url) { + let match = url.match(/^(?:(https?):\/\/)?(?:(?:www|m)\.)?youtube\.com\/watch.*v=([a-zA-Z0-9_-]+)/) || url.match(/^(?:(https?):\/\/)?(?:(?:www|m)\.)?youtu\.be\/([a-zA-Z0-9_-]+)/); + if (match) { + return `${match[1] || 'https'}://www.youtube.com/embed/${match[2]}?showinfo=0`; + } + // eslint-disable-next-line no-cond-assign + if (match = url.match(/^(?:(https?):\/\/)?(?:www\.)?vimeo\.com\/(\d+)/)) { + return `${match[1] || 'https'}://player.vimeo.com/video/${match[2]}/`; + } + return url; +} +function fillSelect(select, values) { + let defaultValue = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + values.forEach(value => { + const option = document.createElement('option'); + if (value === defaultValue) { + option.setAttribute('selected', 'selected'); + } else { + option.setAttribute('value', String(value)); + } + select.appendChild(option); + }); +} +export { BaseTooltip, BaseTheme as default }; +//# sourceMappingURL=base.js.map \ No newline at end of file diff --git a/public/assets/quill/themes/base.js.map b/public/assets/quill/themes/base.js.map new file mode 100644 index 0000000..75bf373 --- /dev/null +++ b/public/assets/quill/themes/base.js.map @@ -0,0 +1 @@ +{"version":3,"file":"base.js","names":["merge","Emitter","Theme","ColorPicker","IconPicker","Picker","Tooltip","ALIGNS","COLORS","FONTS","HEADERS","SIZES","BaseTheme","constructor","quill","options","listener","e","document","body","contains","root","removeEventListener","tooltip","target","activeElement","textbox","hasFocus","hide","pickers","forEach","picker","container","close","emitter","listenDOM","addModule","name","module","extendToolbar","buildButtons","buttons","icons","Array","from","button","className","getAttribute","split","startsWith","slice","length","innerHTML","rtl","value","buildPickers","selects","map","select","classList","querySelector","fillSelect","align","format","update","on","events","EDITOR_CHANGE","DEFAULTS","modules","toolbar","handlers","formula","theme","edit","image","fileInput","createElement","setAttribute","uploader","mimetypes","join","add","addEventListener","range","getSelection","upload","files","appendChild","click","video","BaseTooltip","boundsContainer","listen","event","key","save","preventDefault","cancel","restoreFocus","mode","arguments","undefined","preview","remove","bounds","getBounds","selection","savedRange","position","focus","preventScroll","scrollTop","linkRange","formatText","sources","USER","extractVideoUrl","index","insertEmbed","insertText","setSelection","url","match","values","defaultValue","option","String","default"],"sources":["../../src/themes/base.ts"],"sourcesContent":["import { merge } from 'lodash-es';\nimport type Quill from '../core/quill.js';\nimport Emitter from '../core/emitter.js';\nimport Theme from '../core/theme.js';\nimport type { ThemeOptions } from '../core/theme.js';\nimport ColorPicker from '../ui/color-picker.js';\nimport IconPicker from '../ui/icon-picker.js';\nimport Picker from '../ui/picker.js';\nimport Tooltip from '../ui/tooltip.js';\nimport type { Range } from '../core/selection.js';\nimport type Clipboard from '../modules/clipboard.js';\nimport type History from '../modules/history.js';\nimport type Keyboard from '../modules/keyboard.js';\nimport type Uploader from '../modules/uploader.js';\nimport type Selection from '../core/selection.js';\n\nconst ALIGNS = [false, 'center', 'right', 'justify'];\n\nconst COLORS = [\n '#000000',\n '#e60000',\n '#ff9900',\n '#ffff00',\n '#008a00',\n '#0066cc',\n '#9933ff',\n '#ffffff',\n '#facccc',\n '#ffebcc',\n '#ffffcc',\n '#cce8cc',\n '#cce0f5',\n '#ebd6ff',\n '#bbbbbb',\n '#f06666',\n '#ffc266',\n '#ffff66',\n '#66b966',\n '#66a3e0',\n '#c285ff',\n '#888888',\n '#a10000',\n '#b26b00',\n '#b2b200',\n '#006100',\n '#0047b2',\n '#6b24b2',\n '#444444',\n '#5c0000',\n '#663d00',\n '#666600',\n '#003700',\n '#002966',\n '#3d1466',\n];\n\nconst FONTS = [false, 'serif', 'monospace'];\n\nconst HEADERS = ['1', '2', '3', false];\n\nconst SIZES = ['small', false, 'large', 'huge'];\n\nclass BaseTheme extends Theme {\n pickers: Picker[];\n tooltip?: Tooltip;\n\n constructor(quill: Quill, options: ThemeOptions) {\n super(quill, options);\n const listener = (e: MouseEvent) => {\n if (!document.body.contains(quill.root)) {\n document.body.removeEventListener('click', listener);\n return;\n }\n if (\n this.tooltip != null &&\n // @ts-expect-error\n !this.tooltip.root.contains(e.target) &&\n // @ts-expect-error\n document.activeElement !== this.tooltip.textbox &&\n !this.quill.hasFocus()\n ) {\n this.tooltip.hide();\n }\n if (this.pickers != null) {\n this.pickers.forEach((picker) => {\n // @ts-expect-error\n if (!picker.container.contains(e.target)) {\n picker.close();\n }\n });\n }\n };\n quill.emitter.listenDOM('click', document.body, listener);\n }\n\n addModule(name: 'clipboard'): Clipboard;\n addModule(name: 'keyboard'): Keyboard;\n addModule(name: 'uploader'): Uploader;\n addModule(name: 'history'): History;\n addModule(name: 'selection'): Selection;\n addModule(name: string): unknown;\n addModule(name: string) {\n const module = super.addModule(name);\n if (name === 'toolbar') {\n // @ts-expect-error\n this.extendToolbar(module);\n }\n return module;\n }\n\n buildButtons(\n buttons: NodeListOf,\n icons: Record | string>,\n ) {\n Array.from(buttons).forEach((button) => {\n const className = button.getAttribute('class') || '';\n className.split(/\\s+/).forEach((name) => {\n if (!name.startsWith('ql-')) return;\n name = name.slice('ql-'.length);\n if (icons[name] == null) return;\n if (name === 'direction') {\n // @ts-expect-error\n button.innerHTML = icons[name][''] + icons[name].rtl;\n } else if (typeof icons[name] === 'string') {\n // @ts-expect-error\n button.innerHTML = icons[name];\n } else {\n // @ts-expect-error\n const value = button.value || '';\n // @ts-expect-error\n if (value != null && icons[name][value]) {\n // @ts-expect-error\n button.innerHTML = icons[name][value];\n }\n }\n });\n });\n }\n\n buildPickers(\n selects: NodeListOf,\n icons: Record>,\n ) {\n this.pickers = Array.from(selects).map((select) => {\n if (select.classList.contains('ql-align')) {\n if (select.querySelector('option') == null) {\n fillSelect(select, ALIGNS);\n }\n if (typeof icons.align === 'object') {\n return new IconPicker(select, icons.align);\n }\n }\n if (\n select.classList.contains('ql-background') ||\n select.classList.contains('ql-color')\n ) {\n const format = select.classList.contains('ql-background')\n ? 'background'\n : 'color';\n if (select.querySelector('option') == null) {\n fillSelect(\n select,\n COLORS,\n format === 'background' ? '#ffffff' : '#000000',\n );\n }\n return new ColorPicker(select, icons[format] as string);\n }\n if (select.querySelector('option') == null) {\n if (select.classList.contains('ql-font')) {\n fillSelect(select, FONTS);\n } else if (select.classList.contains('ql-header')) {\n fillSelect(select, HEADERS);\n } else if (select.classList.contains('ql-size')) {\n fillSelect(select, SIZES);\n }\n }\n return new Picker(select);\n });\n const update = () => {\n this.pickers.forEach((picker) => {\n picker.update();\n });\n };\n this.quill.on(Emitter.events.EDITOR_CHANGE, update);\n }\n}\nBaseTheme.DEFAULTS = merge({}, Theme.DEFAULTS, {\n modules: {\n toolbar: {\n handlers: {\n formula() {\n this.quill.theme.tooltip.edit('formula');\n },\n image() {\n let fileInput = this.container.querySelector(\n 'input.ql-image[type=file]',\n );\n if (fileInput == null) {\n fileInput = document.createElement('input');\n fileInput.setAttribute('type', 'file');\n fileInput.setAttribute(\n 'accept',\n this.quill.uploader.options.mimetypes.join(', '),\n );\n fileInput.classList.add('ql-image');\n fileInput.addEventListener('change', () => {\n const range = this.quill.getSelection(true);\n this.quill.uploader.upload(range, fileInput.files);\n fileInput.value = '';\n });\n this.container.appendChild(fileInput);\n }\n fileInput.click();\n },\n video() {\n this.quill.theme.tooltip.edit('video');\n },\n },\n },\n },\n});\n\nclass BaseTooltip extends Tooltip {\n textbox: HTMLInputElement | null;\n linkRange?: Range;\n\n constructor(quill: Quill, boundsContainer?: HTMLElement) {\n super(quill, boundsContainer);\n this.textbox = this.root.querySelector('input[type=\"text\"]');\n this.listen();\n }\n\n listen() {\n // @ts-expect-error Fix me later\n this.textbox.addEventListener('keydown', (event) => {\n if (event.key === 'Enter') {\n this.save();\n event.preventDefault();\n } else if (event.key === 'Escape') {\n this.cancel();\n event.preventDefault();\n }\n });\n }\n\n cancel() {\n this.hide();\n this.restoreFocus();\n }\n\n edit(mode = 'link', preview: string | null = null) {\n this.root.classList.remove('ql-hidden');\n this.root.classList.add('ql-editing');\n if (this.textbox == null) return;\n\n if (preview != null) {\n this.textbox.value = preview;\n } else if (mode !== this.root.getAttribute('data-mode')) {\n this.textbox.value = '';\n }\n const bounds = this.quill.getBounds(this.quill.selection.savedRange);\n if (bounds != null) {\n this.position(bounds);\n }\n this.textbox.select();\n this.textbox.setAttribute(\n 'placeholder',\n this.textbox.getAttribute(`data-${mode}`) || '',\n );\n this.root.setAttribute('data-mode', mode);\n }\n\n restoreFocus() {\n this.quill.focus({ preventScroll: true });\n }\n\n save() {\n // @ts-expect-error Fix me later\n let { value } = this.textbox;\n switch (this.root.getAttribute('data-mode')) {\n case 'link': {\n const { scrollTop } = this.quill.root;\n if (this.linkRange) {\n this.quill.formatText(\n this.linkRange,\n 'link',\n value,\n Emitter.sources.USER,\n );\n delete this.linkRange;\n } else {\n this.restoreFocus();\n this.quill.format('link', value, Emitter.sources.USER);\n }\n this.quill.root.scrollTop = scrollTop;\n break;\n }\n case 'video': {\n value = extractVideoUrl(value);\n } // eslint-disable-next-line no-fallthrough\n case 'formula': {\n if (!value) break;\n const range = this.quill.getSelection(true);\n if (range != null) {\n const index = range.index + range.length;\n this.quill.insertEmbed(\n index,\n // @ts-expect-error Fix me later\n this.root.getAttribute('data-mode'),\n value,\n Emitter.sources.USER,\n );\n if (this.root.getAttribute('data-mode') === 'formula') {\n this.quill.insertText(index + 1, ' ', Emitter.sources.USER);\n }\n this.quill.setSelection(index + 2, Emitter.sources.USER);\n }\n break;\n }\n default:\n }\n // @ts-expect-error Fix me later\n this.textbox.value = '';\n this.hide();\n }\n}\n\nfunction extractVideoUrl(url: string) {\n let match =\n url.match(\n /^(?:(https?):\\/\\/)?(?:(?:www|m)\\.)?youtube\\.com\\/watch.*v=([a-zA-Z0-9_-]+)/,\n ) ||\n url.match(/^(?:(https?):\\/\\/)?(?:(?:www|m)\\.)?youtu\\.be\\/([a-zA-Z0-9_-]+)/);\n if (match) {\n return `${match[1] || 'https'}://www.youtube.com/embed/${\n match[2]\n }?showinfo=0`;\n }\n // eslint-disable-next-line no-cond-assign\n if ((match = url.match(/^(?:(https?):\\/\\/)?(?:www\\.)?vimeo\\.com\\/(\\d+)/))) {\n return `${match[1] || 'https'}://player.vimeo.com/video/${match[2]}/`;\n }\n return url;\n}\n\nfunction fillSelect(\n select: HTMLSelectElement,\n values: Array,\n defaultValue: unknown = false,\n) {\n values.forEach((value) => {\n const option = document.createElement('option');\n if (value === defaultValue) {\n option.setAttribute('selected', 'selected');\n } else {\n option.setAttribute('value', String(value));\n }\n select.appendChild(option);\n });\n}\n\nexport { BaseTooltip, BaseTheme as default };\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file diff --git a/public/assets/quill/themes/bubble.d.ts b/public/assets/quill/themes/bubble.d.ts new file mode 100644 index 0000000..d69372d --- /dev/null +++ b/public/assets/quill/themes/bubble.d.ts @@ -0,0 +1,18 @@ +import BaseTheme, { BaseTooltip } from './base.js'; +import type { Bounds } from '../core/selection.js'; +import Quill from '../core/quill.js'; +import type { ThemeOptions } from '../core/theme.js'; +import type Toolbar from '../modules/toolbar.js'; +declare class BubbleTooltip extends BaseTooltip { + static TEMPLATE: string; + constructor(quill: Quill, bounds?: HTMLElement); + listen(): void; + cancel(): void; + position(reference: Bounds): number; +} +declare class BubbleTheme extends BaseTheme { + tooltip: BubbleTooltip; + constructor(quill: Quill, options: ThemeOptions); + extendToolbar(toolbar: Toolbar): void; +} +export { BubbleTooltip, BubbleTheme as default }; diff --git a/public/assets/quill/themes/bubble.js b/public/assets/quill/themes/bubble.js new file mode 100644 index 0000000..0c50d52 --- /dev/null +++ b/public/assets/quill/themes/bubble.js @@ -0,0 +1,114 @@ +import { merge } from 'lodash-es'; +import Emitter from '../core/emitter.js'; +import BaseTheme, { BaseTooltip } from './base.js'; +import { Range } from '../core/selection.js'; +import icons from '../ui/icons.js'; +import Quill from '../core/quill.js'; +const TOOLBAR_CONFIG = [['bold', 'italic', 'link'], [{ + header: 1 +}, { + header: 2 +}, 'blockquote']]; +class BubbleTooltip extends BaseTooltip { + static TEMPLATE = ['', '
    ', '', '', '
    '].join(''); + constructor(quill, bounds) { + super(quill, bounds); + this.quill.on(Emitter.events.EDITOR_CHANGE, (type, range, oldRange, source) => { + if (type !== Emitter.events.SELECTION_CHANGE) return; + if (range != null && range.length > 0 && source === Emitter.sources.USER) { + this.show(); + // Lock our width so we will expand beyond our offsetParent boundaries + this.root.style.left = '0px'; + this.root.style.width = ''; + this.root.style.width = `${this.root.offsetWidth}px`; + const lines = this.quill.getLines(range.index, range.length); + if (lines.length === 1) { + const bounds = this.quill.getBounds(range); + if (bounds != null) { + this.position(bounds); + } + } else { + const lastLine = lines[lines.length - 1]; + const index = this.quill.getIndex(lastLine); + const length = Math.min(lastLine.length() - 1, range.index + range.length - index); + const indexBounds = this.quill.getBounds(new Range(index, length)); + if (indexBounds != null) { + this.position(indexBounds); + } + } + } else if (document.activeElement !== this.textbox && this.quill.hasFocus()) { + this.hide(); + } + }); + } + listen() { + super.listen(); + // @ts-expect-error Fix me later + this.root.querySelector('.ql-close').addEventListener('click', () => { + this.root.classList.remove('ql-editing'); + }); + this.quill.on(Emitter.events.SCROLL_OPTIMIZE, () => { + // Let selection be restored by toolbar handlers before repositioning + setTimeout(() => { + if (this.root.classList.contains('ql-hidden')) return; + const range = this.quill.getSelection(); + if (range != null) { + const bounds = this.quill.getBounds(range); + if (bounds != null) { + this.position(bounds); + } + } + }, 1); + }); + } + cancel() { + this.show(); + } + position(reference) { + const shift = super.position(reference); + const arrow = this.root.querySelector('.ql-tooltip-arrow'); + // @ts-expect-error + arrow.style.marginLeft = ''; + if (shift !== 0) { + // @ts-expect-error + arrow.style.marginLeft = `${-1 * shift - arrow.offsetWidth / 2}px`; + } + return shift; + } +} +class BubbleTheme extends BaseTheme { + constructor(quill, options) { + if (options.modules.toolbar != null && options.modules.toolbar.container == null) { + options.modules.toolbar.container = TOOLBAR_CONFIG; + } + super(quill, options); + this.quill.container.classList.add('ql-bubble'); + } + extendToolbar(toolbar) { + // @ts-expect-error + this.tooltip = new BubbleTooltip(this.quill, this.options.bounds); + if (toolbar.container != null) { + this.tooltip.root.appendChild(toolbar.container); + this.buildButtons(toolbar.container.querySelectorAll('button'), icons); + this.buildPickers(toolbar.container.querySelectorAll('select'), icons); + } + } +} +BubbleTheme.DEFAULTS = merge({}, BaseTheme.DEFAULTS, { + modules: { + toolbar: { + handlers: { + link(value) { + if (!value) { + this.quill.format('link', false, Quill.sources.USER); + } else { + // @ts-expect-error + this.quill.theme.tooltip.edit(); + } + } + } + } + } +}); +export { BubbleTooltip, BubbleTheme as default }; +//# sourceMappingURL=bubble.js.map \ No newline at end of file diff --git a/public/assets/quill/themes/bubble.js.map b/public/assets/quill/themes/bubble.js.map new file mode 100644 index 0000000..5c290b2 --- /dev/null +++ b/public/assets/quill/themes/bubble.js.map @@ -0,0 +1 @@ +{"version":3,"file":"bubble.js","names":["merge","Emitter","BaseTheme","BaseTooltip","Range","icons","Quill","TOOLBAR_CONFIG","header","BubbleTooltip","TEMPLATE","join","constructor","quill","bounds","on","events","EDITOR_CHANGE","type","range","oldRange","source","SELECTION_CHANGE","length","sources","USER","show","root","style","left","width","offsetWidth","lines","getLines","index","getBounds","position","lastLine","getIndex","Math","min","indexBounds","document","activeElement","textbox","hasFocus","hide","listen","querySelector","addEventListener","classList","remove","SCROLL_OPTIMIZE","setTimeout","contains","getSelection","cancel","reference","shift","arrow","marginLeft","BubbleTheme","options","modules","toolbar","container","add","extendToolbar","tooltip","appendChild","buildButtons","querySelectorAll","buildPickers","DEFAULTS","handlers","link","value","format","theme","edit","default"],"sources":["../../src/themes/bubble.ts"],"sourcesContent":["import { merge } from 'lodash-es';\nimport Emitter from '../core/emitter.js';\nimport BaseTheme, { BaseTooltip } from './base.js';\nimport { Range } from '../core/selection.js';\nimport type { Bounds } from '../core/selection.js';\nimport icons from '../ui/icons.js';\nimport Quill from '../core/quill.js';\nimport type { ThemeOptions } from '../core/theme.js';\nimport type Toolbar from '../modules/toolbar.js';\nimport type { ToolbarConfig } from '../modules/toolbar.js';\n\nconst TOOLBAR_CONFIG: ToolbarConfig = [\n ['bold', 'italic', 'link'],\n [{ header: 1 }, { header: 2 }, 'blockquote'],\n];\n\nclass BubbleTooltip extends BaseTooltip {\n static TEMPLATE = [\n '',\n '
    ',\n '',\n '',\n '
    ',\n ].join('');\n\n constructor(quill: Quill, bounds?: HTMLElement) {\n super(quill, bounds);\n this.quill.on(\n Emitter.events.EDITOR_CHANGE,\n (type, range, oldRange, source) => {\n if (type !== Emitter.events.SELECTION_CHANGE) return;\n if (\n range != null &&\n range.length > 0 &&\n source === Emitter.sources.USER\n ) {\n this.show();\n // Lock our width so we will expand beyond our offsetParent boundaries\n this.root.style.left = '0px';\n this.root.style.width = '';\n this.root.style.width = `${this.root.offsetWidth}px`;\n const lines = this.quill.getLines(range.index, range.length);\n if (lines.length === 1) {\n const bounds = this.quill.getBounds(range);\n if (bounds != null) {\n this.position(bounds);\n }\n } else {\n const lastLine = lines[lines.length - 1];\n const index = this.quill.getIndex(lastLine);\n const length = Math.min(\n lastLine.length() - 1,\n range.index + range.length - index,\n );\n const indexBounds = this.quill.getBounds(new Range(index, length));\n if (indexBounds != null) {\n this.position(indexBounds);\n }\n }\n } else if (\n document.activeElement !== this.textbox &&\n this.quill.hasFocus()\n ) {\n this.hide();\n }\n },\n );\n }\n\n listen() {\n super.listen();\n // @ts-expect-error Fix me later\n this.root.querySelector('.ql-close').addEventListener('click', () => {\n this.root.classList.remove('ql-editing');\n });\n this.quill.on(Emitter.events.SCROLL_OPTIMIZE, () => {\n // Let selection be restored by toolbar handlers before repositioning\n setTimeout(() => {\n if (this.root.classList.contains('ql-hidden')) return;\n const range = this.quill.getSelection();\n if (range != null) {\n const bounds = this.quill.getBounds(range);\n if (bounds != null) {\n this.position(bounds);\n }\n }\n }, 1);\n });\n }\n\n cancel() {\n this.show();\n }\n\n position(reference: Bounds) {\n const shift = super.position(reference);\n const arrow = this.root.querySelector('.ql-tooltip-arrow');\n // @ts-expect-error\n arrow.style.marginLeft = '';\n if (shift !== 0) {\n // @ts-expect-error\n arrow.style.marginLeft = `${-1 * shift - arrow.offsetWidth / 2}px`;\n }\n return shift;\n }\n}\n\nclass BubbleTheme extends BaseTheme {\n tooltip: BubbleTooltip;\n\n constructor(quill: Quill, options: ThemeOptions) {\n if (\n options.modules.toolbar != null &&\n options.modules.toolbar.container == null\n ) {\n options.modules.toolbar.container = TOOLBAR_CONFIG;\n }\n super(quill, options);\n this.quill.container.classList.add('ql-bubble');\n }\n\n extendToolbar(toolbar: Toolbar) {\n // @ts-expect-error\n this.tooltip = new BubbleTooltip(this.quill, this.options.bounds);\n if (toolbar.container != null) {\n this.tooltip.root.appendChild(toolbar.container);\n this.buildButtons(toolbar.container.querySelectorAll('button'), icons);\n this.buildPickers(toolbar.container.querySelectorAll('select'), icons);\n }\n }\n}\nBubbleTheme.DEFAULTS = merge({}, BaseTheme.DEFAULTS, {\n modules: {\n toolbar: {\n handlers: {\n link(value: string) {\n if (!value) {\n this.quill.format('link', false, Quill.sources.USER);\n } else {\n // @ts-expect-error\n this.quill.theme.tooltip.edit();\n }\n },\n },\n },\n },\n} satisfies ThemeOptions);\n\nexport { BubbleTooltip, BubbleTheme as default };\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file diff --git a/public/assets/quill/themes/snow.d.ts b/public/assets/quill/themes/snow.d.ts new file mode 100644 index 0000000..41567b8 --- /dev/null +++ b/public/assets/quill/themes/snow.d.ts @@ -0,0 +1,9 @@ +import BaseTheme from './base.js'; +import Quill from '../core/quill.js'; +import type Toolbar from '../modules/toolbar.js'; +import type { ThemeOptions } from '../core/theme.js'; +declare class SnowTheme extends BaseTheme { + constructor(quill: Quill, options: ThemeOptions); + extendToolbar(toolbar: Toolbar): void; +} +export default SnowTheme; diff --git a/public/assets/quill/themes/snow.js b/public/assets/quill/themes/snow.js new file mode 100644 index 0000000..6c51df2 --- /dev/null +++ b/public/assets/quill/themes/snow.js @@ -0,0 +1,122 @@ +import { merge } from 'lodash-es'; +import Emitter from '../core/emitter.js'; +import BaseTheme, { BaseTooltip } from './base.js'; +import LinkBlot from '../formats/link.js'; +import { Range } from '../core/selection.js'; +import icons from '../ui/icons.js'; +import Quill from '../core/quill.js'; +const TOOLBAR_CONFIG = [[{ + header: ['1', '2', '3', false] +}], ['bold', 'italic', 'underline', 'link'], [{ + list: 'ordered' +}, { + list: 'bullet' +}], ['clean']]; +class SnowTooltip extends BaseTooltip { + static TEMPLATE = ['', '', '', ''].join(''); + preview = this.root.querySelector('a.ql-preview'); + listen() { + super.listen(); + // @ts-expect-error Fix me later + this.root.querySelector('a.ql-action').addEventListener('click', event => { + if (this.root.classList.contains('ql-editing')) { + this.save(); + } else { + // @ts-expect-error Fix me later + this.edit('link', this.preview.textContent); + } + event.preventDefault(); + }); + // @ts-expect-error Fix me later + this.root.querySelector('a.ql-remove').addEventListener('click', event => { + if (this.linkRange != null) { + const range = this.linkRange; + this.restoreFocus(); + this.quill.formatText(range, 'link', false, Emitter.sources.USER); + delete this.linkRange; + } + event.preventDefault(); + this.hide(); + }); + this.quill.on(Emitter.events.SELECTION_CHANGE, (range, oldRange, source) => { + if (range == null) return; + if (range.length === 0 && source === Emitter.sources.USER) { + const [link, offset] = this.quill.scroll.descendant(LinkBlot, range.index); + if (link != null) { + this.linkRange = new Range(range.index - offset, link.length()); + const preview = LinkBlot.formats(link.domNode); + // @ts-expect-error Fix me later + this.preview.textContent = preview; + // @ts-expect-error Fix me later + this.preview.setAttribute('href', preview); + this.show(); + const bounds = this.quill.getBounds(this.linkRange); + if (bounds != null) { + this.position(bounds); + } + return; + } + } else { + delete this.linkRange; + } + this.hide(); + }); + } + show() { + super.show(); + this.root.removeAttribute('data-mode'); + } +} +class SnowTheme extends BaseTheme { + constructor(quill, options) { + if (options.modules.toolbar != null && options.modules.toolbar.container == null) { + options.modules.toolbar.container = TOOLBAR_CONFIG; + } + super(quill, options); + this.quill.container.classList.add('ql-snow'); + } + extendToolbar(toolbar) { + if (toolbar.container != null) { + toolbar.container.classList.add('ql-snow'); + this.buildButtons(toolbar.container.querySelectorAll('button'), icons); + this.buildPickers(toolbar.container.querySelectorAll('select'), icons); + // @ts-expect-error + this.tooltip = new SnowTooltip(this.quill, this.options.bounds); + if (toolbar.container.querySelector('.ql-link')) { + this.quill.keyboard.addBinding({ + key: 'k', + shortKey: true + }, (_range, context) => { + toolbar.handlers.link.call(toolbar, !context.format.link); + }); + } + } + } +} +SnowTheme.DEFAULTS = merge({}, BaseTheme.DEFAULTS, { + modules: { + toolbar: { + handlers: { + link(value) { + if (value) { + const range = this.quill.getSelection(); + if (range == null || range.length === 0) return; + let preview = this.quill.getText(range); + if (/^\S+@\S+\.\S+$/.test(preview) && preview.indexOf('mailto:') !== 0) { + preview = `mailto:${preview}`; + } + // @ts-expect-error + const { + tooltip + } = this.quill.theme; + tooltip.edit('link', preview); + } else { + this.quill.format('link', false, Quill.sources.USER); + } + } + } + } + } +}); +export default SnowTheme; +//# sourceMappingURL=snow.js.map \ No newline at end of file diff --git a/public/assets/quill/themes/snow.js.map b/public/assets/quill/themes/snow.js.map new file mode 100644 index 0000000..d982fd6 --- /dev/null +++ b/public/assets/quill/themes/snow.js.map @@ -0,0 +1 @@ +{"version":3,"file":"snow.js","names":["merge","Emitter","BaseTheme","BaseTooltip","LinkBlot","Range","icons","Quill","TOOLBAR_CONFIG","header","list","SnowTooltip","TEMPLATE","join","preview","root","querySelector","listen","addEventListener","event","classList","contains","save","edit","textContent","preventDefault","linkRange","range","restoreFocus","quill","formatText","sources","USER","hide","on","events","SELECTION_CHANGE","oldRange","source","length","link","offset","scroll","descendant","index","formats","domNode","setAttribute","show","bounds","getBounds","position","removeAttribute","SnowTheme","constructor","options","modules","toolbar","container","add","extendToolbar","buildButtons","querySelectorAll","buildPickers","tooltip","keyboard","addBinding","key","shortKey","_range","context","handlers","call","format","DEFAULTS","value","getSelection","getText","test","indexOf","theme"],"sources":["../../src/themes/snow.ts"],"sourcesContent":["import { merge } from 'lodash-es';\nimport Emitter from '../core/emitter.js';\nimport BaseTheme, { BaseTooltip } from './base.js';\nimport LinkBlot from '../formats/link.js';\nimport { Range } from '../core/selection.js';\nimport icons from '../ui/icons.js';\nimport Quill from '../core/quill.js';\nimport type { Context } from '../modules/keyboard.js';\nimport type Toolbar from '../modules/toolbar.js';\nimport type { ToolbarConfig } from '../modules/toolbar.js';\nimport type { ThemeOptions } from '../core/theme.js';\n\nconst TOOLBAR_CONFIG: ToolbarConfig = [\n [{ header: ['1', '2', '3', false] }],\n ['bold', 'italic', 'underline', 'link'],\n [{ list: 'ordered' }, { list: 'bullet' }],\n ['clean'],\n];\n\nclass SnowTooltip extends BaseTooltip {\n static TEMPLATE = [\n '',\n '',\n '',\n '',\n ].join('');\n\n preview = this.root.querySelector('a.ql-preview');\n\n listen() {\n super.listen();\n // @ts-expect-error Fix me later\n this.root\n .querySelector('a.ql-action')\n .addEventListener('click', (event) => {\n if (this.root.classList.contains('ql-editing')) {\n this.save();\n } else {\n // @ts-expect-error Fix me later\n this.edit('link', this.preview.textContent);\n }\n event.preventDefault();\n });\n // @ts-expect-error Fix me later\n this.root\n .querySelector('a.ql-remove')\n .addEventListener('click', (event) => {\n if (this.linkRange != null) {\n const range = this.linkRange;\n this.restoreFocus();\n this.quill.formatText(range, 'link', false, Emitter.sources.USER);\n delete this.linkRange;\n }\n event.preventDefault();\n this.hide();\n });\n this.quill.on(\n Emitter.events.SELECTION_CHANGE,\n (range, oldRange, source) => {\n if (range == null) return;\n if (range.length === 0 && source === Emitter.sources.USER) {\n const [link, offset] = this.quill.scroll.descendant(\n LinkBlot,\n range.index,\n );\n if (link != null) {\n this.linkRange = new Range(range.index - offset, link.length());\n const preview = LinkBlot.formats(link.domNode);\n // @ts-expect-error Fix me later\n this.preview.textContent = preview;\n // @ts-expect-error Fix me later\n this.preview.setAttribute('href', preview);\n this.show();\n const bounds = this.quill.getBounds(this.linkRange);\n if (bounds != null) {\n this.position(bounds);\n }\n return;\n }\n } else {\n delete this.linkRange;\n }\n this.hide();\n },\n );\n }\n\n show() {\n super.show();\n this.root.removeAttribute('data-mode');\n }\n}\n\nclass SnowTheme extends BaseTheme {\n constructor(quill: Quill, options: ThemeOptions) {\n if (\n options.modules.toolbar != null &&\n options.modules.toolbar.container == null\n ) {\n options.modules.toolbar.container = TOOLBAR_CONFIG;\n }\n super(quill, options);\n this.quill.container.classList.add('ql-snow');\n }\n\n extendToolbar(toolbar: Toolbar) {\n if (toolbar.container != null) {\n toolbar.container.classList.add('ql-snow');\n this.buildButtons(toolbar.container.querySelectorAll('button'), icons);\n this.buildPickers(toolbar.container.querySelectorAll('select'), icons);\n // @ts-expect-error\n this.tooltip = new SnowTooltip(this.quill, this.options.bounds);\n if (toolbar.container.querySelector('.ql-link')) {\n this.quill.keyboard.addBinding(\n { key: 'k', shortKey: true },\n (_range: Range, context: Context) => {\n toolbar.handlers.link.call(toolbar, !context.format.link);\n },\n );\n }\n }\n }\n}\nSnowTheme.DEFAULTS = merge({}, BaseTheme.DEFAULTS, {\n modules: {\n toolbar: {\n handlers: {\n link(value: string) {\n if (value) {\n const range = this.quill.getSelection();\n if (range == null || range.length === 0) return;\n let preview = this.quill.getText(range);\n if (\n /^\\S+@\\S+\\.\\S+$/.test(preview) &&\n preview.indexOf('mailto:') !== 0\n ) {\n preview = `mailto:${preview}`;\n }\n // @ts-expect-error\n const { tooltip } = this.quill.theme;\n tooltip.edit('link', preview);\n } else {\n this.quill.format('link', false, Quill.sources.USER);\n }\n },\n },\n },\n },\n} satisfies ThemeOptions);\n\nexport default SnowTheme;\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file diff --git a/public/assets/quill/types.d.js b/public/assets/quill/types.d.js new file mode 100644 index 0000000..b0548fd --- /dev/null +++ b/public/assets/quill/types.d.js @@ -0,0 +1,2 @@ + +//# sourceMappingURL=types.d.js.map \ No newline at end of file diff --git a/public/assets/quill/types.d.js.map b/public/assets/quill/types.d.js.map new file mode 100644 index 0000000..4c91720 --- /dev/null +++ b/public/assets/quill/types.d.js.map @@ -0,0 +1 @@ +{"version":3,"file":"types.d.js","names":[],"sources":["../src/types.d.ts"],"sourcesContent":["declare module '*.svg' {\n const content: string;\n export default content;\n}\n\ndeclare const QUILL_VERSION: string | undefined;\n"],"mappings":"","ignoreList":[]} \ No newline at end of file diff --git a/public/assets/quill/ui/color-picker.d.ts b/public/assets/quill/ui/color-picker.d.ts new file mode 100644 index 0000000..0987b4a --- /dev/null +++ b/public/assets/quill/ui/color-picker.d.ts @@ -0,0 +1,7 @@ +import Picker from './picker.js'; +declare class ColorPicker extends Picker { + constructor(select: HTMLSelectElement, label: string); + buildItem(option: HTMLOptionElement): HTMLSpanElement; + selectItem(item: HTMLElement | null, trigger?: boolean): void; +} +export default ColorPicker; diff --git a/public/assets/quill/ui/color-picker.js b/public/assets/quill/ui/color-picker.js new file mode 100644 index 0000000..cf9ea94 --- /dev/null +++ b/public/assets/quill/ui/color-picker.js @@ -0,0 +1,30 @@ +import Picker from './picker.js'; +class ColorPicker extends Picker { + constructor(select, label) { + super(select); + this.label.innerHTML = label; + this.container.classList.add('ql-color-picker'); + Array.from(this.container.querySelectorAll('.ql-picker-item')).slice(0, 7).forEach(item => { + item.classList.add('ql-primary'); + }); + } + buildItem(option) { + const item = super.buildItem(option); + item.style.backgroundColor = option.getAttribute('value') || ''; + return item; + } + selectItem(item, trigger) { + super.selectItem(item, trigger); + const colorLabel = this.label.querySelector('.ql-color-label'); + const value = item ? item.getAttribute('data-value') || '' : ''; + if (colorLabel) { + if (colorLabel.tagName === 'line') { + colorLabel.style.stroke = value; + } else { + colorLabel.style.fill = value; + } + } + } +} +export default ColorPicker; +//# sourceMappingURL=color-picker.js.map \ No newline at end of file diff --git a/public/assets/quill/ui/color-picker.js.map b/public/assets/quill/ui/color-picker.js.map new file mode 100644 index 0000000..96692d2 --- /dev/null +++ b/public/assets/quill/ui/color-picker.js.map @@ -0,0 +1 @@ +{"version":3,"file":"color-picker.js","names":["Picker","ColorPicker","constructor","select","label","innerHTML","container","classList","add","Array","from","querySelectorAll","slice","forEach","item","buildItem","option","style","backgroundColor","getAttribute","selectItem","trigger","colorLabel","querySelector","value","tagName","stroke","fill"],"sources":["../../src/ui/color-picker.ts"],"sourcesContent":["import Picker from './picker.js';\n\nclass ColorPicker extends Picker {\n constructor(select: HTMLSelectElement, label: string) {\n super(select);\n this.label.innerHTML = label;\n this.container.classList.add('ql-color-picker');\n Array.from(this.container.querySelectorAll('.ql-picker-item'))\n .slice(0, 7)\n .forEach((item) => {\n item.classList.add('ql-primary');\n });\n }\n\n buildItem(option: HTMLOptionElement) {\n const item = super.buildItem(option);\n item.style.backgroundColor = option.getAttribute('value') || '';\n return item;\n }\n\n selectItem(item: HTMLElement | null, trigger?: boolean) {\n super.selectItem(item, trigger);\n const colorLabel = this.label.querySelector('.ql-color-label');\n const value = item ? item.getAttribute('data-value') || '' : '';\n if (colorLabel) {\n if (colorLabel.tagName === 'line') {\n colorLabel.style.stroke = value;\n } else {\n colorLabel.style.fill = value;\n }\n }\n }\n}\n\nexport default ColorPicker;\n"],"mappings":"AAAA,OAAOA,MAAM,MAAM,aAAa;AAEhC,MAAMC,WAAW,SAASD,MAAM,CAAC;EAC/BE,WAAWA,CAACC,MAAyB,EAAEC,KAAa,EAAE;IACpD,KAAK,CAACD,MAAM,CAAC;IACb,IAAI,CAACC,KAAK,CAACC,SAAS,GAAGD,KAAK;IAC5B,IAAI,CAACE,SAAS,CAACC,SAAS,CAACC,GAAG,CAAC,iBAAiB,CAAC;IAC/CC,KAAK,CAACC,IAAI,CAAC,IAAI,CAACJ,SAAS,CAACK,gBAAgB,CAAC,iBAAiB,CAAC,CAAC,CAC3DC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CACXC,OAAO,CAAEC,IAAI,IAAK;MACjBA,IAAI,CAACP,SAAS,CAACC,GAAG,CAAC,YAAY,CAAC;IAClC,CAAC,CAAC;EACN;EAEAO,SAASA,CAACC,MAAyB,EAAE;IACnC,MAAMF,IAAI,GAAG,KAAK,CAACC,SAAS,CAACC,MAAM,CAAC;IACpCF,IAAI,CAACG,KAAK,CAACC,eAAe,GAAGF,MAAM,CAACG,YAAY,CAAC,OAAO,CAAC,IAAI,EAAE;IAC/D,OAAOL,IAAI;EACb;EAEAM,UAAUA,CAACN,IAAwB,EAAEO,OAAiB,EAAE;IACtD,KAAK,CAACD,UAAU,CAACN,IAAI,EAAEO,OAAO,CAAC;IAC/B,MAAMC,UAAU,GAAG,IAAI,CAAClB,KAAK,CAACmB,aAAa,CAAc,iBAAiB,CAAC;IAC3E,MAAMC,KAAK,GAAGV,IAAI,GAAGA,IAAI,CAACK,YAAY,CAAC,YAAY,CAAC,IAAI,EAAE,GAAG,EAAE;IAC/D,IAAIG,UAAU,EAAE;MACd,IAAIA,UAAU,CAACG,OAAO,KAAK,MAAM,EAAE;QACjCH,UAAU,CAACL,KAAK,CAACS,MAAM,GAAGF,KAAK;MACjC,CAAC,MAAM;QACLF,UAAU,CAACL,KAAK,CAACU,IAAI,GAAGH,KAAK;MAC/B;IACF;EACF;AACF;AAEA,eAAevB,WAAW","ignoreList":[]} \ No newline at end of file diff --git a/public/assets/quill/ui/icon-picker.d.ts b/public/assets/quill/ui/icon-picker.d.ts new file mode 100644 index 0000000..dcdf58c --- /dev/null +++ b/public/assets/quill/ui/icon-picker.d.ts @@ -0,0 +1,7 @@ +import Picker from './picker.js'; +declare class IconPicker extends Picker { + defaultItem: HTMLElement | null; + constructor(select: HTMLSelectElement, icons: Record); + selectItem(target: HTMLElement | null, trigger?: boolean): void; +} +export default IconPicker; diff --git a/public/assets/quill/ui/icon-picker.js b/public/assets/quill/ui/icon-picker.js new file mode 100644 index 0000000..723a56e --- /dev/null +++ b/public/assets/quill/ui/icon-picker.js @@ -0,0 +1,22 @@ +import Picker from './picker.js'; +class IconPicker extends Picker { + constructor(select, icons) { + super(select); + this.container.classList.add('ql-icon-picker'); + Array.from(this.container.querySelectorAll('.ql-picker-item')).forEach(item => { + item.innerHTML = icons[item.getAttribute('data-value') || '']; + }); + this.defaultItem = this.container.querySelector('.ql-selected'); + this.selectItem(this.defaultItem); + } + selectItem(target, trigger) { + super.selectItem(target, trigger); + const item = target || this.defaultItem; + if (item != null) { + if (this.label.innerHTML === item.innerHTML) return; + this.label.innerHTML = item.innerHTML; + } + } +} +export default IconPicker; +//# sourceMappingURL=icon-picker.js.map \ No newline at end of file diff --git a/public/assets/quill/ui/icon-picker.js.map b/public/assets/quill/ui/icon-picker.js.map new file mode 100644 index 0000000..77e857e --- /dev/null +++ b/public/assets/quill/ui/icon-picker.js.map @@ -0,0 +1 @@ +{"version":3,"file":"icon-picker.js","names":["Picker","IconPicker","constructor","select","icons","container","classList","add","Array","from","querySelectorAll","forEach","item","innerHTML","getAttribute","defaultItem","querySelector","selectItem","target","trigger","label"],"sources":["../../src/ui/icon-picker.ts"],"sourcesContent":["import Picker from './picker.js';\n\nclass IconPicker extends Picker {\n defaultItem: HTMLElement | null;\n\n constructor(select: HTMLSelectElement, icons: Record) {\n super(select);\n this.container.classList.add('ql-icon-picker');\n Array.from(this.container.querySelectorAll('.ql-picker-item')).forEach(\n (item) => {\n item.innerHTML = icons[item.getAttribute('data-value') || ''];\n },\n );\n this.defaultItem = this.container.querySelector('.ql-selected');\n this.selectItem(this.defaultItem);\n }\n\n selectItem(target: HTMLElement | null, trigger?: boolean) {\n super.selectItem(target, trigger);\n const item = target || this.defaultItem;\n if (item != null) {\n if (this.label.innerHTML === item.innerHTML) return;\n this.label.innerHTML = item.innerHTML;\n }\n }\n}\n\nexport default IconPicker;\n"],"mappings":"AAAA,OAAOA,MAAM,MAAM,aAAa;AAEhC,MAAMC,UAAU,SAASD,MAAM,CAAC;EAG9BE,WAAWA,CAACC,MAAyB,EAAEC,KAA6B,EAAE;IACpE,KAAK,CAACD,MAAM,CAAC;IACb,IAAI,CAACE,SAAS,CAACC,SAAS,CAACC,GAAG,CAAC,gBAAgB,CAAC;IAC9CC,KAAK,CAACC,IAAI,CAAC,IAAI,CAACJ,SAAS,CAACK,gBAAgB,CAAC,iBAAiB,CAAC,CAAC,CAACC,OAAO,CACnEC,IAAI,IAAK;MACRA,IAAI,CAACC,SAAS,GAAGT,KAAK,CAACQ,IAAI,CAACE,YAAY,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;IAC/D,CACF,CAAC;IACD,IAAI,CAACC,WAAW,GAAG,IAAI,CAACV,SAAS,CAACW,aAAa,CAAC,cAAc,CAAC;IAC/D,IAAI,CAACC,UAAU,CAAC,IAAI,CAACF,WAAW,CAAC;EACnC;EAEAE,UAAUA,CAACC,MAA0B,EAAEC,OAAiB,EAAE;IACxD,KAAK,CAACF,UAAU,CAACC,MAAM,EAAEC,OAAO,CAAC;IACjC,MAAMP,IAAI,GAAGM,MAAM,IAAI,IAAI,CAACH,WAAW;IACvC,IAAIH,IAAI,IAAI,IAAI,EAAE;MAChB,IAAI,IAAI,CAACQ,KAAK,CAACP,SAAS,KAAKD,IAAI,CAACC,SAAS,EAAE;MAC7C,IAAI,CAACO,KAAK,CAACP,SAAS,GAAGD,IAAI,CAACC,SAAS;IACvC;EACF;AACF;AAEA,eAAeZ,UAAU","ignoreList":[]} \ No newline at end of file diff --git a/public/assets/quill/ui/icons.d.ts b/public/assets/quill/ui/icons.d.ts new file mode 100644 index 0000000..b1e837f --- /dev/null +++ b/public/assets/quill/ui/icons.d.ts @@ -0,0 +1,49 @@ +declare const _default: { + align: { + '': string; + center: string; + right: string; + justify: string; + }; + background: string; + blockquote: string; + bold: string; + clean: string; + code: string; + 'code-block': string; + color: string; + direction: { + '': string; + rtl: string; + }; + formula: string; + header: { + '1': string; + '2': string; + '3': string; + '4': string; + '5': string; + '6': string; + }; + italic: string; + image: string; + indent: { + '+1': string; + '-1': string; + }; + link: string; + list: { + bullet: string; + check: string; + ordered: string; + }; + script: { + sub: string; + super: string; + }; + strike: string; + table: string; + underline: string; + video: string; +}; +export default _default; diff --git a/public/assets/quill/ui/icons.js b/public/assets/quill/ui/icons.js new file mode 100644 index 0000000..8ef803d --- /dev/null +++ b/public/assets/quill/ui/icons.js @@ -0,0 +1,82 @@ +const alignLeftIcon = ""; +const alignCenterIcon = ""; +const alignRightIcon = ""; +const alignJustifyIcon = ""; +const backgroundIcon = ""; +const blockquoteIcon = ""; +const boldIcon = ""; +const cleanIcon = ""; +const codeIcon = ""; +const colorIcon = ""; +const directionLeftToRightIcon = ""; +const directionRightToLeftIcon = ""; +const formulaIcon = ""; +const headerIcon = ""; +const header2Icon = ""; +const header3Icon = ""; +const header4Icon = ""; +const header5Icon = ""; +const header6Icon = ""; +const italicIcon = ""; +const imageIcon = ""; +const indentIcon = ""; +const outdentIcon = ""; +const linkIcon = ""; +const listBulletIcon = ""; +const listCheckIcon = ""; +const listOrderedIcon = ""; +const subscriptIcon = ""; +const superscriptIcon = ""; +const strikeIcon = ""; +const tableIcon = ""; +const underlineIcon = ""; +const videoIcon = ""; +export default { + align: { + '': alignLeftIcon, + center: alignCenterIcon, + right: alignRightIcon, + justify: alignJustifyIcon + }, + background: backgroundIcon, + blockquote: blockquoteIcon, + bold: boldIcon, + clean: cleanIcon, + code: codeIcon, + 'code-block': codeIcon, + color: colorIcon, + direction: { + '': directionLeftToRightIcon, + rtl: directionRightToLeftIcon + }, + formula: formulaIcon, + header: { + '1': headerIcon, + '2': header2Icon, + '3': header3Icon, + '4': header4Icon, + '5': header5Icon, + '6': header6Icon + }, + italic: italicIcon, + image: imageIcon, + indent: { + '+1': indentIcon, + '-1': outdentIcon + }, + link: linkIcon, + list: { + bullet: listBulletIcon, + check: listCheckIcon, + ordered: listOrderedIcon + }, + script: { + sub: subscriptIcon, + super: superscriptIcon + }, + strike: strikeIcon, + table: tableIcon, + underline: underlineIcon, + video: videoIcon +}; +//# sourceMappingURL=icons.js.map \ No newline at end of file diff --git a/public/assets/quill/ui/icons.js.map b/public/assets/quill/ui/icons.js.map new file mode 100644 index 0000000..28d1e3c --- /dev/null +++ b/public/assets/quill/ui/icons.js.map @@ -0,0 +1 @@ +{"version":3,"file":"icons.js","names":["align","alignLeftIcon","center","alignCenterIcon","right","alignRightIcon","justify","alignJustifyIcon","background","backgroundIcon","blockquote","blockquoteIcon","bold","boldIcon","clean","cleanIcon","code","codeIcon","color","colorIcon","direction","directionLeftToRightIcon","rtl","directionRightToLeftIcon","formula","formulaIcon","header","headerIcon","header2Icon","header3Icon","header4Icon","header5Icon","header6Icon","italic","italicIcon","image","imageIcon","indent","indentIcon","outdentIcon","link","linkIcon","list","bullet","listBulletIcon","check","listCheckIcon","ordered","listOrderedIcon","script","sub","subscriptIcon","super","superscriptIcon","strike","strikeIcon","table","tableIcon","underline","underlineIcon","video","videoIcon"],"sources":["../../src/ui/icons.ts"],"sourcesContent":["import alignLeftIcon from '../assets/icons/align-left.svg';\nimport alignCenterIcon from '../assets/icons/align-center.svg';\nimport alignRightIcon from '../assets/icons/align-right.svg';\nimport alignJustifyIcon from '../assets/icons/align-justify.svg';\nimport backgroundIcon from '../assets/icons/background.svg';\nimport blockquoteIcon from '../assets/icons/blockquote.svg';\nimport boldIcon from '../assets/icons/bold.svg';\nimport cleanIcon from '../assets/icons/clean.svg';\nimport codeIcon from '../assets/icons/code.svg';\nimport colorIcon from '../assets/icons/color.svg';\nimport directionLeftToRightIcon from '../assets/icons/direction-ltr.svg';\nimport directionRightToLeftIcon from '../assets/icons/direction-rtl.svg';\nimport formulaIcon from '../assets/icons/formula.svg';\nimport headerIcon from '../assets/icons/header.svg';\nimport header2Icon from '../assets/icons/header-2.svg';\nimport header3Icon from '../assets/icons/header-3.svg';\nimport header4Icon from '../assets/icons/header-4.svg';\nimport header5Icon from '../assets/icons/header-5.svg';\nimport header6Icon from '../assets/icons/header-6.svg';\nimport italicIcon from '../assets/icons/italic.svg';\nimport imageIcon from '../assets/icons/image.svg';\nimport indentIcon from '../assets/icons/indent.svg';\nimport outdentIcon from '../assets/icons/outdent.svg';\nimport linkIcon from '../assets/icons/link.svg';\nimport listBulletIcon from '../assets/icons/list-bullet.svg';\nimport listCheckIcon from '../assets/icons/list-check.svg';\nimport listOrderedIcon from '../assets/icons/list-ordered.svg';\nimport subscriptIcon from '../assets/icons/subscript.svg';\nimport superscriptIcon from '../assets/icons/superscript.svg';\nimport strikeIcon from '../assets/icons/strike.svg';\nimport tableIcon from '../assets/icons/table.svg';\nimport underlineIcon from '../assets/icons/underline.svg';\nimport videoIcon from '../assets/icons/video.svg';\n\nexport default {\n align: {\n '': alignLeftIcon,\n center: alignCenterIcon,\n right: alignRightIcon,\n justify: alignJustifyIcon,\n },\n background: backgroundIcon,\n blockquote: blockquoteIcon,\n bold: boldIcon,\n clean: cleanIcon,\n code: codeIcon,\n 'code-block': codeIcon,\n color: colorIcon,\n direction: {\n '': directionLeftToRightIcon,\n rtl: directionRightToLeftIcon,\n },\n formula: formulaIcon,\n header: {\n '1': headerIcon,\n '2': header2Icon,\n '3': header3Icon,\n '4': header4Icon,\n '5': header5Icon,\n '6': header6Icon,\n },\n italic: italicIcon,\n image: imageIcon,\n indent: {\n '+1': indentIcon,\n '-1': outdentIcon,\n },\n link: linkIcon,\n list: {\n bullet: listBulletIcon,\n check: listCheckIcon,\n ordered: listOrderedIcon,\n },\n script: {\n sub: subscriptIcon,\n super: superscriptIcon,\n },\n strike: strikeIcon,\n table: tableIcon,\n underline: underlineIcon,\n video: videoIcon,\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkCA,eAAe;EACbA,KAAK,EAAE;IACL,EAAE,EAAEC,aAAa;IACjBC,MAAM,EAAEC,eAAe;IACvBC,KAAK,EAAEC,cAAc;IACrBC,OAAO,EAAEC;EACX,CAAC;EACDC,UAAU,EAAEC,cAAc;EAC1BC,UAAU,EAAEC,cAAc;EAC1BC,IAAI,EAAEC,QAAQ;EACdC,KAAK,EAAEC,SAAS;EAChBC,IAAI,EAAEC,QAAQ;EACd,YAAY,EAAEA,QAAQ;EACtBC,KAAK,EAAEC,SAAS;EAChBC,SAAS,EAAE;IACT,EAAE,EAAEC,wBAAwB;IAC5BC,GAAG,EAAEC;EACP,CAAC;EACDC,OAAO,EAAEC,WAAW;EACpBC,MAAM,EAAE;IACN,GAAG,EAAEC,UAAU;IACf,GAAG,EAAEC,WAAW;IAChB,GAAG,EAAEC,WAAW;IAChB,GAAG,EAAEC,WAAW;IAChB,GAAG,EAAEC,WAAW;IAChB,GAAG,EAAEC;EACP,CAAC;EACDC,MAAM,EAAEC,UAAU;EAClBC,KAAK,EAAEC,SAAS;EAChBC,MAAM,EAAE;IACN,IAAI,EAAEC,UAAU;IAChB,IAAI,EAAEC;EACR,CAAC;EACDC,IAAI,EAAEC,QAAQ;EACdC,IAAI,EAAE;IACJC,MAAM,EAAEC,cAAc;IACtBC,KAAK,EAAEC,aAAa;IACpBC,OAAO,EAAEC;EACX,CAAC;EACDC,MAAM,EAAE;IACNC,GAAG,EAAEC,aAAa;IAClBC,KAAK,EAAEC;EACT,CAAC;EACDC,MAAM,EAAEC,UAAU;EAClBC,KAAK,EAAEC,SAAS;EAChBC,SAAS,EAAEC,aAAa;EACxBC,KAAK,EAAEC;AACT,CAAC","ignoreList":[]} \ No newline at end of file diff --git a/public/assets/quill/ui/picker.d.ts b/public/assets/quill/ui/picker.d.ts new file mode 100644 index 0000000..44c8ba9 --- /dev/null +++ b/public/assets/quill/ui/picker.d.ts @@ -0,0 +1,16 @@ +declare class Picker { + select: HTMLSelectElement; + container: HTMLElement; + label: HTMLElement; + constructor(select: HTMLSelectElement); + togglePicker(): void; + buildItem(option: HTMLOptionElement): HTMLSpanElement; + buildLabel(): HTMLSpanElement; + buildOptions(): void; + buildPicker(): void; + escape(): void; + close(): void; + selectItem(item: HTMLElement | null, trigger?: boolean): void; + update(): void; +} +export default Picker; diff --git a/public/assets/quill/ui/picker.js b/public/assets/quill/ui/picker.js new file mode 100644 index 0000000..60c0e17 --- /dev/null +++ b/public/assets/quill/ui/picker.js @@ -0,0 +1,171 @@ +const DropdownIcon = ""; +let optionsCounter = 0; +function toggleAriaAttribute(element, attribute) { + element.setAttribute(attribute, `${!(element.getAttribute(attribute) === 'true')}`); +} +class Picker { + constructor(select) { + this.select = select; + this.container = document.createElement('span'); + this.buildPicker(); + this.select.style.display = 'none'; + // @ts-expect-error Fix me later + this.select.parentNode.insertBefore(this.container, this.select); + this.label.addEventListener('mousedown', () => { + this.togglePicker(); + }); + this.label.addEventListener('keydown', event => { + switch (event.key) { + case 'Enter': + this.togglePicker(); + break; + case 'Escape': + this.escape(); + event.preventDefault(); + break; + default: + } + }); + this.select.addEventListener('change', this.update.bind(this)); + } + togglePicker() { + this.container.classList.toggle('ql-expanded'); + // Toggle aria-expanded and aria-hidden to make the picker accessible + toggleAriaAttribute(this.label, 'aria-expanded'); + // @ts-expect-error + toggleAriaAttribute(this.options, 'aria-hidden'); + } + buildItem(option) { + const item = document.createElement('span'); + // @ts-expect-error + item.tabIndex = '0'; + item.setAttribute('role', 'button'); + item.classList.add('ql-picker-item'); + const value = option.getAttribute('value'); + if (value) { + item.setAttribute('data-value', value); + } + if (option.textContent) { + item.setAttribute('data-label', option.textContent); + } + item.addEventListener('click', () => { + this.selectItem(item, true); + }); + item.addEventListener('keydown', event => { + switch (event.key) { + case 'Enter': + this.selectItem(item, true); + event.preventDefault(); + break; + case 'Escape': + this.escape(); + event.preventDefault(); + break; + default: + } + }); + return item; + } + buildLabel() { + const label = document.createElement('span'); + label.classList.add('ql-picker-label'); + label.innerHTML = DropdownIcon; + // @ts-expect-error + label.tabIndex = '0'; + label.setAttribute('role', 'button'); + label.setAttribute('aria-expanded', 'false'); + this.container.appendChild(label); + return label; + } + buildOptions() { + const options = document.createElement('span'); + options.classList.add('ql-picker-options'); + + // Don't want screen readers to read this until options are visible + options.setAttribute('aria-hidden', 'true'); + // @ts-expect-error + options.tabIndex = '-1'; + + // Need a unique id for aria-controls + options.id = `ql-picker-options-${optionsCounter}`; + optionsCounter += 1; + this.label.setAttribute('aria-controls', options.id); + + // @ts-expect-error + this.options = options; + Array.from(this.select.options).forEach(option => { + const item = this.buildItem(option); + options.appendChild(item); + if (option.selected === true) { + this.selectItem(item); + } + }); + this.container.appendChild(options); + } + buildPicker() { + Array.from(this.select.attributes).forEach(item => { + this.container.setAttribute(item.name, item.value); + }); + this.container.classList.add('ql-picker'); + this.label = this.buildLabel(); + this.buildOptions(); + } + escape() { + // Close menu and return focus to trigger label + this.close(); + // Need setTimeout for accessibility to ensure that the browser executes + // focus on the next process thread and after any DOM content changes + setTimeout(() => this.label.focus(), 1); + } + close() { + this.container.classList.remove('ql-expanded'); + this.label.setAttribute('aria-expanded', 'false'); + // @ts-expect-error + this.options.setAttribute('aria-hidden', 'true'); + } + selectItem(item) { + let trigger = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + const selected = this.container.querySelector('.ql-selected'); + if (item === selected) return; + if (selected != null) { + selected.classList.remove('ql-selected'); + } + if (item == null) return; + item.classList.add('ql-selected'); + // @ts-expect-error Fix me later + this.select.selectedIndex = Array.from(item.parentNode.children).indexOf(item); + if (item.hasAttribute('data-value')) { + // @ts-expect-error Fix me later + this.label.setAttribute('data-value', item.getAttribute('data-value')); + } else { + this.label.removeAttribute('data-value'); + } + if (item.hasAttribute('data-label')) { + // @ts-expect-error Fix me later + this.label.setAttribute('data-label', item.getAttribute('data-label')); + } else { + this.label.removeAttribute('data-label'); + } + if (trigger) { + this.select.dispatchEvent(new Event('change')); + this.close(); + } + } + update() { + let option; + if (this.select.selectedIndex > -1) { + const item = + // @ts-expect-error Fix me later + this.container.querySelector('.ql-picker-options').children[this.select.selectedIndex]; + option = this.select.options[this.select.selectedIndex]; + // @ts-expect-error + this.selectItem(item); + } else { + this.selectItem(null); + } + const isActive = option != null && option !== this.select.querySelector('option[selected]'); + this.label.classList.toggle('ql-active', isActive); + } +} +export default Picker; +//# sourceMappingURL=picker.js.map \ No newline at end of file diff --git a/public/assets/quill/ui/picker.js.map b/public/assets/quill/ui/picker.js.map new file mode 100644 index 0000000..1ab973c --- /dev/null +++ b/public/assets/quill/ui/picker.js.map @@ -0,0 +1 @@ +{"version":3,"file":"picker.js","names":["optionsCounter","toggleAriaAttribute","element","attribute","setAttribute","getAttribute","Picker","constructor","select","container","document","createElement","buildPicker","style","display","parentNode","insertBefore","label","addEventListener","togglePicker","event","key","escape","preventDefault","update","bind","classList","toggle","options","buildItem","option","item","tabIndex","add","value","textContent","selectItem","buildLabel","innerHTML","DropdownIcon","appendChild","buildOptions","id","Array","from","forEach","selected","attributes","name","close","setTimeout","focus","remove","trigger","arguments","length","undefined","querySelector","selectedIndex","children","indexOf","hasAttribute","removeAttribute","dispatchEvent","Event","isActive"],"sources":["../../src/ui/picker.ts"],"sourcesContent":["import DropdownIcon from '../assets/icons/dropdown.svg';\n\nlet optionsCounter = 0;\n\nfunction toggleAriaAttribute(element: HTMLElement, attribute: string) {\n element.setAttribute(\n attribute,\n `${!(element.getAttribute(attribute) === 'true')}`,\n );\n}\n\nclass Picker {\n select: HTMLSelectElement;\n container: HTMLElement;\n label: HTMLElement;\n\n constructor(select: HTMLSelectElement) {\n this.select = select;\n this.container = document.createElement('span');\n this.buildPicker();\n this.select.style.display = 'none';\n // @ts-expect-error Fix me later\n this.select.parentNode.insertBefore(this.container, this.select);\n\n this.label.addEventListener('mousedown', () => {\n this.togglePicker();\n });\n this.label.addEventListener('keydown', (event) => {\n switch (event.key) {\n case 'Enter':\n this.togglePicker();\n break;\n case 'Escape':\n this.escape();\n event.preventDefault();\n break;\n default:\n }\n });\n this.select.addEventListener('change', this.update.bind(this));\n }\n\n togglePicker() {\n this.container.classList.toggle('ql-expanded');\n // Toggle aria-expanded and aria-hidden to make the picker accessible\n toggleAriaAttribute(this.label, 'aria-expanded');\n // @ts-expect-error\n toggleAriaAttribute(this.options, 'aria-hidden');\n }\n\n buildItem(option: HTMLOptionElement) {\n const item = document.createElement('span');\n // @ts-expect-error\n item.tabIndex = '0';\n item.setAttribute('role', 'button');\n item.classList.add('ql-picker-item');\n const value = option.getAttribute('value');\n if (value) {\n item.setAttribute('data-value', value);\n }\n if (option.textContent) {\n item.setAttribute('data-label', option.textContent);\n }\n item.addEventListener('click', () => {\n this.selectItem(item, true);\n });\n item.addEventListener('keydown', (event) => {\n switch (event.key) {\n case 'Enter':\n this.selectItem(item, true);\n event.preventDefault();\n break;\n case 'Escape':\n this.escape();\n event.preventDefault();\n break;\n default:\n }\n });\n\n return item;\n }\n\n buildLabel() {\n const label = document.createElement('span');\n label.classList.add('ql-picker-label');\n label.innerHTML = DropdownIcon;\n // @ts-expect-error\n label.tabIndex = '0';\n label.setAttribute('role', 'button');\n label.setAttribute('aria-expanded', 'false');\n this.container.appendChild(label);\n return label;\n }\n\n buildOptions() {\n const options = document.createElement('span');\n options.classList.add('ql-picker-options');\n\n // Don't want screen readers to read this until options are visible\n options.setAttribute('aria-hidden', 'true');\n // @ts-expect-error\n options.tabIndex = '-1';\n\n // Need a unique id for aria-controls\n options.id = `ql-picker-options-${optionsCounter}`;\n optionsCounter += 1;\n this.label.setAttribute('aria-controls', options.id);\n\n // @ts-expect-error\n this.options = options;\n\n Array.from(this.select.options).forEach((option) => {\n const item = this.buildItem(option);\n options.appendChild(item);\n if (option.selected === true) {\n this.selectItem(item);\n }\n });\n this.container.appendChild(options);\n }\n\n buildPicker() {\n Array.from(this.select.attributes).forEach((item) => {\n this.container.setAttribute(item.name, item.value);\n });\n this.container.classList.add('ql-picker');\n this.label = this.buildLabel();\n this.buildOptions();\n }\n\n escape() {\n // Close menu and return focus to trigger label\n this.close();\n // Need setTimeout for accessibility to ensure that the browser executes\n // focus on the next process thread and after any DOM content changes\n setTimeout(() => this.label.focus(), 1);\n }\n\n close() {\n this.container.classList.remove('ql-expanded');\n this.label.setAttribute('aria-expanded', 'false');\n // @ts-expect-error\n this.options.setAttribute('aria-hidden', 'true');\n }\n\n selectItem(item: HTMLElement | null, trigger = false) {\n const selected = this.container.querySelector('.ql-selected');\n if (item === selected) return;\n if (selected != null) {\n selected.classList.remove('ql-selected');\n }\n if (item == null) return;\n item.classList.add('ql-selected');\n // @ts-expect-error Fix me later\n this.select.selectedIndex = Array.from(item.parentNode.children).indexOf(\n item,\n );\n if (item.hasAttribute('data-value')) {\n // @ts-expect-error Fix me later\n this.label.setAttribute('data-value', item.getAttribute('data-value'));\n } else {\n this.label.removeAttribute('data-value');\n }\n if (item.hasAttribute('data-label')) {\n // @ts-expect-error Fix me later\n this.label.setAttribute('data-label', item.getAttribute('data-label'));\n } else {\n this.label.removeAttribute('data-label');\n }\n if (trigger) {\n this.select.dispatchEvent(new Event('change'));\n this.close();\n }\n }\n\n update() {\n let option;\n if (this.select.selectedIndex > -1) {\n const item =\n // @ts-expect-error Fix me later\n this.container.querySelector('.ql-picker-options').children[\n this.select.selectedIndex\n ];\n option = this.select.options[this.select.selectedIndex];\n // @ts-expect-error\n this.selectItem(item);\n } else {\n this.selectItem(null);\n }\n const isActive =\n option != null &&\n option !== this.select.querySelector('option[selected]');\n this.label.classList.toggle('ql-active', isActive);\n }\n}\n\nexport default Picker;\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file diff --git a/public/assets/quill/ui/tooltip.d.ts b/public/assets/quill/ui/tooltip.d.ts new file mode 100644 index 0000000..01b2e15 --- /dev/null +++ b/public/assets/quill/ui/tooltip.d.ts @@ -0,0 +1,12 @@ +import type Quill from '../core.js'; +import type { Bounds } from '../core/selection.js'; +declare class Tooltip { + quill: Quill; + boundsContainer: HTMLElement; + root: HTMLDivElement; + constructor(quill: Quill, boundsContainer?: HTMLElement); + hide(): void; + position(reference: Bounds): number; + show(): void; +} +export default Tooltip; diff --git a/public/assets/quill/ui/tooltip.js b/public/assets/quill/ui/tooltip.js new file mode 100644 index 0000000..ec1fb60 --- /dev/null +++ b/public/assets/quill/ui/tooltip.js @@ -0,0 +1,56 @@ +const isScrollable = el => { + const { + overflowY + } = getComputedStyle(el, null); + return overflowY !== 'visible' && overflowY !== 'clip'; +}; +class Tooltip { + constructor(quill, boundsContainer) { + this.quill = quill; + this.boundsContainer = boundsContainer || document.body; + this.root = quill.addContainer('ql-tooltip'); + // @ts-expect-error + this.root.innerHTML = this.constructor.TEMPLATE; + if (isScrollable(this.quill.root)) { + this.quill.root.addEventListener('scroll', () => { + this.root.style.marginTop = `${-1 * this.quill.root.scrollTop}px`; + }); + } + this.hide(); + } + hide() { + this.root.classList.add('ql-hidden'); + } + position(reference) { + const left = reference.left + reference.width / 2 - this.root.offsetWidth / 2; + // root.scrollTop should be 0 if scrollContainer !== root + const top = reference.bottom + this.quill.root.scrollTop; + this.root.style.left = `${left}px`; + this.root.style.top = `${top}px`; + this.root.classList.remove('ql-flip'); + const containerBounds = this.boundsContainer.getBoundingClientRect(); + const rootBounds = this.root.getBoundingClientRect(); + let shift = 0; + if (rootBounds.right > containerBounds.right) { + shift = containerBounds.right - rootBounds.right; + this.root.style.left = `${left + shift}px`; + } + if (rootBounds.left < containerBounds.left) { + shift = containerBounds.left - rootBounds.left; + this.root.style.left = `${left + shift}px`; + } + if (rootBounds.bottom > containerBounds.bottom) { + const height = rootBounds.bottom - rootBounds.top; + const verticalShift = reference.bottom - reference.top + height; + this.root.style.top = `${top - verticalShift}px`; + this.root.classList.add('ql-flip'); + } + return shift; + } + show() { + this.root.classList.remove('ql-editing'); + this.root.classList.remove('ql-hidden'); + } +} +export default Tooltip; +//# sourceMappingURL=tooltip.js.map \ No newline at end of file diff --git a/public/assets/quill/ui/tooltip.js.map b/public/assets/quill/ui/tooltip.js.map new file mode 100644 index 0000000..28d658f --- /dev/null +++ b/public/assets/quill/ui/tooltip.js.map @@ -0,0 +1 @@ +{"version":3,"file":"tooltip.js","names":["isScrollable","el","overflowY","getComputedStyle","Tooltip","constructor","quill","boundsContainer","document","body","root","addContainer","innerHTML","TEMPLATE","addEventListener","style","marginTop","scrollTop","hide","classList","add","position","reference","left","width","offsetWidth","top","bottom","remove","containerBounds","getBoundingClientRect","rootBounds","shift","right","height","verticalShift","show"],"sources":["../../src/ui/tooltip.ts"],"sourcesContent":["import type Quill from '../core.js';\nimport type { Bounds } from '../core/selection.js';\n\nconst isScrollable = (el: Element) => {\n const { overflowY } = getComputedStyle(el, null);\n return overflowY !== 'visible' && overflowY !== 'clip';\n};\n\nclass Tooltip {\n quill: Quill;\n boundsContainer: HTMLElement;\n root: HTMLDivElement;\n\n constructor(quill: Quill, boundsContainer?: HTMLElement) {\n this.quill = quill;\n this.boundsContainer = boundsContainer || document.body;\n this.root = quill.addContainer('ql-tooltip');\n // @ts-expect-error\n this.root.innerHTML = this.constructor.TEMPLATE;\n if (isScrollable(this.quill.root)) {\n this.quill.root.addEventListener('scroll', () => {\n this.root.style.marginTop = `${-1 * this.quill.root.scrollTop}px`;\n });\n }\n this.hide();\n }\n\n hide() {\n this.root.classList.add('ql-hidden');\n }\n\n position(reference: Bounds) {\n const left =\n reference.left + reference.width / 2 - this.root.offsetWidth / 2;\n // root.scrollTop should be 0 if scrollContainer !== root\n const top = reference.bottom + this.quill.root.scrollTop;\n this.root.style.left = `${left}px`;\n this.root.style.top = `${top}px`;\n this.root.classList.remove('ql-flip');\n const containerBounds = this.boundsContainer.getBoundingClientRect();\n const rootBounds = this.root.getBoundingClientRect();\n let shift = 0;\n if (rootBounds.right > containerBounds.right) {\n shift = containerBounds.right - rootBounds.right;\n this.root.style.left = `${left + shift}px`;\n }\n if (rootBounds.left < containerBounds.left) {\n shift = containerBounds.left - rootBounds.left;\n this.root.style.left = `${left + shift}px`;\n }\n if (rootBounds.bottom > containerBounds.bottom) {\n const height = rootBounds.bottom - rootBounds.top;\n const verticalShift = reference.bottom - reference.top + height;\n this.root.style.top = `${top - verticalShift}px`;\n this.root.classList.add('ql-flip');\n }\n return shift;\n }\n\n show() {\n this.root.classList.remove('ql-editing');\n this.root.classList.remove('ql-hidden');\n }\n}\n\nexport default Tooltip;\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file diff --git a/public/assets/sweetalert2/LICENSE b/public/assets/sweetalert2/LICENSE new file mode 100644 index 0000000..bb3805f --- /dev/null +++ b/public/assets/sweetalert2/LICENSE @@ -0,0 +1,22 @@ +The MIT License (MIT) + +Copyright (c) 2014 Tristan Edwards & Limon Monte + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + diff --git a/public/assets/sweetalert2/README.md b/public/assets/sweetalert2/README.md new file mode 100644 index 0000000..45f10b6 --- /dev/null +++ b/public/assets/sweetalert2/README.md @@ -0,0 +1,95 @@ + + SweetAlert2 + + +A beautiful, responsive, customizable, accessible (WAI-ARIA) replacement
    for JavaScript's popup boxes. Zero dependencies. + +--- + +### [Installation](https://sweetalert2.github.io/#download) | [Usage](https://sweetalert2.github.io/#usage) | [Examples](https://sweetalert2.github.io/#examples) | [Recipe gallery](https://sweetalert2.github.io/recipe-gallery/) | [React](https://github.com/sweetalert2/sweetalert2-react-content) | [Angular](https://github.com/sweetalert2/ngx-sweetalert2) | [Laravel](https://github.com/sweetalert2/sweetalert2-laravel) + +--- + +✨ 🚀 ✨ Get 20% discount on Hostiger Web Hosting: https://hostinger.com/?REFERRALCODE=BKZHOSTINDAB + +# Sponsors + +For all questions related to sponsorship please get in touch with me via email sweetalert2@gmail.com + +
    + + + + + + + +

    Become a sponsor

    Kryptot

    InkSonic

    Occupational Healthcare

    Build your SaaS or App
    + + + + + + + +

    Buy Youtube Views

    Tiago de Oliveira Stutz

    Roboflow

    ZezeLife
    + +# NSFW Sponsors + + + + + + + + + + +

    Become a NSFW sponsor

    XNDOLL

    PIDOLL

    PalsToy

    Mark Mitchell

    Pleasure Me Now
    + + + + + + + + + + +

    Venus Love Dolls

    SoSexDoll

    Hismith

    SexDollPartner

    XspaceCup

    NakeDoll

    hentai sex toys
    + + + + + + + + + +

    VSDoll

    sexdoll torso

    anime sexdoll

    cheap sexdoll

    huge dildo

    sexdoll
    + + + + + + + +

    Cute Sex Doll

    best pocket pussy

    female torso sex doll

    male masturbator
    + + + + + + + + +

    penis pump

    BestRealDoll

    SexDollTech

    SexDollsOff

    RealSexDoll
    + + + + + + + + +

    Your Doll

    Annie's Dollhouse

    STC

    DoctorClimax

    BSDoll
    diff --git a/public/assets/sweetalert2/dist/sweetalert2.all.js b/public/assets/sweetalert2/dist/sweetalert2.all.js new file mode 100644 index 0000000..038caa8 --- /dev/null +++ b/public/assets/sweetalert2/dist/sweetalert2.all.js @@ -0,0 +1,4825 @@ +/*! +* sweetalert2 v11.26.18 +* Released under the MIT License. +*/ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Sweetalert2 = factory()); +})(this, (function () { 'use strict'; + + function _assertClassBrand(e, t, n) { + if ("function" == typeof e ? e === t : e.has(t)) return arguments.length < 3 ? t : n; + throw new TypeError("Private element is not present on this object"); + } + function _checkPrivateRedeclaration(e, t) { + if (t.has(e)) throw new TypeError("Cannot initialize the same private elements twice on an object"); + } + function _classPrivateFieldGet2(s, a) { + return s.get(_assertClassBrand(s, a)); + } + function _classPrivateFieldInitSpec(e, t, a) { + _checkPrivateRedeclaration(e, t), t.set(e, a); + } + function _classPrivateFieldSet2(s, a, r) { + return s.set(_assertClassBrand(s, a), r), r; + } + + const RESTORE_FOCUS_TIMEOUT = 100; + + /** @type {GlobalState} */ + const globalState = {}; + const focusPreviousActiveElement = () => { + if (globalState.previousActiveElement instanceof HTMLElement) { + globalState.previousActiveElement.focus(); + globalState.previousActiveElement = null; + } else if (document.body) { + document.body.focus(); + } + }; + + /** + * Restore previous active (focused) element + * + * @param {boolean} returnFocus + * @returns {Promise} + */ + const restoreActiveElement = returnFocus => { + return new Promise(resolve => { + if (!returnFocus) { + return resolve(); + } + const x = window.scrollX; + const y = window.scrollY; + globalState.restoreFocusTimeout = setTimeout(() => { + focusPreviousActiveElement(); + resolve(); + }, RESTORE_FOCUS_TIMEOUT); // issues/900 + + window.scrollTo(x, y); + }); + }; + + const swalPrefix = 'swal2-'; + + /** + * @typedef {Record} SwalClasses + */ + + /** + * @typedef {'success' | 'warning' | 'info' | 'question' | 'error'} SwalIcon + * @typedef {Record} SwalIcons + */ + + /** @type {SwalClass[]} */ + const classNames = ['container', 'shown', 'height-auto', 'iosfix', 'popup', 'modal', 'no-backdrop', 'no-transition', 'toast', 'toast-shown', 'show', 'hide', 'close', 'title', 'html-container', 'actions', 'confirm', 'deny', 'cancel', 'footer', 'icon', 'icon-content', 'image', 'input', 'file', 'range', 'select', 'radio', 'checkbox', 'label', 'textarea', 'inputerror', 'input-label', 'validation-message', 'progress-steps', 'active-progress-step', 'progress-step', 'progress-step-line', 'loader', 'loading', 'styled', 'top', 'top-start', 'top-end', 'top-left', 'top-right', 'center', 'center-start', 'center-end', 'center-left', 'center-right', 'bottom', 'bottom-start', 'bottom-end', 'bottom-left', 'bottom-right', 'grow-row', 'grow-column', 'grow-fullscreen', 'rtl', 'timer-progress-bar', 'timer-progress-bar-container', 'scrollbar-measure', 'icon-success', 'icon-warning', 'icon-info', 'icon-question', 'icon-error', 'draggable', 'dragging']; + const swalClasses = classNames.reduce((acc, className) => { + acc[className] = swalPrefix + className; + return acc; + }, /** @type {SwalClasses} */{}); + + /** @type {SwalIcon[]} */ + const icons = ['success', 'warning', 'info', 'question', 'error']; + const iconTypes = icons.reduce((acc, icon) => { + acc[icon] = swalPrefix + icon; + return acc; + }, /** @type {SwalIcons} */{}); + + const consolePrefix = 'SweetAlert2:'; + + /** + * Capitalize the first letter of a string + * + * @param {string} str + * @returns {string} + */ + const capitalizeFirstLetter = str => str.charAt(0).toUpperCase() + str.slice(1); + + /** + * Standardize console warnings + * + * @param {string | string[]} message + */ + const warn = message => { + console.warn(`${consolePrefix} ${typeof message === 'object' ? message.join(' ') : message}`); + }; + + /** + * Standardize console errors + * + * @param {string} message + */ + const error = message => { + console.error(`${consolePrefix} ${message}`); + }; + + /** + * Private global state for `warnOnce` + * + * @type {string[]} + * @private + */ + const previousWarnOnceMessages = []; + + /** + * Show a console warning, but only if it hasn't already been shown + * + * @param {string} message + */ + const warnOnce = message => { + if (!previousWarnOnceMessages.includes(message)) { + previousWarnOnceMessages.push(message); + warn(message); + } + }; + + /** + * Show a one-time console warning about deprecated params/methods + * + * @param {string} deprecatedParam + * @param {string?} useInstead + */ + const warnAboutDeprecation = (deprecatedParam, useInstead = null) => { + warnOnce(`"${deprecatedParam}" is deprecated and will be removed in the next major release.${useInstead ? ` Use "${useInstead}" instead.` : ''}`); + }; + + /** + * If `arg` is a function, call it (with no arguments or context) and return the result. + * Otherwise, just pass the value through + * + * @param {(() => *) | *} arg + * @returns {*} + */ + const callIfFunction = arg => typeof arg === 'function' ? arg() : arg; + + /** + * @param {*} arg + * @returns {boolean} + */ + const hasToPromiseFn = arg => arg && typeof arg.toPromise === 'function'; + + /** + * @param {*} arg + * @returns {Promise<*>} + */ + const asPromise = arg => hasToPromiseFn(arg) ? arg.toPromise() : Promise.resolve(arg); + + /** + * @param {*} arg + * @returns {boolean} + */ + const isPromise = arg => arg && Promise.resolve(arg) === arg; + + /** + * Gets the popup container which contains the backdrop and the popup itself. + * + * @returns {HTMLElement | null} + */ + const getContainer = () => document.body.querySelector(`.${swalClasses.container}`); + + /** + * @param {string} selectorString + * @returns {HTMLElement | null} + */ + const elementBySelector = selectorString => { + const container = getContainer(); + return container ? container.querySelector(selectorString) : null; + }; + + /** + * @param {string} className + * @returns {HTMLElement | null} + */ + const elementByClass = className => { + return elementBySelector(`.${className}`); + }; + + /** + * @returns {HTMLElement | null} + */ + const getPopup = () => elementByClass(swalClasses.popup); + + /** + * @returns {HTMLElement | null} + */ + const getIcon = () => elementByClass(swalClasses.icon); + + /** + * @returns {HTMLElement | null} + */ + const getIconContent = () => elementByClass(swalClasses['icon-content']); + + /** + * @returns {HTMLElement | null} + */ + const getTitle = () => elementByClass(swalClasses.title); + + /** + * @returns {HTMLElement | null} + */ + const getHtmlContainer = () => elementByClass(swalClasses['html-container']); + + /** + * @returns {HTMLElement | null} + */ + const getImage = () => elementByClass(swalClasses.image); + + /** + * @returns {HTMLElement | null} + */ + const getProgressSteps = () => elementByClass(swalClasses['progress-steps']); + + /** + * @returns {HTMLElement | null} + */ + const getValidationMessage = () => elementByClass(swalClasses['validation-message']); + + /** + * @returns {HTMLButtonElement | null} + */ + const getConfirmButton = () => (/** @type {HTMLButtonElement} */elementBySelector(`.${swalClasses.actions} .${swalClasses.confirm}`)); + + /** + * @returns {HTMLButtonElement | null} + */ + const getCancelButton = () => (/** @type {HTMLButtonElement} */elementBySelector(`.${swalClasses.actions} .${swalClasses.cancel}`)); + + /** + * @returns {HTMLButtonElement | null} + */ + const getDenyButton = () => (/** @type {HTMLButtonElement} */elementBySelector(`.${swalClasses.actions} .${swalClasses.deny}`)); + + /** + * @returns {HTMLElement | null} + */ + const getInputLabel = () => elementByClass(swalClasses['input-label']); + + /** + * @returns {HTMLElement | null} + */ + const getLoader = () => elementBySelector(`.${swalClasses.loader}`); + + /** + * @returns {HTMLElement | null} + */ + const getActions = () => elementByClass(swalClasses.actions); + + /** + * @returns {HTMLElement | null} + */ + const getFooter = () => elementByClass(swalClasses.footer); + + /** + * @returns {HTMLElement | null} + */ + const getTimerProgressBar = () => elementByClass(swalClasses['timer-progress-bar']); + + /** + * @returns {HTMLElement | null} + */ + const getCloseButton = () => elementByClass(swalClasses.close); + + // https://github.com/jkup/focusable/blob/master/index.js + const focusable = ` + a[href], + area[href], + input:not([disabled]), + select:not([disabled]), + textarea:not([disabled]), + button:not([disabled]), + iframe, + object, + embed, + [tabindex="0"], + [contenteditable], + audio[controls], + video[controls], + summary +`; + /** + * @returns {HTMLElement[]} + */ + const getFocusableElements = () => { + const popup = getPopup(); + if (!popup) { + return []; + } + /** @type {NodeListOf} */ + const focusableElementsWithTabindex = popup.querySelectorAll('[tabindex]:not([tabindex="-1"]):not([tabindex="0"])'); + const focusableElementsWithTabindexSorted = Array.from(focusableElementsWithTabindex) + // sort according to tabindex + .sort((a, b) => { + const tabindexA = parseInt(a.getAttribute('tabindex') || '0'); + const tabindexB = parseInt(b.getAttribute('tabindex') || '0'); + if (tabindexA > tabindexB) { + return 1; + } else if (tabindexA < tabindexB) { + return -1; + } + return 0; + }); + + /** @type {NodeListOf} */ + const otherFocusableElements = popup.querySelectorAll(focusable); + const otherFocusableElementsFiltered = Array.from(otherFocusableElements).filter(el => el.getAttribute('tabindex') !== '-1'); + return [...new Set(focusableElementsWithTabindexSorted.concat(otherFocusableElementsFiltered))].filter(el => isVisible$1(el)); + }; + + /** + * @returns {boolean} + */ + const isModal = () => { + return hasClass(document.body, swalClasses.shown) && !hasClass(document.body, swalClasses['toast-shown']) && !hasClass(document.body, swalClasses['no-backdrop']); + }; + + /** + * @returns {boolean} + */ + const isToast = () => { + const popup = getPopup(); + if (!popup) { + return false; + } + return hasClass(popup, swalClasses.toast); + }; + + /** + * @returns {boolean} + */ + const isLoading = () => { + const popup = getPopup(); + if (!popup) { + return false; + } + return popup.hasAttribute('data-loading'); + }; + + /** + * Securely set innerHTML of an element + * https://github.com/sweetalert2/sweetalert2/issues/1926 + * + * @param {HTMLElement} elem + * @param {string} html + */ + const setInnerHtml = (elem, html) => { + elem.textContent = ''; + if (html) { + const parser = new DOMParser(); + const parsed = parser.parseFromString(html, `text/html`); + const head = parsed.querySelector('head'); + if (head) { + Array.from(head.childNodes).forEach(child => { + elem.appendChild(child); + }); + } + const body = parsed.querySelector('body'); + if (body) { + Array.from(body.childNodes).forEach(child => { + if (child instanceof HTMLVideoElement || child instanceof HTMLAudioElement) { + elem.appendChild(child.cloneNode(true)); // https://github.com/sweetalert2/sweetalert2/issues/2507 + } else { + elem.appendChild(child); + } + }); + } + } + }; + + /** + * @param {HTMLElement} elem + * @param {string} className + * @returns {boolean} + */ + const hasClass = (elem, className) => { + if (!className) { + return false; + } + const classList = className.split(/\s+/); + for (let i = 0; i < classList.length; i++) { + if (!elem.classList.contains(classList[i])) { + return false; + } + } + return true; + }; + + /** + * @param {HTMLElement} elem + * @param {SweetAlertOptions} params + */ + const removeCustomClasses = (elem, params) => { + Array.from(elem.classList).forEach(className => { + if (!Object.values(swalClasses).includes(className) && !Object.values(iconTypes).includes(className) && !Object.values(params.showClass || {}).includes(className)) { + elem.classList.remove(className); + } + }); + }; + + /** + * @param {HTMLElement} elem + * @param {SweetAlertOptions} params + * @param {string} className + */ + const applyCustomClass = (elem, params, className) => { + removeCustomClasses(elem, params); + if (!params.customClass) { + return; + } + const customClass = params.customClass[(/** @type {keyof SweetAlertCustomClass} */className)]; + if (!customClass) { + return; + } + if (typeof customClass !== 'string' && !customClass.forEach) { + warn(`Invalid type of customClass.${className}! Expected string or iterable object, got "${typeof customClass}"`); + return; + } + addClass(elem, customClass); + }; + + /** + * @param {HTMLElement} popup + * @param {import('./renderers/renderInput').InputClass | SweetAlertInput} inputClass + * @returns {HTMLInputElement | null} + */ + const getInput$1 = (popup, inputClass) => { + if (!inputClass) { + return null; + } + switch (inputClass) { + case 'select': + case 'textarea': + case 'file': + return popup.querySelector(`.${swalClasses.popup} > .${swalClasses[inputClass]}`); + case 'checkbox': + return popup.querySelector(`.${swalClasses.popup} > .${swalClasses.checkbox} input`); + case 'radio': + return popup.querySelector(`.${swalClasses.popup} > .${swalClasses.radio} input:checked`) || popup.querySelector(`.${swalClasses.popup} > .${swalClasses.radio} input:first-child`); + case 'range': + return popup.querySelector(`.${swalClasses.popup} > .${swalClasses.range} input`); + default: + return popup.querySelector(`.${swalClasses.popup} > .${swalClasses.input}`); + } + }; + + /** + * @param {HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement} input + */ + const focusInput = input => { + input.focus(); + + // place cursor at end of text in text input + if (input.type !== 'file') { + // http://stackoverflow.com/a/2345915 + const val = input.value; + input.value = ''; + input.value = val; + } + }; + + /** + * @param {HTMLElement | HTMLElement[] | null} target + * @param {string | string[] | readonly string[] | undefined} classList + * @param {boolean} condition + */ + const toggleClass = (target, classList, condition) => { + if (!target || !classList) { + return; + } + if (typeof classList === 'string') { + classList = classList.split(/\s+/).filter(Boolean); + } + classList.forEach(className => { + if (Array.isArray(target)) { + target.forEach(elem => { + if (condition) { + elem.classList.add(className); + } else { + elem.classList.remove(className); + } + }); + } else { + if (condition) { + target.classList.add(className); + } else { + target.classList.remove(className); + } + } + }); + }; + + /** + * @param {HTMLElement | HTMLElement[] | null} target + * @param {string | string[] | readonly string[] | undefined} classList + */ + const addClass = (target, classList) => { + toggleClass(target, classList, true); + }; + + /** + * @param {HTMLElement | HTMLElement[] | null} target + * @param {string | string[] | readonly string[] | undefined} classList + */ + const removeClass = (target, classList) => { + toggleClass(target, classList, false); + }; + + /** + * Get direct child of an element by class name + * + * @param {HTMLElement} elem + * @param {string} className + * @returns {HTMLElement | undefined} + */ + const getDirectChildByClass = (elem, className) => { + const children = Array.from(elem.children); + for (let i = 0; i < children.length; i++) { + const child = children[i]; + if (child instanceof HTMLElement && hasClass(child, className)) { + return child; + } + } + }; + + /** + * @param {HTMLElement} elem + * @param {string} property + * @param {string | number | null | undefined} value + */ + const applyNumericalStyle = (elem, property, value) => { + if (value === `${parseInt(`${value}`)}`) { + value = parseInt(value); + } + if (value || parseInt(`${value}`) === 0) { + elem.style.setProperty(property, typeof value === 'number' ? `${value}px` : (/** @type {string} */value)); + } else { + elem.style.removeProperty(property); + } + }; + + /** + * @param {HTMLElement | null} elem + * @param {string} display + */ + const show = (elem, display = 'flex') => { + if (!elem) { + return; + } + elem.style.display = display; + }; + + /** + * @param {HTMLElement | null} elem + */ + const hide = elem => { + if (!elem) { + return; + } + elem.style.display = 'none'; + }; + + /** + * @param {HTMLElement | null} elem + * @param {string} display + */ + const showWhenInnerHtmlPresent = (elem, display = 'block') => { + if (!elem) { + return; + } + new MutationObserver(() => { + toggle(elem, elem.innerHTML, display); + }).observe(elem, { + childList: true, + subtree: true + }); + }; + + /** + * @param {HTMLElement} parent + * @param {string} selector + * @param {string} property + * @param {string} value + */ + const setStyle = (parent, selector, property, value) => { + /** @type {HTMLElement | null} */ + const el = parent.querySelector(selector); + if (el) { + el.style.setProperty(property, value); + } + }; + + /** + * @param {HTMLElement} elem + * @param {boolean | string | null | undefined} condition + * @param {string} display + */ + const toggle = (elem, condition, display = 'flex') => { + if (condition) { + show(elem, display); + } else { + hide(elem); + } + }; + + /** + * borrowed from jquery $(elem).is(':visible') implementation + * + * @param {HTMLElement | null} elem + * @returns {boolean} + */ + const isVisible$1 = elem => Boolean(elem && (elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length)); + + /** + * @returns {boolean} + */ + const allButtonsAreHidden = () => !isVisible$1(getConfirmButton()) && !isVisible$1(getDenyButton()) && !isVisible$1(getCancelButton()); + + /** + * @param {HTMLElement} elem + * @returns {boolean} + */ + const isScrollable = elem => Boolean(elem.scrollHeight > elem.clientHeight); + + /** + * @param {HTMLElement} element + * @param {HTMLElement} stopElement + * @returns {boolean} + */ + const selfOrParentIsScrollable = (element, stopElement) => { + let parent = /** @type {HTMLElement | null} */element; + while (parent && parent !== stopElement) { + if (isScrollable(parent)) { + return true; + } + parent = parent.parentElement; + } + return false; + }; + + /** + * borrowed from https://stackoverflow.com/a/46352119 + * + * @param {HTMLElement} elem + * @returns {boolean} + */ + const hasCssAnimation = elem => { + const style = window.getComputedStyle(elem); + const animDuration = parseFloat(style.getPropertyValue('animation-duration') || '0'); + const transDuration = parseFloat(style.getPropertyValue('transition-duration') || '0'); + return animDuration > 0 || transDuration > 0; + }; + + /** + * @param {number} timer + * @param {boolean} reset + */ + const animateTimerProgressBar = (timer, reset = false) => { + const timerProgressBar = getTimerProgressBar(); + if (!timerProgressBar) { + return; + } + if (isVisible$1(timerProgressBar)) { + if (reset) { + timerProgressBar.style.transition = 'none'; + timerProgressBar.style.width = '100%'; + } + setTimeout(() => { + timerProgressBar.style.transition = `width ${timer / 1000}s linear`; + timerProgressBar.style.width = '0%'; + }, 10); + } + }; + const stopTimerProgressBar = () => { + const timerProgressBar = getTimerProgressBar(); + if (!timerProgressBar) { + return; + } + const timerProgressBarWidth = parseInt(window.getComputedStyle(timerProgressBar).width); + timerProgressBar.style.removeProperty('transition'); + timerProgressBar.style.width = '100%'; + const timerProgressBarFullWidth = parseInt(window.getComputedStyle(timerProgressBar).width); + const timerProgressBarPercent = timerProgressBarWidth / timerProgressBarFullWidth * 100; + timerProgressBar.style.width = `${timerProgressBarPercent}%`; + }; + + /** + * Detect Node env + * + * @returns {boolean} + */ + const isNodeEnv = () => typeof window === 'undefined' || typeof document === 'undefined'; + + const sweetHTML = ` +
    + +
      +
      + +

      +
      + + +
      + + +
      + +
      + + +
      +
      +
      + + + +
      +
      +
      +
      +
      +
      +`.replace(/(^|\n)\s*/g, ''); + + /** + * @returns {boolean} + */ + const resetOldContainer = () => { + const oldContainer = getContainer(); + if (!oldContainer) { + return false; + } + oldContainer.remove(); + removeClass([document.documentElement, document.body], [swalClasses['no-backdrop'], swalClasses['toast-shown'], + // @ts-ignore: 'has-column' is not defined in swalClasses but may be set dynamically + swalClasses['has-column']]); + return true; + }; + const resetValidationMessage$1 = () => { + if (globalState.currentInstance) { + globalState.currentInstance.resetValidationMessage(); + } + }; + const addInputChangeListeners = () => { + const popup = getPopup(); + if (!popup) { + return; + } + const input = getDirectChildByClass(popup, swalClasses.input); + const file = getDirectChildByClass(popup, swalClasses.file); + /** @type {HTMLInputElement | null} */ + const range = popup.querySelector(`.${swalClasses.range} input`); + /** @type {HTMLOutputElement | null} */ + const rangeOutput = popup.querySelector(`.${swalClasses.range} output`); + const select = getDirectChildByClass(popup, swalClasses.select); + /** @type {HTMLInputElement | null} */ + const checkbox = popup.querySelector(`.${swalClasses.checkbox} input`); + const textarea = getDirectChildByClass(popup, swalClasses.textarea); + if (input) { + input.oninput = resetValidationMessage$1; + } + if (file) { + file.onchange = resetValidationMessage$1; + } + if (select) { + select.onchange = resetValidationMessage$1; + } + if (checkbox) { + checkbox.onchange = resetValidationMessage$1; + } + if (textarea) { + textarea.oninput = resetValidationMessage$1; + } + if (range && rangeOutput) { + range.oninput = () => { + resetValidationMessage$1(); + rangeOutput.value = range.value; + }; + range.onchange = () => { + resetValidationMessage$1(); + rangeOutput.value = range.value; + }; + } + }; + + /** + * @param {string | HTMLElement} target + * @returns {HTMLElement} + */ + const getTarget = target => { + if (typeof target === 'string') { + const element = document.querySelector(target); + if (!element) { + throw new Error(`Target element "${target}" not found`); + } + return /** @type {HTMLElement} */element; + } + return target; + }; + + /** + * @param {SweetAlertOptions} params + */ + const setupAccessibility = params => { + const popup = getPopup(); + if (!popup) { + return; + } + popup.setAttribute('role', params.toast ? 'alert' : 'dialog'); + popup.setAttribute('aria-live', params.toast ? 'polite' : 'assertive'); + if (!params.toast) { + popup.setAttribute('aria-modal', 'true'); + } + }; + + /** + * @param {HTMLElement} targetElement + */ + const setupRTL = targetElement => { + if (window.getComputedStyle(targetElement).direction === 'rtl') { + addClass(getContainer(), swalClasses.rtl); + globalState.isRTL = true; + } + }; + + /** + * Add modal + backdrop to DOM + * + * @param {SweetAlertOptions} params + */ + const init = params => { + // Clean up the old popup container if it exists + const oldContainerExisted = resetOldContainer(); + if (isNodeEnv()) { + error('SweetAlert2 requires document to initialize'); + return; + } + const container = document.createElement('div'); + container.className = swalClasses.container; + if (oldContainerExisted) { + addClass(container, swalClasses['no-transition']); + } + setInnerHtml(container, sweetHTML); + container.dataset['swal2Theme'] = params.theme; + const targetElement = getTarget(params.target || 'body'); + targetElement.appendChild(container); + if (params.topLayer) { + container.setAttribute('popover', ''); + container.showPopover(); + } + setupAccessibility(params); + setupRTL(targetElement); + addInputChangeListeners(); + }; + + /** + * @param {HTMLElement | object | string} param + * @param {HTMLElement} target + */ + const parseHtmlToContainer = (param, target) => { + // DOM element + if (param instanceof HTMLElement) { + target.appendChild(param); + } + + // Object + else if (typeof param === 'object') { + handleObject(param, target); + } + + // Plain string + else if (param) { + setInnerHtml(target, param); + } + }; + + /** + * @param {object} param + * @param {HTMLElement} target + */ + const handleObject = (param, target) => { + // JQuery element(s) + if ('jquery' in param) { + handleJqueryElem(target, param); + } + + // For other objects use their string representation + else { + setInnerHtml(target, param.toString()); + } + }; + + /** + * @param {HTMLElement} target + * @param {any} elem + */ + const handleJqueryElem = (target, elem) => { + target.textContent = ''; + if (0 in elem) { + for (let i = 0; i in elem; i++) { + target.appendChild(elem[i].cloneNode(true)); + } + } else { + target.appendChild(elem.cloneNode(true)); + } + }; + + /** + * @param {SweetAlert} instance + * @param {SweetAlertOptions} params + */ + const renderActions = (instance, params) => { + const actions = getActions(); + const loader = getLoader(); + if (!actions || !loader) { + return; + } + + // Actions (buttons) wrapper + if (!params.showConfirmButton && !params.showDenyButton && !params.showCancelButton) { + hide(actions); + } else { + show(actions); + } + + // Custom class + applyCustomClass(actions, params, 'actions'); + + // Render all the buttons + renderButtons(actions, loader, params); + + // Loader + setInnerHtml(loader, params.loaderHtml || ''); + applyCustomClass(loader, params, 'loader'); + }; + + /** + * @param {HTMLElement} actions + * @param {HTMLElement} loader + * @param {SweetAlertOptions} params + */ + function renderButtons(actions, loader, params) { + const confirmButton = getConfirmButton(); + const denyButton = getDenyButton(); + const cancelButton = getCancelButton(); + if (!confirmButton || !denyButton || !cancelButton) { + return; + } + + // Render buttons + renderButton(confirmButton, 'confirm', params); + renderButton(denyButton, 'deny', params); + renderButton(cancelButton, 'cancel', params); + handleButtonsStyling(confirmButton, denyButton, cancelButton, params); + if (params.reverseButtons) { + if (params.toast) { + actions.insertBefore(cancelButton, confirmButton); + actions.insertBefore(denyButton, confirmButton); + } else { + actions.insertBefore(cancelButton, loader); + actions.insertBefore(denyButton, loader); + actions.insertBefore(confirmButton, loader); + } + } + } + + /** + * @param {HTMLElement} confirmButton + * @param {HTMLElement} denyButton + * @param {HTMLElement} cancelButton + * @param {SweetAlertOptions} params + */ + function handleButtonsStyling(confirmButton, denyButton, cancelButton, params) { + if (!params.buttonsStyling) { + removeClass([confirmButton, denyButton, cancelButton], swalClasses.styled); + return; + } + addClass([confirmButton, denyButton, cancelButton], swalClasses.styled); + + // Apply custom background colors to action buttons + if (params.confirmButtonColor) { + confirmButton.style.setProperty('--swal2-confirm-button-background-color', params.confirmButtonColor); + } + if (params.denyButtonColor) { + denyButton.style.setProperty('--swal2-deny-button-background-color', params.denyButtonColor); + } + if (params.cancelButtonColor) { + cancelButton.style.setProperty('--swal2-cancel-button-background-color', params.cancelButtonColor); + } + + // Apply the outline color to action buttons + applyOutlineColor(confirmButton); + applyOutlineColor(denyButton); + applyOutlineColor(cancelButton); + } + + /** + * @param {HTMLElement} button + */ + function applyOutlineColor(button) { + const buttonStyle = window.getComputedStyle(button); + if (buttonStyle.getPropertyValue('--swal2-action-button-focus-box-shadow')) { + // If the button already has a custom outline color, no need to change it + return; + } + const outlineColor = buttonStyle.backgroundColor.replace(/rgba?\((\d+), (\d+), (\d+).*/, 'rgba($1, $2, $3, 0.5)'); + button.style.setProperty('--swal2-action-button-focus-box-shadow', buttonStyle.getPropertyValue('--swal2-outline').replace(/ rgba\(.*/, ` ${outlineColor}`)); + } + + /** + * @param {HTMLElement} button + * @param {'confirm' | 'deny' | 'cancel'} buttonType + * @param {SweetAlertOptions} params + */ + function renderButton(button, buttonType, params) { + const buttonName = /** @type {'Confirm' | 'Deny' | 'Cancel'} */capitalizeFirstLetter(buttonType); + toggle(button, params[`show${buttonName}Button`], 'inline-block'); + setInnerHtml(button, params[`${buttonType}ButtonText`] || ''); // Set caption text + button.setAttribute('aria-label', params[`${buttonType}ButtonAriaLabel`] || ''); // ARIA label + + // Add buttons custom classes + button.className = swalClasses[buttonType]; + applyCustomClass(button, params, `${buttonType}Button`); + } + + /** + * @param {SweetAlert} instance + * @param {SweetAlertOptions} params + */ + const renderCloseButton = (instance, params) => { + const closeButton = getCloseButton(); + if (!closeButton) { + return; + } + setInnerHtml(closeButton, params.closeButtonHtml || ''); + + // Custom class + applyCustomClass(closeButton, params, 'closeButton'); + toggle(closeButton, params.showCloseButton); + closeButton.setAttribute('aria-label', params.closeButtonAriaLabel || ''); + }; + + /** + * @param {SweetAlert} instance + * @param {SweetAlertOptions} params + */ + const renderContainer = (instance, params) => { + const container = getContainer(); + if (!container) { + return; + } + handleBackdropParam(container, params.backdrop); + handlePositionParam(container, params.position); + handleGrowParam(container, params.grow); + + // Custom class + applyCustomClass(container, params, 'container'); + }; + + /** + * @param {HTMLElement} container + * @param {SweetAlertOptions['backdrop']} backdrop + */ + function handleBackdropParam(container, backdrop) { + if (typeof backdrop === 'string') { + container.style.background = backdrop; + } else if (!backdrop) { + addClass([document.documentElement, document.body], swalClasses['no-backdrop']); + } + } + + /** + * @param {HTMLElement} container + * @param {SweetAlertOptions['position']} position + */ + function handlePositionParam(container, position) { + if (!position) { + return; + } + if (position in swalClasses) { + addClass(container, swalClasses[position]); + } else { + warn('The "position" parameter is not valid, defaulting to "center"'); + addClass(container, swalClasses.center); + } + } + + /** + * @param {HTMLElement} container + * @param {SweetAlertOptions['grow']} grow + */ + function handleGrowParam(container, grow) { + if (!grow) { + return; + } + addClass(container, swalClasses[`grow-${grow}`]); + } + + /** + * This module contains `WeakMap`s for each effectively-"private property" that a `Swal` has. + * For example, to set the private property "foo" of `this` to "bar", you can `privateProps.foo.set(this, 'bar')` + * This is the approach that Babel will probably take to implement private methods/fields + * https://github.com/tc39/proposal-private-methods + * https://github.com/babel/babel/pull/7555 + * Once we have the changes from that PR in Babel, and our core class fits reasonable in *one module* + * then we can use that language feature. + */ + + var privateProps = { + innerParams: new WeakMap(), + domCache: new WeakMap() + }; + + /// + + + /** @type {InputClass[]} */ + const inputClasses = ['input', 'file', 'range', 'select', 'radio', 'checkbox', 'textarea']; + + /** + * @param {SweetAlert} instance + * @param {SweetAlertOptions} params + */ + const renderInput = (instance, params) => { + const popup = getPopup(); + if (!popup) { + return; + } + const innerParams = privateProps.innerParams.get(instance); + const rerender = !innerParams || params.input !== innerParams.input; + inputClasses.forEach(inputClass => { + const inputContainer = getDirectChildByClass(popup, swalClasses[inputClass]); + if (!inputContainer) { + return; + } + + // set attributes + setAttributes(inputClass, params.inputAttributes); + + // set class + inputContainer.className = swalClasses[inputClass]; + if (rerender) { + hide(inputContainer); + } + }); + if (params.input) { + if (rerender) { + showInput(params); + } + // set custom class + setCustomClass(params); + } + }; + + /** + * @param {SweetAlertOptions} params + */ + const showInput = params => { + if (!params.input) { + return; + } + if (!renderInputType[params.input]) { + error(`Unexpected type of input! Expected ${Object.keys(renderInputType).join(' | ')}, got "${params.input}"`); + return; + } + const inputContainer = getInputContainer(params.input); + if (!inputContainer) { + return; + } + const input = renderInputType[params.input](inputContainer, params); + show(inputContainer); + + // input autofocus + if (params.inputAutoFocus) { + setTimeout(() => { + focusInput(input); + }); + } + }; + + /** + * @param {HTMLInputElement} input + */ + const removeAttributes = input => { + for (let i = 0; i < input.attributes.length; i++) { + const attrName = input.attributes[i].name; + if (!['id', 'type', 'value', 'style'].includes(attrName)) { + input.removeAttribute(attrName); + } + } + }; + + /** + * @param {InputClass} inputClass + * @param {SweetAlertOptions['inputAttributes']} inputAttributes + */ + const setAttributes = (inputClass, inputAttributes) => { + const popup = getPopup(); + if (!popup) { + return; + } + const input = getInput$1(popup, inputClass); + if (!input) { + return; + } + removeAttributes(input); + for (const attr in inputAttributes) { + input.setAttribute(attr, inputAttributes[attr]); + } + }; + + /** + * @param {SweetAlertOptions} params + */ + const setCustomClass = params => { + if (!params.input) { + return; + } + const inputContainer = getInputContainer(params.input); + if (inputContainer) { + applyCustomClass(inputContainer, params, 'input'); + } + }; + + /** + * @param {HTMLInputElement | HTMLTextAreaElement} input + * @param {SweetAlertOptions} params + */ + const setInputPlaceholder = (input, params) => { + if (!input.placeholder && params.inputPlaceholder) { + input.placeholder = params.inputPlaceholder; + } + }; + + /** + * @param {Input} input + * @param {Input} prependTo + * @param {SweetAlertOptions} params + */ + const setInputLabel = (input, prependTo, params) => { + if (params.inputLabel) { + const label = document.createElement('label'); + const labelClass = swalClasses['input-label']; + label.setAttribute('for', input.id); + label.className = labelClass; + if (typeof params.customClass === 'object') { + addClass(label, params.customClass.inputLabel); + } + label.innerText = params.inputLabel; + prependTo.insertAdjacentElement('beforebegin', label); + } + }; + + /** + * @param {SweetAlertInput} inputType + * @returns {HTMLElement | undefined} + */ + const getInputContainer = inputType => { + const popup = getPopup(); + if (!popup) { + return; + } + return getDirectChildByClass(popup, swalClasses[(/** @type {SwalClass} */inputType)] || swalClasses.input); + }; + + /** + * @param {HTMLInputElement | HTMLOutputElement | HTMLTextAreaElement} input + * @param {SweetAlertOptions['inputValue']} inputValue + */ + const checkAndSetInputValue = (input, inputValue) => { + if (['string', 'number'].includes(typeof inputValue)) { + input.value = `${inputValue}`; + } else if (!isPromise(inputValue)) { + warn(`Unexpected type of inputValue! Expected "string", "number" or "Promise", got "${typeof inputValue}"`); + } + }; + + /** @type {Record Input>} */ + const renderInputType = {}; + + /** + * @param {Input | HTMLElement} input + * @param {SweetAlertOptions} params + * @returns {Input} + */ + renderInputType.text = renderInputType.email = renderInputType.password = renderInputType.number = renderInputType.tel = renderInputType.url = renderInputType.search = renderInputType.date = renderInputType['datetime-local'] = renderInputType.time = renderInputType.week = renderInputType.month = /** @type {(input: Input | HTMLElement, params: SweetAlertOptions) => Input} */ + (input, params) => { + const inputElement = /** @type {HTMLInputElement} */input; + checkAndSetInputValue(inputElement, params.inputValue); + setInputLabel(inputElement, inputElement, params); + setInputPlaceholder(inputElement, params); + inputElement.type = /** @type {string} */params.input; + return inputElement; + }; + + /** + * @param {Input | HTMLElement} input + * @param {SweetAlertOptions} params + * @returns {Input} + */ + renderInputType.file = (input, params) => { + const inputElement = /** @type {HTMLInputElement} */input; + setInputLabel(inputElement, inputElement, params); + setInputPlaceholder(inputElement, params); + return inputElement; + }; + + /** + * @param {Input | HTMLElement} range + * @param {SweetAlertOptions} params + * @returns {Input} + */ + renderInputType.range = (range, params) => { + const rangeContainer = /** @type {HTMLElement} */range; + const rangeInput = rangeContainer.querySelector('input'); + const rangeOutput = rangeContainer.querySelector('output'); + if (rangeInput) { + checkAndSetInputValue(rangeInput, params.inputValue); + rangeInput.type = /** @type {string} */params.input; + setInputLabel(rangeInput, /** @type {Input} */range, params); + } + if (rangeOutput) { + checkAndSetInputValue(rangeOutput, params.inputValue); + } + return /** @type {Input} */range; + }; + + /** + * @param {Input | HTMLElement} select + * @param {SweetAlertOptions} params + * @returns {Input} + */ + renderInputType.select = (select, params) => { + const selectElement = /** @type {HTMLSelectElement} */select; + selectElement.textContent = ''; + if (params.inputPlaceholder) { + const placeholder = document.createElement('option'); + setInnerHtml(placeholder, params.inputPlaceholder); + placeholder.value = ''; + placeholder.disabled = true; + placeholder.selected = true; + selectElement.appendChild(placeholder); + } + setInputLabel(selectElement, selectElement, params); + return selectElement; + }; + + /** + * @param {Input | HTMLElement} radio + * @returns {Input} + */ + renderInputType.radio = radio => { + const radioElement = /** @type {HTMLElement} */radio; + radioElement.textContent = ''; + return /** @type {Input} */radio; + }; + + /** + * @param {Input | HTMLElement} checkboxContainer + * @param {SweetAlertOptions} params + * @returns {Input} + */ + renderInputType.checkbox = (checkboxContainer, params) => { + const popup = getPopup(); + if (!popup) { + throw new Error('Popup not found'); + } + const checkbox = getInput$1(popup, 'checkbox'); + if (!checkbox) { + throw new Error('Checkbox input not found'); + } + checkbox.value = '1'; + checkbox.checked = Boolean(params.inputValue); + const containerElement = /** @type {HTMLElement} */checkboxContainer; + const label = containerElement.querySelector('span'); + if (label) { + const placeholderOrLabel = params.inputPlaceholder || params.inputLabel; + if (placeholderOrLabel) { + setInnerHtml(label, placeholderOrLabel); + } + } + return checkbox; + }; + + /** + * @param {Input | HTMLElement} textarea + * @param {SweetAlertOptions} params + * @returns {Input} + */ + renderInputType.textarea = (textarea, params) => { + const textareaElement = /** @type {HTMLTextAreaElement} */textarea; + checkAndSetInputValue(textareaElement, params.inputValue); + setInputPlaceholder(textareaElement, params); + setInputLabel(textareaElement, textareaElement, params); + + /** + * @param {HTMLElement} el + * @returns {number} + */ + const getMargin = el => parseInt(window.getComputedStyle(el).marginLeft) + parseInt(window.getComputedStyle(el).marginRight); + + // https://github.com/sweetalert2/sweetalert2/issues/2291 + setTimeout(() => { + // https://github.com/sweetalert2/sweetalert2/issues/1699 + if ('MutationObserver' in window) { + const popup = getPopup(); + if (!popup) { + return; + } + const initialPopupWidth = parseInt(window.getComputedStyle(popup).width); + const textareaResizeHandler = () => { + // check if texarea is still in document (i.e. popup wasn't closed in the meantime) + if (!document.body.contains(textareaElement)) { + return; + } + const textareaWidth = textareaElement.offsetWidth + getMargin(textareaElement); + const popupElement = getPopup(); + if (popupElement) { + if (textareaWidth > initialPopupWidth) { + popupElement.style.width = `${textareaWidth}px`; + } else { + applyNumericalStyle(popupElement, 'width', params.width); + } + } + }; + new MutationObserver(textareaResizeHandler).observe(textareaElement, { + attributes: true, + attributeFilter: ['style'] + }); + } + }); + return textareaElement; + }; + + /** + * @param {SweetAlert} instance + * @param {SweetAlertOptions} params + */ + const renderContent = (instance, params) => { + const htmlContainer = getHtmlContainer(); + if (!htmlContainer) { + return; + } + showWhenInnerHtmlPresent(htmlContainer); + applyCustomClass(htmlContainer, params, 'htmlContainer'); + + // Content as HTML + if (params.html) { + parseHtmlToContainer(params.html, htmlContainer); + show(htmlContainer, 'block'); + } + + // Content as plain text + else if (params.text) { + htmlContainer.textContent = params.text; + show(htmlContainer, 'block'); + } + + // No content + else { + hide(htmlContainer); + } + renderInput(instance, params); + }; + + /** + * @param {SweetAlert} instance + * @param {SweetAlertOptions} params + */ + const renderFooter = (instance, params) => { + const footer = getFooter(); + if (!footer) { + return; + } + showWhenInnerHtmlPresent(footer); + toggle(footer, Boolean(params.footer), 'block'); + if (params.footer) { + parseHtmlToContainer(params.footer, footer); + } + + // Custom class + applyCustomClass(footer, params, 'footer'); + }; + + /** + * @param {SweetAlert} instance + * @param {SweetAlertOptions} params + */ + const renderIcon = (instance, params) => { + const innerParams = privateProps.innerParams.get(instance); + const icon = getIcon(); + if (!icon) { + return; + } + + // if the given icon already rendered, apply the styling without re-rendering the icon + if (innerParams && params.icon === innerParams.icon) { + // Custom or default content + setContent(icon, params); + applyStyles(icon, params); + return; + } + if (!params.icon && !params.iconHtml) { + hide(icon); + return; + } + if (params.icon && Object.keys(iconTypes).indexOf(params.icon) === -1) { + error(`Unknown icon! Expected "success", "error", "warning", "info" or "question", got "${params.icon}"`); + hide(icon); + return; + } + show(icon); + + // Custom or default content + setContent(icon, params); + applyStyles(icon, params); + + // Animate icon + addClass(icon, params.showClass && params.showClass.icon); + + // Re-adjust the success icon on system theme change + const colorSchemeQueryList = window.matchMedia('(prefers-color-scheme: dark)'); + colorSchemeQueryList.addEventListener('change', adjustSuccessIconBackgroundColor); + }; + + /** + * @param {HTMLElement} icon + * @param {SweetAlertOptions} params + */ + const applyStyles = (icon, params) => { + for (const [iconType, iconClassName] of Object.entries(iconTypes)) { + if (params.icon !== iconType) { + removeClass(icon, iconClassName); + } + } + addClass(icon, params.icon && iconTypes[params.icon]); + + // Icon color + setColor(icon, params); + + // Success icon background color + adjustSuccessIconBackgroundColor(); + + // Custom class + applyCustomClass(icon, params, 'icon'); + }; + + // Adjust success icon background color to match the popup background color + const adjustSuccessIconBackgroundColor = () => { + const popup = getPopup(); + if (!popup) { + return; + } + const popupBackgroundColor = window.getComputedStyle(popup).getPropertyValue('background-color'); + /** @type {NodeListOf} */ + const successIconParts = popup.querySelectorAll('[class^=swal2-success-circular-line], .swal2-success-fix'); + for (let i = 0; i < successIconParts.length; i++) { + successIconParts[i].style.backgroundColor = popupBackgroundColor; + } + }; + + /** + * + * @param {SweetAlertOptions} params + * @returns {string} + */ + const successIconHtml = params => ` + ${params.animation ? '
      ' : ''} + +
      + ${params.animation ? '
      ' : ''} + ${params.animation ? '
      ' : ''} +`; + const errorIconHtml = ` + + + + +`; + + /** + * @param {HTMLElement} icon + * @param {SweetAlertOptions} params + */ + const setContent = (icon, params) => { + if (!params.icon && !params.iconHtml) { + return; + } + let oldContent = icon.innerHTML; + let newContent = ''; + if (params.iconHtml) { + newContent = iconContent(params.iconHtml); + } else if (params.icon === 'success') { + newContent = successIconHtml(params); + oldContent = oldContent.replace(/ style=".*?"/g, ''); // undo adjustSuccessIconBackgroundColor() + } else if (params.icon === 'error') { + newContent = errorIconHtml; + } else if (params.icon) { + const defaultIconHtml = { + question: '?', + warning: '!', + info: 'i' + }; + newContent = iconContent(defaultIconHtml[params.icon]); + } + if (oldContent.trim() !== newContent.trim()) { + setInnerHtml(icon, newContent); + } + }; + + /** + * @param {HTMLElement} icon + * @param {SweetAlertOptions} params + */ + const setColor = (icon, params) => { + if (!params.iconColor) { + return; + } + icon.style.color = params.iconColor; + icon.style.borderColor = params.iconColor; + for (const sel of ['.swal2-success-line-tip', '.swal2-success-line-long', '.swal2-x-mark-line-left', '.swal2-x-mark-line-right']) { + setStyle(icon, sel, 'background-color', params.iconColor); + } + setStyle(icon, '.swal2-success-ring', 'border-color', params.iconColor); + }; + + /** + * @param {string} content + * @returns {string} + */ + const iconContent = content => `
      ${content}
      `; + + /** + * @param {SweetAlert} instance + * @param {SweetAlertOptions} params + */ + const renderImage = (instance, params) => { + const image = getImage(); + if (!image) { + return; + } + if (!params.imageUrl) { + hide(image); + return; + } + show(image, ''); + + // Src, alt + image.setAttribute('src', params.imageUrl); + image.setAttribute('alt', params.imageAlt || ''); + + // Width, height + applyNumericalStyle(image, 'width', params.imageWidth); + applyNumericalStyle(image, 'height', params.imageHeight); + + // Class + image.className = swalClasses.image; + applyCustomClass(image, params, 'image'); + }; + + let dragging = false; + let mousedownX = 0; + let mousedownY = 0; + let initialX = 0; + let initialY = 0; + + /** + * @param {HTMLElement} popup + */ + const addDraggableListeners = popup => { + popup.addEventListener('mousedown', down); + document.body.addEventListener('mousemove', move); + popup.addEventListener('mouseup', up); + popup.addEventListener('touchstart', down); + document.body.addEventListener('touchmove', move); + popup.addEventListener('touchend', up); + }; + + /** + * @param {HTMLElement} popup + */ + const removeDraggableListeners = popup => { + popup.removeEventListener('mousedown', down); + document.body.removeEventListener('mousemove', move); + popup.removeEventListener('mouseup', up); + popup.removeEventListener('touchstart', down); + document.body.removeEventListener('touchmove', move); + popup.removeEventListener('touchend', up); + }; + + /** + * @param {MouseEvent | TouchEvent} event + */ + const down = event => { + const popup = getPopup(); + if (!popup) { + return; + } + const icon = getIcon(); + if (event.target === popup || icon && icon.contains(/** @type {HTMLElement} */event.target)) { + dragging = true; + const clientXY = getClientXY(event); + mousedownX = clientXY.clientX; + mousedownY = clientXY.clientY; + initialX = parseInt(popup.style.insetInlineStart) || 0; + initialY = parseInt(popup.style.insetBlockStart) || 0; + addClass(popup, 'swal2-dragging'); + } + }; + + /** + * @param {MouseEvent | TouchEvent} event + */ + const move = event => { + const popup = getPopup(); + if (!popup) { + return; + } + if (dragging) { + let { + clientX, + clientY + } = getClientXY(event); + const deltaX = clientX - mousedownX; + // In RTL mode, negate the horizontal delta since insetInlineStart refers to the right edge + popup.style.insetInlineStart = `${initialX + (globalState.isRTL ? -deltaX : deltaX)}px`; + popup.style.insetBlockStart = `${initialY + (clientY - mousedownY)}px`; + } + }; + const up = () => { + const popup = getPopup(); + dragging = false; + removeClass(popup, 'swal2-dragging'); + }; + + /** + * @param {MouseEvent | TouchEvent} event + * @returns {{ clientX: number, clientY: number }} + */ + const getClientXY = event => { + let clientX = 0, + clientY = 0; + if (event.type.startsWith('mouse')) { + clientX = /** @type {MouseEvent} */event.clientX; + clientY = /** @type {MouseEvent} */event.clientY; + } else if (event.type.startsWith('touch')) { + clientX = /** @type {TouchEvent} */event.touches[0].clientX; + clientY = /** @type {TouchEvent} */event.touches[0].clientY; + } + return { + clientX, + clientY + }; + }; + + /** + * @param {SweetAlert} instance + * @param {SweetAlertOptions} params + */ + const renderPopup = (instance, params) => { + const container = getContainer(); + const popup = getPopup(); + if (!container || !popup) { + return; + } + + // Width + // https://github.com/sweetalert2/sweetalert2/issues/2170 + if (params.toast) { + applyNumericalStyle(container, 'width', params.width); + popup.style.width = '100%'; + const loader = getLoader(); + if (loader) { + popup.insertBefore(loader, getIcon()); + } + } else { + applyNumericalStyle(popup, 'width', params.width); + } + + // Padding + applyNumericalStyle(popup, 'padding', params.padding); + + // Color + if (params.color) { + popup.style.color = params.color; + } + + // Background + if (params.background) { + popup.style.background = params.background; + } + hide(getValidationMessage()); + + // Classes + addClasses$1(popup, params); + if (params.draggable && !params.toast) { + addClass(popup, swalClasses.draggable); + addDraggableListeners(popup); + } else { + removeClass(popup, swalClasses.draggable); + removeDraggableListeners(popup); + } + }; + + /** + * @param {HTMLElement} popup + * @param {SweetAlertOptions} params + */ + const addClasses$1 = (popup, params) => { + const showClass = params.showClass || {}; + // Default Class + showClass when updating Swal.update({}) + popup.className = `${swalClasses.popup} ${isVisible$1(popup) ? showClass.popup : ''}`; + if (params.toast) { + addClass([document.documentElement, document.body], swalClasses['toast-shown']); + addClass(popup, swalClasses.toast); + } else { + addClass(popup, swalClasses.modal); + } + + // Custom class + applyCustomClass(popup, params, 'popup'); + // TODO: remove in the next major + if (typeof params.customClass === 'string') { + addClass(popup, params.customClass); + } + + // Icon class (#1842) + if (params.icon) { + addClass(popup, swalClasses[`icon-${params.icon}`]); + } + }; + + /** + * @param {SweetAlert} instance + * @param {SweetAlertOptions} params + */ + const renderProgressSteps = (instance, params) => { + const progressStepsContainer = getProgressSteps(); + if (!progressStepsContainer) { + return; + } + const { + progressSteps, + currentProgressStep + } = params; + if (!progressSteps || progressSteps.length === 0 || currentProgressStep === undefined) { + hide(progressStepsContainer); + return; + } + show(progressStepsContainer); + progressStepsContainer.textContent = ''; + if (currentProgressStep >= progressSteps.length) { + warn('Invalid currentProgressStep parameter, it should be less than progressSteps.length ' + '(currentProgressStep like JS arrays starts from 0)'); + } + progressSteps.forEach((step, index) => { + const stepEl = createStepElement(step); + progressStepsContainer.appendChild(stepEl); + if (index === currentProgressStep) { + addClass(stepEl, swalClasses['active-progress-step']); + } + if (index !== progressSteps.length - 1) { + const lineEl = createLineElement(params); + progressStepsContainer.appendChild(lineEl); + } + }); + }; + + /** + * @param {string} step + * @returns {HTMLLIElement} + */ + const createStepElement = step => { + const stepEl = document.createElement('li'); + addClass(stepEl, swalClasses['progress-step']); + setInnerHtml(stepEl, step); + return stepEl; + }; + + /** + * @param {SweetAlertOptions} params + * @returns {HTMLLIElement} + */ + const createLineElement = params => { + const lineEl = document.createElement('li'); + addClass(lineEl, swalClasses['progress-step-line']); + if (params.progressStepsDistance) { + applyNumericalStyle(lineEl, 'width', params.progressStepsDistance); + } + return lineEl; + }; + + /** + * @param {SweetAlert} instance + * @param {SweetAlertOptions} params + */ + const renderTitle = (instance, params) => { + const title = getTitle(); + if (!title) { + return; + } + showWhenInnerHtmlPresent(title); + toggle(title, Boolean(params.title || params.titleText), 'block'); + if (params.title) { + parseHtmlToContainer(params.title, title); + } + if (params.titleText) { + title.innerText = params.titleText; + } + + // Custom class + applyCustomClass(title, params, 'title'); + }; + + /** + * @param {SweetAlert} instance + * @param {SweetAlertOptions} params + */ + const render = (instance, params) => { + var _globalState$eventEmi; + renderPopup(instance, params); + renderContainer(instance, params); + renderProgressSteps(instance, params); + renderIcon(instance, params); + renderImage(instance, params); + renderTitle(instance, params); + renderCloseButton(instance, params); + renderContent(instance, params); + renderActions(instance, params); + renderFooter(instance, params); + const popup = getPopup(); + if (typeof params.didRender === 'function' && popup) { + params.didRender(popup); + } + (_globalState$eventEmi = globalState.eventEmitter) === null || _globalState$eventEmi === void 0 || _globalState$eventEmi.emit('didRender', popup); + }; + + /* + * Global function to determine if SweetAlert2 popup is shown + */ + const isVisible = () => { + return isVisible$1(getPopup()); + }; + + /* + * Global function to click 'Confirm' button + */ + const clickConfirm = () => { + var _dom$getConfirmButton; + return (_dom$getConfirmButton = getConfirmButton()) === null || _dom$getConfirmButton === void 0 ? void 0 : _dom$getConfirmButton.click(); + }; + + /* + * Global function to click 'Deny' button + */ + const clickDeny = () => { + var _dom$getDenyButton; + return (_dom$getDenyButton = getDenyButton()) === null || _dom$getDenyButton === void 0 ? void 0 : _dom$getDenyButton.click(); + }; + + /* + * Global function to click 'Cancel' button + */ + const clickCancel = () => { + var _dom$getCancelButton; + return (_dom$getCancelButton = getCancelButton()) === null || _dom$getCancelButton === void 0 ? void 0 : _dom$getCancelButton.click(); + }; + + /** @type {Record} */ + const DismissReason = Object.freeze({ + cancel: 'cancel', + backdrop: 'backdrop', + close: 'close', + esc: 'esc', + timer: 'timer' + }); + + /** + * @param {GlobalState} globalState + */ + const removeKeydownHandler = globalState => { + if (globalState.keydownTarget && globalState.keydownHandlerAdded && globalState.keydownHandler) { + const handler = /** @type {EventListenerOrEventListenerObject} */ /** @type {unknown} */globalState.keydownHandler; + globalState.keydownTarget.removeEventListener('keydown', handler, { + capture: globalState.keydownListenerCapture + }); + globalState.keydownHandlerAdded = false; + } + }; + + /** + * @param {GlobalState} globalState + * @param {SweetAlertOptions} innerParams + * @param {(dismiss: DismissReason) => void} dismissWith + */ + const addKeydownHandler = (globalState, innerParams, dismissWith) => { + removeKeydownHandler(globalState); + if (!innerParams.toast) { + /** @type {(this: HTMLElement, event: KeyboardEvent) => void} */ + const handler = e => keydownHandler(innerParams, e, dismissWith); + globalState.keydownHandler = handler; + const target = innerParams.keydownListenerCapture ? window : getPopup(); + if (target) { + globalState.keydownTarget = target; + globalState.keydownListenerCapture = innerParams.keydownListenerCapture; + const eventHandler = /** @type {EventListenerOrEventListenerObject} */ /** @type {unknown} */handler; + globalState.keydownTarget.addEventListener('keydown', eventHandler, { + capture: globalState.keydownListenerCapture + }); + globalState.keydownHandlerAdded = true; + } + } + }; + + /** + * @param {number} index + * @param {number} increment + */ + const setFocus = (index, increment) => { + var _dom$getPopup; + const focusableElements = getFocusableElements(); + // search for visible elements and select the next possible match + if (focusableElements.length) { + index = index + increment; + + // shift + tab when .swal2-popup is focused + if (index === -2) { + index = focusableElements.length - 1; + } + + // rollover to first item + if (index === focusableElements.length) { + index = 0; + + // go to last item + } else if (index === -1) { + index = focusableElements.length - 1; + } + focusableElements[index].focus(); + return; + } + // no visible focusable elements, focus the popup + (_dom$getPopup = getPopup()) === null || _dom$getPopup === void 0 || _dom$getPopup.focus(); + }; + const arrowKeysNextButton = ['ArrowRight', 'ArrowDown']; + const arrowKeysPreviousButton = ['ArrowLeft', 'ArrowUp']; + + /** + * @param {SweetAlertOptions} innerParams + * @param {KeyboardEvent} event + * @param {(dismiss: DismissReason) => void} dismissWith + */ + const keydownHandler = (innerParams, event, dismissWith) => { + if (!innerParams) { + return; // This instance has already been destroyed + } + + // Ignore keydown during IME composition + // https://developer.mozilla.org/en-US/docs/Web/API/Document/keydown_event#ignoring_keydown_during_ime_composition + // https://github.com/sweetalert2/sweetalert2/issues/720 + // https://github.com/sweetalert2/sweetalert2/issues/2406 + if (event.isComposing || event.keyCode === 229) { + return; + } + if (innerParams.stopKeydownPropagation) { + event.stopPropagation(); + } + + // ENTER + if (event.key === 'Enter') { + handleEnter(event, innerParams); + } + + // TAB + else if (event.key === 'Tab') { + handleTab(event); + } + + // ARROWS - switch focus between buttons + else if ([...arrowKeysNextButton, ...arrowKeysPreviousButton].includes(event.key)) { + handleArrows(event.key); + } + + // ESC + else if (event.key === 'Escape') { + handleEsc(event, innerParams, dismissWith); + } + }; + + /** + * @param {KeyboardEvent} event + * @param {SweetAlertOptions} innerParams + */ + const handleEnter = (event, innerParams) => { + // https://github.com/sweetalert2/sweetalert2/issues/2386 + if (!callIfFunction(innerParams.allowEnterKey)) { + return; + } + const popup = getPopup(); + if (!popup || !innerParams.input) { + return; + } + const input = getInput$1(popup, innerParams.input); + if (event.target && input && event.target instanceof HTMLElement && event.target.outerHTML === input.outerHTML) { + if (['textarea', 'file'].includes(innerParams.input)) { + return; // do not submit + } + clickConfirm(); + event.preventDefault(); + } + }; + + /** + * @param {KeyboardEvent} event + */ + const handleTab = event => { + const targetElement = event.target; + const focusableElements = getFocusableElements(); + let btnIndex = -1; + for (let i = 0; i < focusableElements.length; i++) { + if (targetElement === focusableElements[i]) { + btnIndex = i; + break; + } + } + + // Cycle to the next button + if (!event.shiftKey) { + setFocus(btnIndex, 1); + } + + // Cycle to the prev button + else { + setFocus(btnIndex, -1); + } + event.stopPropagation(); + event.preventDefault(); + }; + + /** + * @param {string} key + */ + const handleArrows = key => { + const actions = getActions(); + const confirmButton = getConfirmButton(); + const denyButton = getDenyButton(); + const cancelButton = getCancelButton(); + if (!actions || !confirmButton || !denyButton || !cancelButton) { + return; + } + /** @type HTMLElement[] */ + const buttons = [confirmButton, denyButton, cancelButton]; + if (document.activeElement instanceof HTMLElement && !buttons.includes(document.activeElement)) { + return; + } + const sibling = arrowKeysNextButton.includes(key) ? 'nextElementSibling' : 'previousElementSibling'; + let buttonToFocus = document.activeElement; + if (!buttonToFocus) { + return; + } + for (let i = 0; i < actions.children.length; i++) { + buttonToFocus = buttonToFocus[sibling]; + if (!buttonToFocus) { + return; + } + if (buttonToFocus instanceof HTMLButtonElement && isVisible$1(buttonToFocus)) { + break; + } + } + if (buttonToFocus instanceof HTMLButtonElement) { + buttonToFocus.focus(); + } + }; + + /** + * @param {KeyboardEvent} event + * @param {SweetAlertOptions} innerParams + * @param {(dismiss: DismissReason) => void} dismissWith + */ + const handleEsc = (event, innerParams, dismissWith) => { + event.preventDefault(); + if (callIfFunction(innerParams.allowEscapeKey)) { + dismissWith(DismissReason.esc); + } + }; + + /** + * This module contains `WeakMap`s for each effectively-"private property" that a `Swal` has. + * For example, to set the private property "foo" of `this` to "bar", you can `privateProps.foo.set(this, 'bar')` + * This is the approach that Babel will probably take to implement private methods/fields + * https://github.com/tc39/proposal-private-methods + * https://github.com/babel/babel/pull/7555 + * Once we have the changes from that PR in Babel, and our core class fits reasonable in *one module* + * then we can use that language feature. + */ + + var privateMethods = { + swalPromiseResolve: new WeakMap(), + swalPromiseReject: new WeakMap() + }; + + // From https://developer.paciellogroup.com/blog/2018/06/the-current-state-of-modal-dialog-accessibility/ + // Adding aria-hidden="true" to elements outside of the active modal dialog ensures that + // elements not within the active modal dialog will not be surfaced if a user opens a screen + // reader’s list of elements (headings, form controls, landmarks, etc.) in the document. + + const setAriaHidden = () => { + const container = getContainer(); + const bodyChildren = Array.from(document.body.children); + bodyChildren.forEach(el => { + if (el.contains(container)) { + return; + } + if (el.hasAttribute('aria-hidden')) { + el.setAttribute('data-previous-aria-hidden', el.getAttribute('aria-hidden') || ''); + } + el.setAttribute('aria-hidden', 'true'); + }); + }; + const unsetAriaHidden = () => { + const bodyChildren = Array.from(document.body.children); + bodyChildren.forEach(el => { + if (el.hasAttribute('data-previous-aria-hidden')) { + el.setAttribute('aria-hidden', el.getAttribute('data-previous-aria-hidden') || ''); + el.removeAttribute('data-previous-aria-hidden'); + } else { + el.removeAttribute('aria-hidden'); + } + }); + }; + + // @ts-ignore + const isSafariOrIOS = typeof window !== 'undefined' && Boolean(window.GestureEvent); // true for Safari desktop + all iOS browsers https://stackoverflow.com/a/70585394 + + /** + * Fix iOS scrolling + * http://stackoverflow.com/q/39626302 + */ + const iOSfix = () => { + if (isSafariOrIOS && !hasClass(document.body, swalClasses.iosfix)) { + const offset = document.body.scrollTop; + document.body.style.top = `${offset * -1}px`; + addClass(document.body, swalClasses.iosfix); + lockBodyScroll(); + } + }; + + /** + * https://github.com/sweetalert2/sweetalert2/issues/1246 + */ + const lockBodyScroll = () => { + const container = getContainer(); + if (!container) { + return; + } + /** @type {boolean} */ + let preventTouchMove; + /** + * @param {TouchEvent} event + */ + container.ontouchstart = event => { + preventTouchMove = shouldPreventTouchMove(event); + }; + /** + * @param {TouchEvent} event + */ + container.ontouchmove = event => { + if (preventTouchMove) { + event.preventDefault(); + event.stopPropagation(); + } + }; + }; + + /** + * @param {TouchEvent} event + * @returns {boolean} + */ + const shouldPreventTouchMove = event => { + const target = event.target; + const container = getContainer(); + const htmlContainer = getHtmlContainer(); + if (!container || !htmlContainer) { + return false; + } + if (isStylus(event) || isZoom(event)) { + return false; + } + if (target === container) { + return true; + } + if (!isScrollable(container) && target instanceof HTMLElement && !selfOrParentIsScrollable(target, htmlContainer) && + // #2823 + target.tagName !== 'INPUT' && + // #1603 + target.tagName !== 'TEXTAREA' && + // #2266 + !(isScrollable(htmlContainer) && + // #1944 + htmlContainer.contains(target))) { + return true; + } + return false; + }; + + /** + * https://github.com/sweetalert2/sweetalert2/issues/1786 + * + * @param {TouchEvent} event + * @returns {boolean} + */ + const isStylus = event => { + return Boolean(event.touches && event.touches.length && + // @ts-ignore - touchType is not a standard property + event.touches[0].touchType === 'stylus'); + }; + + /** + * https://github.com/sweetalert2/sweetalert2/issues/1891 + * + * @param {TouchEvent} event + * @returns {boolean} + */ + const isZoom = event => { + return event.touches && event.touches.length > 1; + }; + const undoIOSfix = () => { + if (hasClass(document.body, swalClasses.iosfix)) { + const offset = parseInt(document.body.style.top, 10); + removeClass(document.body, swalClasses.iosfix); + document.body.style.top = ''; + document.body.scrollTop = offset * -1; + } + }; + + /** + * Measure scrollbar width for padding body during modal show/hide + * https://github.com/twbs/bootstrap/blob/master/js/src/modal.js + * + * @returns {number} + */ + const measureScrollbar = () => { + const scrollDiv = document.createElement('div'); + scrollDiv.className = swalClasses['scrollbar-measure']; + document.body.appendChild(scrollDiv); + const scrollbarWidth = scrollDiv.getBoundingClientRect().width - scrollDiv.clientWidth; + document.body.removeChild(scrollDiv); + return scrollbarWidth; + }; + + /** + * Remember state in cases where opening and handling a modal will fiddle with it. + * @type {number | null} + */ + let previousBodyPadding = null; + + /** + * @param {string} initialBodyOverflow + */ + const replaceScrollbarWithPadding = initialBodyOverflow => { + // for queues, do not do this more than once + if (previousBodyPadding !== null) { + return; + } + // if the body has overflow + if (document.body.scrollHeight > window.innerHeight || initialBodyOverflow === 'scroll' // https://github.com/sweetalert2/sweetalert2/issues/2663 + ) { + // add padding so the content doesn't shift after removal of scrollbar + previousBodyPadding = parseInt(window.getComputedStyle(document.body).getPropertyValue('padding-right')); + document.body.style.paddingRight = `${previousBodyPadding + measureScrollbar()}px`; + } + }; + const undoReplaceScrollbarWithPadding = () => { + if (previousBodyPadding !== null) { + document.body.style.paddingRight = `${previousBodyPadding}px`; + previousBodyPadding = null; + } + }; + + /** + * @param {SweetAlert} instance + * @param {HTMLElement} container + * @param {boolean} returnFocus + * @param {(() => void) | undefined} didClose + */ + function removePopupAndResetState(instance, container, returnFocus, didClose) { + if (isToast()) { + triggerDidCloseAndDispose(instance, didClose); + } else { + restoreActiveElement(returnFocus).then(() => triggerDidCloseAndDispose(instance, didClose)); + removeKeydownHandler(globalState); + } + + // workaround for https://github.com/sweetalert2/sweetalert2/issues/2088 + // for some reason removing the container in Safari will scroll the document to bottom + if (isSafariOrIOS) { + container.setAttribute('style', 'display:none !important'); + container.removeAttribute('class'); + container.innerHTML = ''; + } else { + container.remove(); + } + if (isModal()) { + undoReplaceScrollbarWithPadding(); + undoIOSfix(); + unsetAriaHidden(); + } + removeBodyClasses(); + } + + /** + * Remove SweetAlert2 classes from body + */ + function removeBodyClasses() { + removeClass([document.documentElement, document.body], [swalClasses.shown, swalClasses['height-auto'], swalClasses['no-backdrop'], swalClasses['toast-shown']]); + } + + /** + * Instance method to close sweetAlert + * + * @param {SweetAlertResult | undefined} resolveValue + * @this {SweetAlert} + */ + function close(resolveValue) { + resolveValue = prepareResolveValue(resolveValue); + const swalPromiseResolve = privateMethods.swalPromiseResolve.get(this); + const didClose = triggerClosePopup(this); + if (this.isAwaitingPromise) { + // A swal awaiting for a promise (after a click on Confirm or Deny) cannot be dismissed anymore #2335 + if (!resolveValue.isDismissed) { + handleAwaitingPromise(this); + swalPromiseResolve(resolveValue); + } + } else if (didClose) { + // Resolve Swal promise + swalPromiseResolve(resolveValue); + } + } + + /** + * @param {SweetAlert} instance + * @returns {boolean} + */ + const triggerClosePopup = instance => { + const popup = getPopup(); + if (!popup) { + return false; + } + const innerParams = privateProps.innerParams.get(instance); + if (!innerParams || hasClass(popup, innerParams.hideClass.popup)) { + return false; + } + removeClass(popup, innerParams.showClass.popup); + addClass(popup, innerParams.hideClass.popup); + const backdrop = getContainer(); + removeClass(backdrop, innerParams.showClass.backdrop); + addClass(backdrop, innerParams.hideClass.backdrop); + handlePopupAnimation(instance, popup, innerParams); + return true; + }; + + /** + * @param {Error | string} error + * @this {SweetAlert} + */ + function rejectPromise(error) { + const rejectPromise = privateMethods.swalPromiseReject.get(this); + handleAwaitingPromise(this); + if (rejectPromise) { + // Reject Swal promise + rejectPromise(error); + } + } + + /** + * @param {SweetAlert} instance + */ + const handleAwaitingPromise = instance => { + if (instance.isAwaitingPromise) { + // @ts-ignore + delete instance.isAwaitingPromise; + // The instance might have been previously partly destroyed, we must resume the destroy process in this case #2335 + if (!privateProps.innerParams.get(instance)) { + instance._destroy(); + } + } + }; + + /** + * @param {SweetAlertResult | undefined} resolveValue + * @returns {SweetAlertResult} + */ + const prepareResolveValue = resolveValue => { + // When user calls Swal.close() + if (typeof resolveValue === 'undefined') { + return { + isConfirmed: false, + isDenied: false, + isDismissed: true + }; + } + return Object.assign({ + isConfirmed: false, + isDenied: false, + isDismissed: false + }, resolveValue); + }; + + /** + * @param {SweetAlert} instance + * @param {HTMLElement} popup + * @param {SweetAlertOptions} innerParams + */ + const handlePopupAnimation = (instance, popup, innerParams) => { + var _globalState$eventEmi; + const container = getContainer(); + // If animation is supported, animate + const animationIsSupported = hasCssAnimation(popup); + if (typeof innerParams.willClose === 'function') { + innerParams.willClose(popup); + } + (_globalState$eventEmi = globalState.eventEmitter) === null || _globalState$eventEmi === void 0 || _globalState$eventEmi.emit('willClose', popup); + if (animationIsSupported && container) { + animatePopup(instance, popup, container, Boolean(innerParams.returnFocus), innerParams.didClose); + } else if (container) { + // Otherwise, remove immediately + removePopupAndResetState(instance, container, Boolean(innerParams.returnFocus), innerParams.didClose); + } + }; + + /** + * @param {SweetAlert} instance + * @param {HTMLElement} popup + * @param {HTMLElement} container + * @param {boolean} returnFocus + * @param {(() => void) | undefined} didClose + */ + const animatePopup = (instance, popup, container, returnFocus, didClose) => { + globalState.swalCloseEventFinishedCallback = removePopupAndResetState.bind(null, instance, container, returnFocus, didClose); + /** + * @param {AnimationEvent | TransitionEvent} e + */ + const swalCloseAnimationFinished = function (e) { + if (e.target === popup) { + var _globalState$swalClos; + (_globalState$swalClos = globalState.swalCloseEventFinishedCallback) === null || _globalState$swalClos === void 0 || _globalState$swalClos.call(globalState); + delete globalState.swalCloseEventFinishedCallback; + popup.removeEventListener('animationend', swalCloseAnimationFinished); + popup.removeEventListener('transitionend', swalCloseAnimationFinished); + } + }; + popup.addEventListener('animationend', swalCloseAnimationFinished); + popup.addEventListener('transitionend', swalCloseAnimationFinished); + }; + + /** + * @param {SweetAlert} instance + * @param {(() => void) | undefined} didClose + */ + const triggerDidCloseAndDispose = (instance, didClose) => { + setTimeout(() => { + var _globalState$eventEmi2; + if (typeof didClose === 'function') { + didClose.bind(instance.params)(); + } + (_globalState$eventEmi2 = globalState.eventEmitter) === null || _globalState$eventEmi2 === void 0 || _globalState$eventEmi2.emit('didClose'); + // instance might have been destroyed already + if (instance._destroy) { + instance._destroy(); + } + }); + }; + + /** + * Shows loader (spinner), this is useful with AJAX requests. + * By default the loader be shown instead of the "Confirm" button. + * + * @param {HTMLButtonElement | null} [buttonToReplace] + */ + const showLoading = buttonToReplace => { + let popup = getPopup(); + if (!popup) { + new Swal(); + } + popup = getPopup(); + if (!popup) { + return; + } + const loader = getLoader(); + if (isToast()) { + hide(getIcon()); + } else { + replaceButton(popup, buttonToReplace); + } + show(loader); + popup.setAttribute('data-loading', 'true'); + popup.setAttribute('aria-busy', 'true'); + popup.focus(); + }; + + /** + * @param {HTMLElement} popup + * @param {HTMLButtonElement | null} [buttonToReplace] + */ + const replaceButton = (popup, buttonToReplace) => { + const actions = getActions(); + const loader = getLoader(); + if (!actions || !loader) { + return; + } + if (!buttonToReplace && isVisible$1(getConfirmButton())) { + buttonToReplace = getConfirmButton(); + } + show(actions); + if (buttonToReplace) { + hide(buttonToReplace); + loader.setAttribute('data-button-to-replace', buttonToReplace.className); + actions.insertBefore(loader, buttonToReplace); + } + addClass([popup, actions], swalClasses.loading); + }; + + /** + * @param {SweetAlert} instance + * @param {SweetAlertOptions} params + */ + const handleInputOptionsAndValue = (instance, params) => { + if (params.input === 'select' || params.input === 'radio') { + handleInputOptions(instance, params); + } else if (['text', 'email', 'number', 'tel', 'textarea'].some(i => i === params.input) && (hasToPromiseFn(params.inputValue) || isPromise(params.inputValue))) { + showLoading(getConfirmButton()); + handleInputValue(instance, params); + } + }; + + /** + * @param {SweetAlert} instance + * @param {SweetAlertOptions} innerParams + * @returns {SweetAlertInputValue} + */ + const getInputValue = (instance, innerParams) => { + const input = instance.getInput(); + if (!input) { + return null; + } + switch (innerParams.input) { + case 'checkbox': + return getCheckboxValue(input); + case 'radio': + return getRadioValue(input); + case 'file': + return getFileValue(input); + default: + return innerParams.inputAutoTrim ? input.value.trim() : input.value; + } + }; + + /** + * @param {HTMLInputElement} input + * @returns {number} + */ + const getCheckboxValue = input => input.checked ? 1 : 0; + + /** + * @param {HTMLInputElement} input + * @returns {string | null} + */ + const getRadioValue = input => input.checked ? input.value : null; + + /** + * @param {HTMLInputElement} input + * @returns {FileList | File | null} + */ + const getFileValue = input => input.files && input.files.length ? input.getAttribute('multiple') !== null ? input.files : input.files[0] : null; + + /** + * @param {SweetAlert} instance + * @param {SweetAlertOptions} params + */ + const handleInputOptions = (instance, params) => { + const popup = getPopup(); + if (!popup) { + return; + } + /** + * @param {*} inputOptions + */ + const processInputOptions = inputOptions => { + if (params.input === 'select') { + populateSelectOptions(popup, formatInputOptions(inputOptions), params); + } else if (params.input === 'radio') { + populateRadioOptions(popup, formatInputOptions(inputOptions), params); + } + }; + if (hasToPromiseFn(params.inputOptions) || isPromise(params.inputOptions)) { + showLoading(getConfirmButton()); + asPromise(params.inputOptions).then(inputOptions => { + instance.hideLoading(); + processInputOptions(inputOptions); + }); + } else if (typeof params.inputOptions === 'object') { + processInputOptions(params.inputOptions); + } else { + error(`Unexpected type of inputOptions! Expected object, Map or Promise, got ${typeof params.inputOptions}`); + } + }; + + /** + * @param {SweetAlert} instance + * @param {SweetAlertOptions} params + */ + const handleInputValue = (instance, params) => { + const input = instance.getInput(); + if (!input) { + return; + } + hide(input); + asPromise(params.inputValue).then(inputValue => { + input.value = params.input === 'number' ? `${parseFloat(inputValue) || 0}` : `${inputValue}`; + show(input); + input.focus(); + instance.hideLoading(); + }).catch(err => { + error(`Error in inputValue promise: ${err}`); + input.value = ''; + show(input); + input.focus(); + instance.hideLoading(); + }); + }; + + /** + * @param {HTMLElement} popup + * @param {InputOptionFlattened[]} inputOptions + * @param {SweetAlertOptions} params + */ + function populateSelectOptions(popup, inputOptions, params) { + const select = getDirectChildByClass(popup, swalClasses.select); + if (!select) { + return; + } + /** + * @param {HTMLElement} parent + * @param {string} optionLabel + * @param {string} optionValue + */ + const renderOption = (parent, optionLabel, optionValue) => { + const option = document.createElement('option'); + option.value = optionValue; + setInnerHtml(option, optionLabel); + option.selected = isSelected(optionValue, params.inputValue); + parent.appendChild(option); + }; + inputOptions.forEach(inputOption => { + const optionValue = inputOption[0]; + const optionLabel = inputOption[1]; + // spec: + // https://www.w3.org/TR/html401/interact/forms.html#h-17.6 + // "...all OPTGROUP elements must be specified directly within a SELECT element (i.e., groups may not be nested)..." + // check whether this is a + if (Array.isArray(optionLabel)) { + // if it is an array, then it is an + const optgroup = document.createElement('optgroup'); + optgroup.label = optionValue; + optgroup.disabled = false; // not configurable for now + select.appendChild(optgroup); + optionLabel.forEach(o => renderOption(optgroup, o[1], o[0])); + } else { + // case of + valueFormatted = formatInputOptions(valueFormatted); + } + result.push([key, valueFormatted]); + }); + } else { + Object.keys(inputOptions).forEach(key => { + let valueFormatted = inputOptions[key]; + if (typeof valueFormatted === 'object') { + // case of + valueFormatted = formatInputOptions(valueFormatted); + } + result.push([key, valueFormatted]); + }); + } + return result; + }; + + /** + * @param {string} optionValue + * @param {SweetAlertInputValue} inputValue + * @returns {boolean} + */ + const isSelected = (optionValue, inputValue) => { + return Boolean(inputValue) && inputValue !== null && inputValue !== undefined && inputValue.toString() === optionValue.toString(); + }; + + /** + * @param {SweetAlert} instance + */ + const handleConfirmButtonClick = instance => { + const innerParams = privateProps.innerParams.get(instance); + instance.disableButtons(); + if (innerParams.input) { + handleConfirmOrDenyWithInput(instance, 'confirm'); + } else { + confirm(instance, true); + } + }; + + /** + * @param {SweetAlert} instance + */ + const handleDenyButtonClick = instance => { + const innerParams = privateProps.innerParams.get(instance); + instance.disableButtons(); + if (innerParams.returnInputValueOnDeny) { + handleConfirmOrDenyWithInput(instance, 'deny'); + } else { + deny(instance, false); + } + }; + + /** + * @param {SweetAlert} instance + * @param {(dismiss: DismissReason) => void} dismissWith + */ + const handleCancelButtonClick = (instance, dismissWith) => { + instance.disableButtons(); + dismissWith(DismissReason.cancel); + }; + + /** + * @param {SweetAlert} instance + * @param {'confirm' | 'deny'} type + */ + const handleConfirmOrDenyWithInput = (instance, type) => { + const innerParams = privateProps.innerParams.get(instance); + if (!innerParams.input) { + error(`The "input" parameter is needed to be set when using returnInputValueOn${capitalizeFirstLetter(type)}`); + return; + } + const input = instance.getInput(); + const inputValue = getInputValue(instance, innerParams); + if (innerParams.inputValidator) { + handleInputValidator(instance, inputValue, type); + } else if (input && !input.checkValidity()) { + instance.enableButtons(); + instance.showValidationMessage(innerParams.validationMessage || input.validationMessage); + } else if (type === 'deny') { + deny(instance, inputValue); + } else { + confirm(instance, inputValue); + } + }; + + /** + * @param {SweetAlert} instance + * @param {SweetAlertInputValue} inputValue + * @param {'confirm' | 'deny'} type + */ + const handleInputValidator = (instance, inputValue, type) => { + const innerParams = privateProps.innerParams.get(instance); + instance.disableInput(); + const validationPromise = Promise.resolve().then(() => asPromise(innerParams.inputValidator(inputValue, innerParams.validationMessage))); + validationPromise.then(validationMessage => { + instance.enableButtons(); + instance.enableInput(); + if (validationMessage) { + instance.showValidationMessage(validationMessage); + } else if (type === 'deny') { + deny(instance, inputValue); + } else { + confirm(instance, inputValue); + } + }); + }; + + /** + * @param {SweetAlert} instance + * @param {*} value + */ + const deny = (instance, value) => { + const innerParams = privateProps.innerParams.get(instance); + if (innerParams.showLoaderOnDeny) { + showLoading(getDenyButton()); + } + if (innerParams.preDeny) { + instance.isAwaitingPromise = true; // Flagging the instance as awaiting a promise so it's own promise's reject/resolve methods doesn't get destroyed until the result from this preDeny's promise is received + const preDenyPromise = Promise.resolve().then(() => asPromise(innerParams.preDeny(value, innerParams.validationMessage))); + preDenyPromise.then(preDenyValue => { + if (preDenyValue === false) { + instance.hideLoading(); + handleAwaitingPromise(instance); + } else { + instance.close(/** @type SweetAlertResult */{ + isDenied: true, + value: typeof preDenyValue === 'undefined' ? value : preDenyValue + }); + } + }).catch(error => rejectWith(instance, error)); + } else { + instance.close(/** @type SweetAlertResult */{ + isDenied: true, + value + }); + } + }; + + /** + * @param {SweetAlert} instance + * @param {*} value + */ + const succeedWith = (instance, value) => { + instance.close(/** @type SweetAlertResult */{ + isConfirmed: true, + value + }); + }; + + /** + * + * @param {SweetAlert} instance + * @param {string} error + */ + const rejectWith = (instance, error) => { + instance.rejectPromise(error); + }; + + /** + * + * @param {SweetAlert} instance + * @param {*} value + */ + const confirm = (instance, value) => { + const innerParams = privateProps.innerParams.get(instance); + if (innerParams.showLoaderOnConfirm) { + showLoading(); + } + if (innerParams.preConfirm) { + instance.resetValidationMessage(); + instance.isAwaitingPromise = true; // Flagging the instance as awaiting a promise so it's own promise's reject/resolve methods doesn't get destroyed until the result from this preConfirm's promise is received + const preConfirmPromise = Promise.resolve().then(() => asPromise(innerParams.preConfirm(value, innerParams.validationMessage))); + preConfirmPromise.then(preConfirmValue => { + if (isVisible$1(getValidationMessage()) || preConfirmValue === false) { + instance.hideLoading(); + handleAwaitingPromise(instance); + } else { + succeedWith(instance, typeof preConfirmValue === 'undefined' ? value : preConfirmValue); + } + }).catch(error => rejectWith(instance, error)); + } else { + succeedWith(instance, value); + } + }; + + /** + * Hides loader and shows back the button which was hidden by .showLoading() + * @this {SweetAlert} + */ + function hideLoading() { + // do nothing if popup is closed + const innerParams = privateProps.innerParams.get(this); + if (!innerParams) { + return; + } + const domCache = privateProps.domCache.get(this); + hide(domCache.loader); + if (isToast()) { + if (innerParams.icon) { + show(getIcon()); + } + } else { + showRelatedButton(domCache); + } + removeClass([domCache.popup, domCache.actions], swalClasses.loading); + domCache.popup.removeAttribute('aria-busy'); + domCache.popup.removeAttribute('data-loading'); + domCache.confirmButton.disabled = false; + domCache.denyButton.disabled = false; + domCache.cancelButton.disabled = false; + } + + /** + * @param {DomCache} domCache + */ + const showRelatedButton = domCache => { + const dataButtonToReplace = domCache.loader.getAttribute('data-button-to-replace'); + const buttonToReplace = dataButtonToReplace ? domCache.popup.getElementsByClassName(dataButtonToReplace) : []; + if (buttonToReplace.length) { + show(/** @type {HTMLElement} */buttonToReplace[0], 'inline-block'); + } else if (allButtonsAreHidden()) { + hide(domCache.actions); + } + }; + + /** + * Gets the input DOM node, this method works with input parameter. + * + * @returns {HTMLInputElement | null} + * @this {SweetAlert} + */ + function getInput() { + const innerParams = privateProps.innerParams.get(this); + const domCache = privateProps.domCache.get(this); + if (!domCache) { + return null; + } + return getInput$1(domCache.popup, innerParams.input); + } + + /** + * @param {SweetAlert} instance + * @param {string[]} buttons + * @param {boolean} disabled + */ + function setButtonsDisabled(instance, buttons, disabled) { + const domCache = privateProps.domCache.get(instance); + buttons.forEach(button => { + domCache[button].disabled = disabled; + }); + } + + /** + * @param {HTMLInputElement | null} input + * @param {boolean} disabled + */ + function setInputDisabled(input, disabled) { + const popup = getPopup(); + if (!popup || !input) { + return; + } + if (input.type === 'radio') { + /** @type {NodeListOf} */ + const radios = popup.querySelectorAll(`[name="${swalClasses.radio}"]`); + for (let i = 0; i < radios.length; i++) { + radios[i].disabled = disabled; + } + } else { + input.disabled = disabled; + } + } + + /** + * Enable all the buttons + * @this {SweetAlert} + */ + function enableButtons() { + setButtonsDisabled(this, ['confirmButton', 'denyButton', 'cancelButton'], false); + } + + /** + * Disable all the buttons + * @this {SweetAlert} + */ + function disableButtons() { + setButtonsDisabled(this, ['confirmButton', 'denyButton', 'cancelButton'], true); + } + + /** + * Enable the input field + * @this {SweetAlert} + */ + function enableInput() { + setInputDisabled(this.getInput(), false); + } + + /** + * Disable the input field + * @this {SweetAlert} + */ + function disableInput() { + setInputDisabled(this.getInput(), true); + } + + /** + * Show block with validation message + * + * @param {string} error + * @this {SweetAlert} + */ + function showValidationMessage(error) { + const domCache = privateProps.domCache.get(this); + const params = privateProps.innerParams.get(this); + setInnerHtml(domCache.validationMessage, error); + domCache.validationMessage.className = swalClasses['validation-message']; + if (params.customClass && params.customClass.validationMessage) { + addClass(domCache.validationMessage, params.customClass.validationMessage); + } + show(domCache.validationMessage); + const input = this.getInput(); + if (input) { + input.setAttribute('aria-invalid', 'true'); + input.setAttribute('aria-describedby', swalClasses['validation-message']); + focusInput(input); + addClass(input, swalClasses.inputerror); + } + } + + /** + * Hide block with validation message + * + * @this {SweetAlert} + */ + function resetValidationMessage() { + const domCache = privateProps.domCache.get(this); + if (domCache.validationMessage) { + hide(domCache.validationMessage); + } + const input = this.getInput(); + if (input) { + input.removeAttribute('aria-invalid'); + input.removeAttribute('aria-describedby'); + removeClass(input, swalClasses.inputerror); + } + } + + const defaultParams = { + title: '', + titleText: '', + text: '', + html: '', + footer: '', + icon: undefined, + iconColor: undefined, + iconHtml: undefined, + template: undefined, + toast: false, + draggable: false, + animation: true, + theme: 'light', + showClass: { + popup: 'swal2-show', + backdrop: 'swal2-backdrop-show', + icon: 'swal2-icon-show' + }, + hideClass: { + popup: 'swal2-hide', + backdrop: 'swal2-backdrop-hide', + icon: 'swal2-icon-hide' + }, + customClass: {}, + target: 'body', + color: undefined, + backdrop: true, + heightAuto: true, + allowOutsideClick: true, + allowEscapeKey: true, + allowEnterKey: true, + stopKeydownPropagation: true, + keydownListenerCapture: false, + showConfirmButton: true, + showDenyButton: false, + showCancelButton: false, + preConfirm: undefined, + preDeny: undefined, + confirmButtonText: 'OK', + confirmButtonAriaLabel: '', + confirmButtonColor: undefined, + denyButtonText: 'No', + denyButtonAriaLabel: '', + denyButtonColor: undefined, + cancelButtonText: 'Cancel', + cancelButtonAriaLabel: '', + cancelButtonColor: undefined, + buttonsStyling: true, + reverseButtons: false, + focusConfirm: true, + focusDeny: false, + focusCancel: false, + returnFocus: true, + showCloseButton: false, + closeButtonHtml: '×', + closeButtonAriaLabel: 'Close this dialog', + loaderHtml: '', + showLoaderOnConfirm: false, + showLoaderOnDeny: false, + imageUrl: undefined, + imageWidth: undefined, + imageHeight: undefined, + imageAlt: '', + timer: undefined, + timerProgressBar: false, + width: undefined, + padding: undefined, + background: undefined, + input: undefined, + inputPlaceholder: '', + inputLabel: '', + inputValue: '', + inputOptions: {}, + inputAutoFocus: true, + inputAutoTrim: true, + inputAttributes: {}, + inputValidator: undefined, + returnInputValueOnDeny: false, + validationMessage: undefined, + grow: false, + position: 'center', + progressSteps: [], + currentProgressStep: undefined, + progressStepsDistance: undefined, + willOpen: undefined, + didOpen: undefined, + didRender: undefined, + willClose: undefined, + didClose: undefined, + didDestroy: undefined, + scrollbarPadding: true, + topLayer: false + }; + const updatableParams = ['allowEscapeKey', 'allowOutsideClick', 'background', 'buttonsStyling', 'cancelButtonAriaLabel', 'cancelButtonColor', 'cancelButtonText', 'closeButtonAriaLabel', 'closeButtonHtml', 'color', 'confirmButtonAriaLabel', 'confirmButtonColor', 'confirmButtonText', 'currentProgressStep', 'customClass', 'denyButtonAriaLabel', 'denyButtonColor', 'denyButtonText', 'didClose', 'didDestroy', 'draggable', 'footer', 'hideClass', 'html', 'icon', 'iconColor', 'iconHtml', 'imageAlt', 'imageHeight', 'imageUrl', 'imageWidth', 'preConfirm', 'preDeny', 'progressSteps', 'returnFocus', 'reverseButtons', 'showCancelButton', 'showCloseButton', 'showConfirmButton', 'showDenyButton', 'text', 'title', 'titleText', 'theme', 'willClose']; + + /** @type {Record} */ + const deprecatedParams = { + allowEnterKey: undefined + }; + const toastIncompatibleParams = ['allowOutsideClick', 'allowEnterKey', 'backdrop', 'draggable', 'focusConfirm', 'focusDeny', 'focusCancel', 'returnFocus', 'heightAuto', 'keydownListenerCapture']; + + /** + * Is valid parameter + * + * @param {string} paramName + * @returns {boolean} + */ + const isValidParameter = paramName => { + return Object.prototype.hasOwnProperty.call(defaultParams, paramName); + }; + + /** + * Is valid parameter for Swal.update() method + * + * @param {string} paramName + * @returns {boolean} + */ + const isUpdatableParameter = paramName => { + return updatableParams.indexOf(paramName) !== -1; + }; + + /** + * Is deprecated parameter + * + * @param {string} paramName + * @returns {string | undefined} + */ + const isDeprecatedParameter = paramName => { + return deprecatedParams[paramName]; + }; + + /** + * @param {string} param + */ + const checkIfParamIsValid = param => { + if (!isValidParameter(param)) { + warn(`Unknown parameter "${param}"`); + } + }; + + /** + * @param {string} param + */ + const checkIfToastParamIsValid = param => { + if (toastIncompatibleParams.includes(param)) { + warn(`The parameter "${param}" is incompatible with toasts`); + } + }; + + /** + * @param {string} param + */ + const checkIfParamIsDeprecated = param => { + const isDeprecated = isDeprecatedParameter(param); + if (isDeprecated) { + warnAboutDeprecation(param, isDeprecated); + } + }; + + /** + * Show relevant warnings for given params + * + * @param {SweetAlertOptions} params + */ + const showWarningsForParams = params => { + if (params.backdrop === false && params.allowOutsideClick) { + warn('"allowOutsideClick" parameter requires `backdrop` parameter to be set to `true`'); + } + if (params.theme && !['light', 'dark', 'auto', 'minimal', 'borderless', 'bootstrap-4', 'bootstrap-4-light', 'bootstrap-4-dark', 'bootstrap-5', 'bootstrap-5-light', 'bootstrap-5-dark', 'material-ui', 'material-ui-light', 'material-ui-dark', 'embed-iframe', 'bulma', 'bulma-light', 'bulma-dark'].includes(params.theme)) { + warn(`Invalid theme "${params.theme}"`); + } + for (const param in params) { + checkIfParamIsValid(param); + if (params.toast) { + checkIfToastParamIsValid(param); + } + checkIfParamIsDeprecated(param); + } + }; + + /** + * Updates popup parameters. + * + * @this {any} + * @param {SweetAlertOptions} params + */ + function update(params) { + const container = getContainer(); + const popup = getPopup(); + const innerParams = privateProps.innerParams.get(this); + if (!popup || hasClass(popup, innerParams.hideClass.popup)) { + warn(`You're trying to update the closed or closing popup, that won't work. Use the update() method in preConfirm parameter or show a new popup.`); + return; + } + const validUpdatableParams = filterValidParams(params); + const updatedParams = Object.assign({}, innerParams, validUpdatableParams); + showWarningsForParams(updatedParams); + if (container) { + container.dataset['swal2Theme'] = updatedParams.theme; + } + render(this, updatedParams); + privateProps.innerParams.set(this, updatedParams); + Object.defineProperties(this, { + params: { + value: Object.assign({}, this.params, params), + writable: false, + enumerable: true + } + }); + } + + /** + * @param {SweetAlertOptions} params + * @returns {SweetAlertOptions} + */ + const filterValidParams = params => { + /** @type {Record} */ + const validUpdatableParams = {}; + Object.keys(params).forEach(param => { + if (isUpdatableParameter(param)) { + const typedParams = /** @type {Record} */params; + validUpdatableParams[param] = typedParams[param]; + } else { + warn(`Invalid parameter to update: ${param}`); + } + }); + return validUpdatableParams; + }; + + /** + * Dispose the current SweetAlert2 instance + * @this {SweetAlert} + */ + function _destroy() { + var _globalState$eventEmi; + const domCache = privateProps.domCache.get(this); + const innerParams = privateProps.innerParams.get(this); + if (!innerParams) { + disposeWeakMaps(this); // The WeakMaps might have been partly destroyed, we must recall it to dispose any remaining WeakMaps #2335 + return; // This instance has already been destroyed + } + + // Check if there is another Swal closing + if (domCache.popup && globalState.swalCloseEventFinishedCallback) { + globalState.swalCloseEventFinishedCallback(); + delete globalState.swalCloseEventFinishedCallback; + } + if (typeof innerParams.didDestroy === 'function') { + innerParams.didDestroy(); + } + (_globalState$eventEmi = globalState.eventEmitter) === null || _globalState$eventEmi === void 0 || _globalState$eventEmi.emit('didDestroy'); + disposeSwal(this); + } + + /** + * @param {SweetAlert} instance + */ + const disposeSwal = instance => { + disposeWeakMaps(instance); + // Unset this.params so GC will dispose it (#1569) + // @ts-ignore + delete instance.params; + // Unset globalState props so GC will dispose globalState (#1569) + delete globalState.keydownHandler; + delete globalState.keydownTarget; + // Unset currentInstance + delete globalState.currentInstance; + }; + + /** + * @param {SweetAlert} instance + */ + const disposeWeakMaps = instance => { + // If the current instance is awaiting a promise result, we keep the privateMethods to call them once the promise result is retrieved #2335 + if (instance.isAwaitingPromise) { + unsetWeakMaps(privateProps, instance); + instance.isAwaitingPromise = true; + } else { + unsetWeakMaps(privateMethods, instance); + unsetWeakMaps(privateProps, instance); + + // @ts-ignore + delete instance.isAwaitingPromise; + // Unset instance methods + // @ts-ignore + delete instance.disableButtons; + // @ts-ignore + delete instance.enableButtons; + // @ts-ignore + delete instance.getInput; + // @ts-ignore + delete instance.disableInput; + // @ts-ignore + delete instance.enableInput; + // @ts-ignore + delete instance.hideLoading; + // @ts-ignore + delete instance.disableLoading; + // @ts-ignore + delete instance.showValidationMessage; + // @ts-ignore + delete instance.resetValidationMessage; + // @ts-ignore + delete instance.close; + // @ts-ignore + delete instance.closePopup; + // @ts-ignore + delete instance.closeModal; + // @ts-ignore + delete instance.closeToast; + // @ts-ignore + delete instance.rejectPromise; + // @ts-ignore + delete instance.update; + // @ts-ignore + delete instance._destroy; + } + }; + + /** + * @param {Record>} obj + * @param {SweetAlert} instance + */ + const unsetWeakMaps = (obj, instance) => { + for (const i in obj) { + obj[i].delete(instance); + } + }; + + var instanceMethods = /*#__PURE__*/Object.freeze({ + __proto__: null, + _destroy: _destroy, + close: close, + closeModal: close, + closePopup: close, + closeToast: close, + disableButtons: disableButtons, + disableInput: disableInput, + disableLoading: hideLoading, + enableButtons: enableButtons, + enableInput: enableInput, + getInput: getInput, + handleAwaitingPromise: handleAwaitingPromise, + hideLoading: hideLoading, + rejectPromise: rejectPromise, + resetValidationMessage: resetValidationMessage, + showValidationMessage: showValidationMessage, + update: update + }); + + /** + * @param {SweetAlertOptions} innerParams + * @param {DomCache} domCache + * @param {(dismiss: DismissReason) => void} dismissWith + */ + const handlePopupClick = (innerParams, domCache, dismissWith) => { + if (innerParams.toast) { + handleToastClick(innerParams, domCache, dismissWith); + } else { + // Ignore click events that had mousedown on the popup but mouseup on the container + // This can happen when the user drags a slider + handleModalMousedown(domCache); + + // Ignore click events that had mousedown on the container but mouseup on the popup + handleContainerMousedown(domCache); + handleModalClick(innerParams, domCache, dismissWith); + } + }; + + /** + * @param {SweetAlertOptions} innerParams + * @param {DomCache} domCache + * @param {(dismiss: DismissReason) => void} dismissWith + */ + const handleToastClick = (innerParams, domCache, dismissWith) => { + // Closing toast by internal click + domCache.popup.onclick = () => { + if (innerParams && (isAnyButtonShown(innerParams) || innerParams.timer || innerParams.input)) { + return; + } + dismissWith(DismissReason.close); + }; + }; + + /** + * @param {SweetAlertOptions} innerParams + * @returns {boolean} + */ + const isAnyButtonShown = innerParams => { + return Boolean(innerParams.showConfirmButton || innerParams.showDenyButton || innerParams.showCancelButton || innerParams.showCloseButton); + }; + let ignoreOutsideClick = false; + + /** + * @param {DomCache} domCache + */ + const handleModalMousedown = domCache => { + domCache.popup.onmousedown = () => { + domCache.container.onmouseup = function (e) { + domCache.container.onmouseup = () => {}; + // We only check if the mouseup target is the container because usually it doesn't + // have any other direct children aside of the popup + if (e.target === domCache.container) { + ignoreOutsideClick = true; + } + }; + }; + }; + + /** + * @param {DomCache} domCache + */ + const handleContainerMousedown = domCache => { + domCache.container.onmousedown = e => { + // prevent the modal text from being selected on double click on the container (allowOutsideClick: false) + if (e.target === domCache.container) { + e.preventDefault(); + } + domCache.popup.onmouseup = function (e) { + domCache.popup.onmouseup = () => {}; + // We also need to check if the mouseup target is a child of the popup + if (e.target === domCache.popup || e.target instanceof HTMLElement && domCache.popup.contains(e.target)) { + ignoreOutsideClick = true; + } + }; + }; + }; + + /** + * @param {SweetAlertOptions} innerParams + * @param {DomCache} domCache + * @param {(dismiss: DismissReason) => void} dismissWith + */ + const handleModalClick = (innerParams, domCache, dismissWith) => { + domCache.container.onclick = e => { + if (ignoreOutsideClick) { + ignoreOutsideClick = false; + return; + } + if (e.target === domCache.container && callIfFunction(innerParams.allowOutsideClick)) { + dismissWith(DismissReason.backdrop); + } + }; + }; + + /** + * @param {unknown} elem + * @returns {boolean} + */ + const isJqueryElement = elem => typeof elem === 'object' && elem !== null && 'jquery' in elem; + + /** + * @param {unknown} elem + * @returns {boolean} + */ + const isElement = elem => elem instanceof Element || isJqueryElement(elem); + + /** + * @param {ReadonlyArray} args + * @returns {SweetAlertOptions} + */ + const argsToParams = args => { + /** @type {Record} */ + const params = {}; + if (typeof args[0] === 'object' && !isElement(args[0])) { + Object.assign(params, args[0]); + } else { + ['title', 'html', 'icon'].forEach((name, index) => { + const arg = args[index]; + if (typeof arg === 'string' || isElement(arg)) { + params[name] = arg; + } else if (arg !== undefined) { + error(`Unexpected type of ${name}! Expected "string" or "Element", got ${typeof arg}`); + } + }); + } + return /** @type {SweetAlertOptions} */params; + }; + + /** + * Main method to create a new SweetAlert2 popup + * + * @this {new (...args: any[]) => any} + * @param {...SweetAlertOptions} args + * @returns {Promise} + */ + function fire(...args) { + return new this(...args); + } + + /** + * Returns an extended version of `Swal` containing `params` as defaults. + * Useful for reusing Swal configuration. + * + * For example: + * + * Before: + * const textPromptOptions = { input: 'text', showCancelButton: true } + * const {value: firstName} = await Swal.fire({ ...textPromptOptions, title: 'What is your first name?' }) + * const {value: lastName} = await Swal.fire({ ...textPromptOptions, title: 'What is your last name?' }) + * + * After: + * const TextPrompt = Swal.mixin({ input: 'text', showCancelButton: true }) + * const {value: firstName} = await TextPrompt('What is your first name?') + * const {value: lastName} = await TextPrompt('What is your last name?') + * + * @param {SweetAlertOptions} mixinParams + * @returns {SweetAlert} + * @this {typeof import('../SweetAlert.js').SweetAlert} + */ + function mixin(mixinParams) { + // @ts-ignore: 'this' refers to the SweetAlert constructor + class MixinSwal extends this { + /** + * @param {any} params + * @param {any} priorityMixinParams + */ + _main(params, priorityMixinParams) { + return super._main(params, Object.assign({}, mixinParams, priorityMixinParams)); + } + } + // @ts-ignore + return MixinSwal; + } + + /** + * If `timer` parameter is set, returns number of milliseconds of timer remained. + * Otherwise, returns undefined. + * + * @returns {number | undefined} + */ + const getTimerLeft = () => { + return globalState.timeout && globalState.timeout.getTimerLeft(); + }; + + /** + * Stop timer. Returns number of milliseconds of timer remained. + * If `timer` parameter isn't set, returns undefined. + * + * @returns {number | undefined} + */ + const stopTimer = () => { + if (globalState.timeout) { + stopTimerProgressBar(); + return globalState.timeout.stop(); + } + }; + + /** + * Resume timer. Returns number of milliseconds of timer remained. + * If `timer` parameter isn't set, returns undefined. + * + * @returns {number | undefined} + */ + const resumeTimer = () => { + if (globalState.timeout) { + const remaining = globalState.timeout.start(); + animateTimerProgressBar(remaining); + return remaining; + } + }; + + /** + * Resume timer. Returns number of milliseconds of timer remained. + * If `timer` parameter isn't set, returns undefined. + * + * @returns {number | undefined} + */ + const toggleTimer = () => { + const timer = globalState.timeout; + return timer && (timer.running ? stopTimer() : resumeTimer()); + }; + + /** + * Increase timer. Returns number of milliseconds of an updated timer. + * If `timer` parameter isn't set, returns undefined. + * + * @param {number} ms + * @returns {number | undefined} + */ + const increaseTimer = ms => { + if (globalState.timeout) { + const remaining = globalState.timeout.increase(ms); + animateTimerProgressBar(remaining, true); + return remaining; + } + }; + + /** + * Check if timer is running. Returns true if timer is running + * or false if timer is paused or stopped. + * If `timer` parameter isn't set, returns undefined + * + * @returns {boolean} + */ + const isTimerRunning = () => { + return Boolean(globalState.timeout && globalState.timeout.isRunning()); + }; + + let bodyClickListenerAdded = false; + /** @type {Record} */ + const clickHandlers = {}; + + /** + * @this {any} + * @param {string} attr + */ + function bindClickHandler(attr = 'data-swal-template') { + clickHandlers[attr] = this; + if (!bodyClickListenerAdded) { + document.body.addEventListener('click', bodyClickListener); + bodyClickListenerAdded = true; + } + } + + /** + * @param {MouseEvent} event + */ + const bodyClickListener = event => { + for (let el = /** @type {any} */event.target; el && el !== document; el = el.parentNode) { + for (const attr in clickHandlers) { + const template = el.getAttribute && el.getAttribute(attr); + if (template) { + clickHandlers[attr].fire({ + template + }); + return; + } + } + } + }; + + // Source: https://gist.github.com/mudge/5830382?permalink_comment_id=2691957#gistcomment-2691957 + + class EventEmitter { + constructor() { + /** @type {Events} */ + this.events = {}; + } + + /** + * @param {string} eventName + * @returns {EventHandlers} + */ + _getHandlersByEventName(eventName) { + if (typeof this.events[eventName] === 'undefined') { + // not Set because we need to keep the FIFO order + // https://github.com/sweetalert2/sweetalert2/pull/2763#discussion_r1748990334 + this.events[eventName] = []; + } + return this.events[eventName]; + } + + /** + * @param {string} eventName + * @param {EventHandler} eventHandler + */ + on(eventName, eventHandler) { + const currentHandlers = this._getHandlersByEventName(eventName); + if (!currentHandlers.includes(eventHandler)) { + currentHandlers.push(eventHandler); + } + } + + /** + * @param {string} eventName + * @param {EventHandler} eventHandler + */ + once(eventName, eventHandler) { + /** + * @param {...any} args + */ + const onceFn = (...args) => { + this.removeListener(eventName, onceFn); + // @ts-ignore + eventHandler.apply(this, args); + }; + this.on(eventName, onceFn); + } + + /** + * @param {string} eventName + * @param {...any} args + */ + emit(eventName, ...args) { + this._getHandlersByEventName(eventName).forEach( + /** + * @param {EventHandler} eventHandler + */ + eventHandler => { + try { + // @ts-ignore + eventHandler.apply(this, args); + } catch (error) { + console.error(error); + } + }); + } + + /** + * @param {string} eventName + * @param {EventHandler} eventHandler + */ + removeListener(eventName, eventHandler) { + const currentHandlers = this._getHandlersByEventName(eventName); + const index = currentHandlers.indexOf(eventHandler); + if (index > -1) { + currentHandlers.splice(index, 1); + } + } + + /** + * @param {string} eventName + */ + removeAllListeners(eventName) { + if (this.events[eventName] !== undefined) { + // https://github.com/sweetalert2/sweetalert2/pull/2763#discussion_r1749239222 + this.events[eventName].length = 0; + } + } + reset() { + this.events = {}; + } + } + + globalState.eventEmitter = new EventEmitter(); + + /** + * @param {string} eventName + * @param {EventHandler} eventHandler + */ + const on = (eventName, eventHandler) => { + if (globalState.eventEmitter) { + globalState.eventEmitter.on(eventName, eventHandler); + } + }; + + /** + * @param {string} eventName + * @param {EventHandler} eventHandler + */ + const once = (eventName, eventHandler) => { + if (globalState.eventEmitter) { + globalState.eventEmitter.once(eventName, eventHandler); + } + }; + + /** + * @param {string} [eventName] + * @param {EventHandler} [eventHandler] + */ + const off = (eventName, eventHandler) => { + if (!globalState.eventEmitter) { + return; + } + + // Remove all handlers for all events + if (!eventName) { + globalState.eventEmitter.reset(); + return; + } + if (eventHandler) { + // Remove a specific handler + globalState.eventEmitter.removeListener(eventName, eventHandler); + } else { + // Remove all handlers for a specific event + globalState.eventEmitter.removeAllListeners(eventName); + } + }; + + var staticMethods = /*#__PURE__*/Object.freeze({ + __proto__: null, + argsToParams: argsToParams, + bindClickHandler: bindClickHandler, + clickCancel: clickCancel, + clickConfirm: clickConfirm, + clickDeny: clickDeny, + enableLoading: showLoading, + fire: fire, + getActions: getActions, + getCancelButton: getCancelButton, + getCloseButton: getCloseButton, + getConfirmButton: getConfirmButton, + getContainer: getContainer, + getDenyButton: getDenyButton, + getFocusableElements: getFocusableElements, + getFooter: getFooter, + getHtmlContainer: getHtmlContainer, + getIcon: getIcon, + getIconContent: getIconContent, + getImage: getImage, + getInputLabel: getInputLabel, + getLoader: getLoader, + getPopup: getPopup, + getProgressSteps: getProgressSteps, + getTimerLeft: getTimerLeft, + getTimerProgressBar: getTimerProgressBar, + getTitle: getTitle, + getValidationMessage: getValidationMessage, + increaseTimer: increaseTimer, + isDeprecatedParameter: isDeprecatedParameter, + isLoading: isLoading, + isTimerRunning: isTimerRunning, + isUpdatableParameter: isUpdatableParameter, + isValidParameter: isValidParameter, + isVisible: isVisible, + mixin: mixin, + off: off, + on: on, + once: once, + resumeTimer: resumeTimer, + showLoading: showLoading, + stopTimer: stopTimer, + toggleTimer: toggleTimer + }); + + class Timer { + /** + * @param {() => void} callback + * @param {number} delay + */ + constructor(callback, delay) { + this.callback = callback; + this.remaining = delay; + this.running = false; + this.start(); + } + + /** + * @returns {number} + */ + start() { + if (!this.running) { + this.running = true; + this.started = new Date(); + this.id = setTimeout(this.callback, this.remaining); + } + return this.remaining; + } + + /** + * @returns {number} + */ + stop() { + if (this.started && this.running) { + this.running = false; + clearTimeout(this.id); + this.remaining -= new Date().getTime() - this.started.getTime(); + } + return this.remaining; + } + + /** + * @param {number} n + * @returns {number} + */ + increase(n) { + const running = this.running; + if (running) { + this.stop(); + } + this.remaining += n; + if (running) { + this.start(); + } + return this.remaining; + } + + /** + * @returns {number} + */ + getTimerLeft() { + if (this.running) { + this.stop(); + this.start(); + } + return this.remaining; + } + + /** + * @returns {boolean} + */ + isRunning() { + return this.running; + } + } + + const swalStringParams = ['swal-title', 'swal-html', 'swal-footer']; + + /** + * @param {SweetAlertOptions} params + * @returns {SweetAlertOptions} + */ + const getTemplateParams = params => { + const template = typeof params.template === 'string' ? (/** @type {HTMLTemplateElement} */document.querySelector(params.template)) : params.template; + if (!template) { + return {}; + } + /** @type {DocumentFragment} */ + const templateContent = template.content; + showWarningsForElements(templateContent); + const result = Object.assign(getSwalParams(templateContent), getSwalFunctionParams(templateContent), getSwalButtons(templateContent), getSwalImage(templateContent), getSwalIcon(templateContent), getSwalInput(templateContent), getSwalStringParams(templateContent, swalStringParams)); + return result; + }; + + /** + * @param {DocumentFragment} templateContent + * @returns {Record} + */ + const getSwalParams = templateContent => { + /** @type {Record} */ + const result = {}; + /** @type {HTMLElement[]} */ + const swalParams = Array.from(templateContent.querySelectorAll('swal-param')); + swalParams.forEach(param => { + showWarningsForAttributes(param, ['name', 'value']); + const paramName = /** @type {keyof SweetAlertOptions} */param.getAttribute('name'); + const value = param.getAttribute('value'); + if (!paramName || !value) { + return; + } + if (paramName in defaultParams && typeof defaultParams[(/** @type {keyof typeof defaultParams} */paramName)] === 'boolean') { + result[paramName] = value !== 'false'; + } else if (paramName in defaultParams && typeof defaultParams[(/** @type {keyof typeof defaultParams} */paramName)] === 'object') { + result[paramName] = JSON.parse(value); + } else { + result[paramName] = value; + } + }); + return result; + }; + + /** + * @param {DocumentFragment} templateContent + * @returns {Record void>} + */ + const getSwalFunctionParams = templateContent => { + /** @type {Record void>} */ + const result = {}; + /** @type {HTMLElement[]} */ + const swalFunctions = Array.from(templateContent.querySelectorAll('swal-function-param')); + swalFunctions.forEach(param => { + const paramName = /** @type {keyof SweetAlertOptions} */param.getAttribute('name'); + const value = param.getAttribute('value'); + if (!paramName || !value) { + return; + } + result[paramName] = new Function(`return ${value}`)(); + }); + return result; + }; + + /** + * @param {DocumentFragment} templateContent + * @returns {Record} + */ + const getSwalButtons = templateContent => { + /** @type {Record} */ + const result = {}; + /** @type {HTMLElement[]} */ + const swalButtons = Array.from(templateContent.querySelectorAll('swal-button')); + swalButtons.forEach(button => { + showWarningsForAttributes(button, ['type', 'color', 'aria-label']); + const type = button.getAttribute('type'); + if (!type || !['confirm', 'cancel', 'deny'].includes(type)) { + return; + } + result[`${type}ButtonText`] = button.innerHTML; + result[`show${capitalizeFirstLetter(type)}Button`] = true; + if (button.hasAttribute('color')) { + const color = button.getAttribute('color'); + if (color !== null) { + result[`${type}ButtonColor`] = color; + } + } + if (button.hasAttribute('aria-label')) { + const ariaLabel = button.getAttribute('aria-label'); + if (ariaLabel !== null) { + result[`${type}ButtonAriaLabel`] = ariaLabel; + } + } + }); + return result; + }; + + /** + * @param {DocumentFragment} templateContent + * @returns {Pick} + */ + const getSwalImage = templateContent => { + const result = {}; + /** @type {HTMLElement | null} */ + const image = templateContent.querySelector('swal-image'); + if (image) { + showWarningsForAttributes(image, ['src', 'width', 'height', 'alt']); + if (image.hasAttribute('src')) { + result.imageUrl = image.getAttribute('src') || undefined; + } + if (image.hasAttribute('width')) { + result.imageWidth = image.getAttribute('width') || undefined; + } + if (image.hasAttribute('height')) { + result.imageHeight = image.getAttribute('height') || undefined; + } + if (image.hasAttribute('alt')) { + result.imageAlt = image.getAttribute('alt') || undefined; + } + } + return result; + }; + + /** + * @param {DocumentFragment} templateContent + * @returns {object} + */ + const getSwalIcon = templateContent => { + const result = {}; + /** @type {HTMLElement | null} */ + const icon = templateContent.querySelector('swal-icon'); + if (icon) { + showWarningsForAttributes(icon, ['type', 'color']); + if (icon.hasAttribute('type')) { + result.icon = icon.getAttribute('type'); + } + if (icon.hasAttribute('color')) { + result.iconColor = icon.getAttribute('color'); + } + result.iconHtml = icon.innerHTML; + } + return result; + }; + + /** + * @param {DocumentFragment} templateContent + * @returns {object} + */ + const getSwalInput = templateContent => { + /** @type {Record} */ + const result = {}; + /** @type {HTMLElement | null} */ + const input = templateContent.querySelector('swal-input'); + if (input) { + showWarningsForAttributes(input, ['type', 'label', 'placeholder', 'value']); + result.input = input.getAttribute('type') || 'text'; + if (input.hasAttribute('label')) { + result.inputLabel = input.getAttribute('label'); + } + if (input.hasAttribute('placeholder')) { + result.inputPlaceholder = input.getAttribute('placeholder'); + } + if (input.hasAttribute('value')) { + result.inputValue = input.getAttribute('value'); + } + } + /** @type {HTMLElement[]} */ + const inputOptions = Array.from(templateContent.querySelectorAll('swal-input-option')); + if (inputOptions.length) { + result.inputOptions = {}; + inputOptions.forEach(option => { + showWarningsForAttributes(option, ['value']); + const optionValue = option.getAttribute('value'); + if (!optionValue) { + return; + } + const optionName = option.innerHTML; + result.inputOptions[optionValue] = optionName; + }); + } + return result; + }; + + /** + * @param {DocumentFragment} templateContent + * @param {string[]} paramNames + * @returns {Record} + */ + const getSwalStringParams = (templateContent, paramNames) => { + /** @type {Record} */ + const result = {}; + for (const i in paramNames) { + const paramName = paramNames[i]; + /** @type {HTMLElement | null} */ + const tag = templateContent.querySelector(paramName); + if (tag) { + showWarningsForAttributes(tag, []); + result[paramName.replace(/^swal-/, '')] = tag.innerHTML.trim(); + } + } + return result; + }; + + /** + * @param {DocumentFragment} templateContent + */ + const showWarningsForElements = templateContent => { + const allowedElements = swalStringParams.concat(['swal-param', 'swal-function-param', 'swal-button', 'swal-image', 'swal-icon', 'swal-input', 'swal-input-option']); + Array.from(templateContent.children).forEach(el => { + const tagName = el.tagName.toLowerCase(); + if (!allowedElements.includes(tagName)) { + warn(`Unrecognized element <${tagName}>`); + } + }); + }; + + /** + * @param {HTMLElement} el + * @param {string[]} allowedAttributes + */ + const showWarningsForAttributes = (el, allowedAttributes) => { + Array.from(el.attributes).forEach(attribute => { + if (allowedAttributes.indexOf(attribute.name) === -1) { + warn([`Unrecognized attribute "${attribute.name}" on <${el.tagName.toLowerCase()}>.`, `${allowedAttributes.length ? `Allowed attributes are: ${allowedAttributes.join(', ')}` : 'To set the value, use HTML within the element.'}`]); + } + }); + }; + + const SHOW_CLASS_TIMEOUT = 10; + + /** + * Open popup, add necessary classes and styles, fix scrollbar + * + * @param {SweetAlertOptions} params + */ + const openPopup = params => { + var _globalState$eventEmi, _globalState$eventEmi2; + const container = getContainer(); + const popup = getPopup(); + if (!container || !popup) { + return; + } + if (typeof params.willOpen === 'function') { + params.willOpen(popup); + } + (_globalState$eventEmi = globalState.eventEmitter) === null || _globalState$eventEmi === void 0 || _globalState$eventEmi.emit('willOpen', popup); + const bodyStyles = window.getComputedStyle(document.body); + const initialBodyOverflow = bodyStyles.overflowY; + addClasses(container, popup, params); + + // scrolling is 'hidden' until animation is done, after that 'auto' + setTimeout(() => { + setScrollingVisibility(container, popup); + }, SHOW_CLASS_TIMEOUT); + if (isModal()) { + // Using ternary instead of ?? operator for Webpack 4 compatibility + fixScrollContainer(container, params.scrollbarPadding !== undefined ? params.scrollbarPadding : false, initialBodyOverflow); + setAriaHidden(); + } + if (!isToast() && !globalState.previousActiveElement) { + globalState.previousActiveElement = document.activeElement; + } + if (typeof params.didOpen === 'function') { + const didOpen = params.didOpen; + setTimeout(() => didOpen(popup)); + } + (_globalState$eventEmi2 = globalState.eventEmitter) === null || _globalState$eventEmi2 === void 0 || _globalState$eventEmi2.emit('didOpen', popup); + }; + + /** + * @param {Event} event + */ + const swalOpenAnimationFinished = event => { + const popup = getPopup(); + if (!popup || event.target !== popup) { + return; + } + const container = getContainer(); + if (!container) { + return; + } + popup.removeEventListener('animationend', swalOpenAnimationFinished); + popup.removeEventListener('transitionend', swalOpenAnimationFinished); + container.style.overflowY = 'auto'; + + // no-transition is added in init() in case one swal is opened right after another + removeClass(container, swalClasses['no-transition']); + }; + + /** + * @param {HTMLElement} container + * @param {HTMLElement} popup + */ + const setScrollingVisibility = (container, popup) => { + if (hasCssAnimation(popup)) { + container.style.overflowY = 'hidden'; + popup.addEventListener('animationend', swalOpenAnimationFinished); + popup.addEventListener('transitionend', swalOpenAnimationFinished); + } else { + container.style.overflowY = 'auto'; + } + }; + + /** + * @param {HTMLElement} container + * @param {boolean} scrollbarPadding + * @param {string} initialBodyOverflow + */ + const fixScrollContainer = (container, scrollbarPadding, initialBodyOverflow) => { + iOSfix(); + if (scrollbarPadding && initialBodyOverflow !== 'hidden') { + replaceScrollbarWithPadding(initialBodyOverflow); + } + + // sweetalert2/issues/1247 + setTimeout(() => { + container.scrollTop = 0; + }); + }; + + /** + * @param {HTMLElement} container + * @param {HTMLElement} popup + * @param {SweetAlertOptions} params + */ + const addClasses = (container, popup, params) => { + var _params$showClass; + if ((_params$showClass = params.showClass) !== null && _params$showClass !== void 0 && _params$showClass.backdrop) { + addClass(container, params.showClass.backdrop); + } + if (params.animation) { + // this workaround with opacity is needed for https://github.com/sweetalert2/sweetalert2/issues/2059 + popup.style.setProperty('opacity', '0', 'important'); + show(popup, 'grid'); + setTimeout(() => { + var _params$showClass2; + // Animate popup right after showing it + if ((_params$showClass2 = params.showClass) !== null && _params$showClass2 !== void 0 && _params$showClass2.popup) { + addClass(popup, params.showClass.popup); + } + // and remove the opacity workaround + popup.style.removeProperty('opacity'); + }, SHOW_CLASS_TIMEOUT); // 10ms in order to fix #2062 + } else { + show(popup, 'grid'); + } + addClass([document.documentElement, document.body], swalClasses.shown); + if (params.heightAuto && params.backdrop && !params.toast) { + addClass([document.documentElement, document.body], swalClasses['height-auto']); + } + }; + + var defaultInputValidators = { + /** + * @param {string} string + * @param {string} [validationMessage] + * @returns {Promise} + */ + email: (string, validationMessage) => { + return /^[a-zA-Z0-9.+_'-]+@[a-zA-Z0-9.-]+\.[a-zA-Z0-9-]+$/.test(string) ? Promise.resolve() : Promise.resolve(validationMessage || 'Invalid email address'); + }, + /** + * @param {string} string + * @param {string} [validationMessage] + * @returns {Promise} + */ + url: (string, validationMessage) => { + // taken from https://stackoverflow.com/a/3809435 with a small change from #1306 and #2013 + return /^https?:\/\/(www\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\.[a-z]{2,63}\b([-a-zA-Z0-9@:%_+.~#?&/=]*)$/.test(string) ? Promise.resolve() : Promise.resolve(validationMessage || 'Invalid URL'); + } + }; + + /** + * @param {SweetAlertOptions} params + */ + function setDefaultInputValidators(params) { + // Use default `inputValidator` for supported input types if not provided + if (params.inputValidator) { + return; + } + if (params.input === 'email') { + params.inputValidator = defaultInputValidators['email']; + } + if (params.input === 'url') { + params.inputValidator = defaultInputValidators['url']; + } + } + + /** + * @param {SweetAlertOptions} params + */ + function validateCustomTargetElement(params) { + // Determine if the custom target element is valid + if (!params.target || typeof params.target === 'string' && !document.querySelector(params.target) || typeof params.target !== 'string' && !params.target.appendChild) { + warn('Target parameter is not valid, defaulting to "body"'); + params.target = 'body'; + } + } + + /** + * Set type, text and actions on popup + * + * @param {SweetAlertOptions} params + */ + function setParameters(params) { + setDefaultInputValidators(params); + + // showLoaderOnConfirm && preConfirm + if (params.showLoaderOnConfirm && !params.preConfirm) { + warn('showLoaderOnConfirm is set to true, but preConfirm is not defined.\n' + 'showLoaderOnConfirm should be used together with preConfirm, see usage example:\n' + 'https://sweetalert2.github.io/#ajax-request'); + } + validateCustomTargetElement(params); + + // Replace newlines with
      in title + if (typeof params.title === 'string') { + params.title = params.title.split('\n').join('
      '); + } + init(params); + } + + /** @type {SweetAlert} */ + let currentInstance; + var _promise = /*#__PURE__*/new WeakMap(); + class SweetAlert { + /** + * @param {...(SweetAlertOptions | string)} args + * @this {SweetAlert} + */ + constructor(...args) { + /** + * @type {Promise} + */ + _classPrivateFieldInitSpec(this, _promise, /** @type {Promise} */Promise.resolve({ + isConfirmed: false, + isDenied: false, + isDismissed: true + })); + // Prevent run in Node env + if (typeof window === 'undefined') { + return; + } + currentInstance = this; + + // @ts-ignore + const outerParams = Object.freeze(this.constructor.argsToParams(args)); + + /** @type {Readonly} */ + this.params = outerParams; + + /** @type {boolean} */ + this.isAwaitingPromise = false; + _classPrivateFieldSet2(_promise, this, this._main(currentInstance.params)); + } + + /** + * @param {any} userParams + * @param {any} mixinParams + */ + _main(userParams, mixinParams = {}) { + showWarningsForParams(Object.assign({}, mixinParams, userParams)); + if (globalState.currentInstance) { + const swalPromiseResolve = privateMethods.swalPromiseResolve.get(globalState.currentInstance); + const { + isAwaitingPromise + } = globalState.currentInstance; + globalState.currentInstance._destroy(); + if (!isAwaitingPromise) { + swalPromiseResolve({ + isDismissed: true + }); + } + if (isModal()) { + unsetAriaHidden(); + } + } + globalState.currentInstance = currentInstance; + const innerParams = prepareParams(userParams, mixinParams); + setParameters(innerParams); + Object.freeze(innerParams); + + // clear the previous timer + if (globalState.timeout) { + globalState.timeout.stop(); + delete globalState.timeout; + } + + // clear the restore focus timeout + clearTimeout(globalState.restoreFocusTimeout); + const domCache = populateDomCache(currentInstance); + render(currentInstance, innerParams); + privateProps.innerParams.set(currentInstance, innerParams); + return swalPromise(currentInstance, domCache, innerParams); + } + + // `catch` cannot be the name of a module export, so we define our thenable methods here instead + /** + * @param {any} onFulfilled + */ + then(onFulfilled) { + return _classPrivateFieldGet2(_promise, this).then(onFulfilled); + } + + /** + * @param {any} onFinally + */ + finally(onFinally) { + return _classPrivateFieldGet2(_promise, this).finally(onFinally); + } + } + + /** + * @param {SweetAlert} instance + * @param {DomCache} domCache + * @param {SweetAlertOptions} innerParams + * @returns {Promise} + */ + const swalPromise = (instance, domCache, innerParams) => { + return new Promise((resolve, reject) => { + // functions to handle all closings/dismissals + /** + * @param {DismissReason} dismiss + */ + const dismissWith = dismiss => { + instance.close({ + isDismissed: true, + dismiss, + isConfirmed: false, + isDenied: false + }); + }; + privateMethods.swalPromiseResolve.set(instance, resolve); + privateMethods.swalPromiseReject.set(instance, reject); + domCache.confirmButton.onclick = () => { + handleConfirmButtonClick(instance); + }; + domCache.denyButton.onclick = () => { + handleDenyButtonClick(instance); + }; + domCache.cancelButton.onclick = () => { + handleCancelButtonClick(instance, dismissWith); + }; + domCache.closeButton.onclick = () => { + dismissWith(DismissReason.close); + }; + handlePopupClick(innerParams, domCache, dismissWith); + addKeydownHandler(globalState, innerParams, dismissWith); + handleInputOptionsAndValue(instance, innerParams); + openPopup(innerParams); + setupTimer(globalState, innerParams, dismissWith); + initFocus(domCache, innerParams); + + // Scroll container to top on open (#1247, #1946) + setTimeout(() => { + domCache.container.scrollTop = 0; + }); + }); + }; + + /** + * @param {SweetAlertOptions} userParams + * @param {SweetAlertOptions} mixinParams + * @returns {SweetAlertOptions} + */ + const prepareParams = (userParams, mixinParams) => { + const templateParams = getTemplateParams(userParams); + const params = Object.assign({}, defaultParams, mixinParams, templateParams, userParams); // precedence is described in #2131 + params.showClass = Object.assign({}, defaultParams.showClass, params.showClass); + params.hideClass = Object.assign({}, defaultParams.hideClass, params.hideClass); + if (params.animation === false) { + params.showClass = { + backdrop: 'swal2-noanimation' + }; + params.hideClass = {}; + } + return params; + }; + + /** + * @param {SweetAlert} instance + * @returns {DomCache} + */ + const populateDomCache = instance => { + const domCache = /** @type {DomCache} */{ + popup: (/** @type {HTMLElement} */getPopup()), + container: (/** @type {HTMLElement} */getContainer()), + actions: (/** @type {HTMLElement} */getActions()), + confirmButton: (/** @type {HTMLElement} */getConfirmButton()), + denyButton: (/** @type {HTMLElement} */getDenyButton()), + cancelButton: (/** @type {HTMLElement} */getCancelButton()), + loader: (/** @type {HTMLElement} */getLoader()), + closeButton: (/** @type {HTMLElement} */getCloseButton()), + validationMessage: (/** @type {HTMLElement} */getValidationMessage()), + progressSteps: (/** @type {HTMLElement} */getProgressSteps()) + }; + privateProps.domCache.set(instance, domCache); + return domCache; + }; + + /** + * @param {GlobalState} globalState + * @param {SweetAlertOptions} innerParams + * @param {(dismiss: DismissReason) => void} dismissWith + */ + const setupTimer = (globalState, innerParams, dismissWith) => { + const timerProgressBar = getTimerProgressBar(); + hide(timerProgressBar); + if (innerParams.timer) { + globalState.timeout = new Timer(() => { + dismissWith('timer'); + delete globalState.timeout; + }, innerParams.timer); + if (innerParams.timerProgressBar && timerProgressBar) { + show(timerProgressBar); + applyCustomClass(timerProgressBar, innerParams, 'timerProgressBar'); + setTimeout(() => { + if (globalState.timeout && globalState.timeout.running) { + // timer can be already stopped or unset at this point + animateTimerProgressBar(/** @type {number} */innerParams.timer); + } + }); + } + } + }; + + /** + * Initialize focus in the popup: + * + * 1. If `toast` is `true`, don't steal focus from the document. + * 2. Else if there is an [autofocus] element, focus it. + * 3. Else if `focusConfirm` is `true` and confirm button is visible, focus it. + * 4. Else if `focusDeny` is `true` and deny button is visible, focus it. + * 5. Else if `focusCancel` is `true` and cancel button is visible, focus it. + * 6. Else focus the first focusable element in a popup (if any). + * + * @param {DomCache} domCache + * @param {SweetAlertOptions} innerParams + */ + const initFocus = (domCache, innerParams) => { + if (innerParams.toast) { + return; + } + // TODO: this is dumb, remove `allowEnterKey` param in the next major version + if (!callIfFunction(innerParams.allowEnterKey)) { + warnAboutDeprecation('allowEnterKey'); + blurActiveElement(); + return; + } + if (focusAutofocus(domCache)) { + return; + } + if (focusButton(domCache, innerParams)) { + return; + } + setFocus(-1, 1); + }; + + /** + * @param {DomCache} domCache + * @returns {boolean} + */ + const focusAutofocus = domCache => { + const autofocusElements = Array.from(domCache.popup.querySelectorAll('[autofocus]')); + for (const autofocusElement of autofocusElements) { + if (autofocusElement instanceof HTMLElement && isVisible$1(autofocusElement)) { + autofocusElement.focus(); + return true; + } + } + return false; + }; + + /** + * @param {DomCache} domCache + * @param {SweetAlertOptions} innerParams + * @returns {boolean} + */ + const focusButton = (domCache, innerParams) => { + if (innerParams.focusDeny && isVisible$1(domCache.denyButton)) { + domCache.denyButton.focus(); + return true; + } + if (innerParams.focusCancel && isVisible$1(domCache.cancelButton)) { + domCache.cancelButton.focus(); + return true; + } + if (innerParams.focusConfirm && isVisible$1(domCache.confirmButton)) { + domCache.confirmButton.focus(); + return true; + } + return false; + }; + const blurActiveElement = () => { + if (document.activeElement instanceof HTMLElement && typeof document.activeElement.blur === 'function') { + document.activeElement.blur(); + } + }; + + // Assign instance methods from src/instanceMethods/*.js to prototype + SweetAlert.prototype.disableButtons = disableButtons; + SweetAlert.prototype.enableButtons = enableButtons; + SweetAlert.prototype.getInput = getInput; + SweetAlert.prototype.disableInput = disableInput; + SweetAlert.prototype.enableInput = enableInput; + SweetAlert.prototype.hideLoading = hideLoading; + SweetAlert.prototype.disableLoading = hideLoading; + SweetAlert.prototype.showValidationMessage = showValidationMessage; + SweetAlert.prototype.resetValidationMessage = resetValidationMessage; + SweetAlert.prototype.close = close; + SweetAlert.prototype.closePopup = close; + SweetAlert.prototype.closeModal = close; + SweetAlert.prototype.closeToast = close; + SweetAlert.prototype.rejectPromise = rejectPromise; + SweetAlert.prototype.update = update; + SweetAlert.prototype._destroy = _destroy; + + // Assign static methods from src/staticMethods/*.js to constructor + Object.assign(SweetAlert, staticMethods); + + // Proxy to instance methods to constructor, for now, for backwards compatibility + Object.keys(instanceMethods).forEach(key => { + /** + * @param {...(SweetAlertOptions | string | undefined)} args + * @returns {SweetAlertResult | Promise | undefined} + */ + // @ts-ignore: Dynamic property assignment for backwards compatibility + SweetAlert[key] = function (...args) { + // @ts-ignore + if (currentInstance && currentInstance[key]) { + // @ts-ignore + return currentInstance[key](...args); + } + return undefined; + }; + }); + SweetAlert.DismissReason = DismissReason; + SweetAlert.version = '11.26.18'; + + const Swal = SweetAlert; + // @ts-ignore + Swal.default = Swal; + + return Swal; + +})); +if (typeof this !== 'undefined' && this.Sweetalert2){this.swal = this.sweetAlert = this.Swal = this.SweetAlert = this.Sweetalert2} +"undefined"!=typeof document&&function(e,t){var n=e.createElement("style");if(e.getElementsByTagName("head")[0].appendChild(n),n.styleSheet)n.styleSheet.disabled||(n.styleSheet.cssText=t);else try{n.innerHTML=t}catch(e){n.innerText=t}}(document,":root{--swal2-outline: 0 0 0 3px rgba(100, 150, 200, 0.5);--swal2-container-padding: 0.625em;--swal2-backdrop: rgba(0, 0, 0, 0.4);--swal2-backdrop-transition: background-color 0.15s;--swal2-width: 32em;--swal2-padding: 0 0 1.25em;--swal2-border: none;--swal2-border-radius: 0.3125rem;--swal2-background: white;--swal2-color: #545454;--swal2-show-animation: swal2-show 0.3s;--swal2-hide-animation: swal2-hide 0.15s forwards;--swal2-icon-zoom: 1;--swal2-icon-animations: true;--swal2-title-padding: 0.8em 1em 0;--swal2-html-container-padding: 1em 1.6em 0.3em;--swal2-input-border: 1px solid #d9d9d9;--swal2-input-border-radius: 0.1875em;--swal2-input-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.06), 0 0 0 3px transparent;--swal2-input-background: transparent;--swal2-input-transition: border-color 0.2s, box-shadow 0.2s;--swal2-input-hover-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.06), 0 0 0 3px transparent;--swal2-input-focus-border: 1px solid #b4dbed;--swal2-input-focus-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.06), 0 0 0 3px rgba(100, 150, 200, 0.5);--swal2-progress-step-background: #add8e6;--swal2-validation-message-background: #f0f0f0;--swal2-validation-message-color: #666;--swal2-footer-border-color: #eee;--swal2-footer-background: transparent;--swal2-footer-color: inherit;--swal2-timer-progress-bar-background: rgba(0, 0, 0, 0.3);--swal2-close-button-position: initial;--swal2-close-button-inset: auto;--swal2-close-button-font-size: 2.5em;--swal2-close-button-color: #ccc;--swal2-close-button-transition: color 0.2s, box-shadow 0.2s;--swal2-close-button-outline: initial;--swal2-close-button-box-shadow: inset 0 0 0 3px transparent;--swal2-close-button-focus-box-shadow: inset var(--swal2-outline);--swal2-close-button-hover-transform: none;--swal2-actions-justify-content: center;--swal2-actions-width: auto;--swal2-actions-margin: 1.25em auto 0;--swal2-actions-padding: 0;--swal2-actions-border-radius: 0;--swal2-actions-background: transparent;--swal2-action-button-transition: background-color 0.2s, box-shadow 0.2s;--swal2-action-button-hover: black 10%;--swal2-action-button-active: black 10%;--swal2-confirm-button-box-shadow: none;--swal2-confirm-button-border-radius: 0.25em;--swal2-confirm-button-background-color: #7066e0;--swal2-confirm-button-color: #fff;--swal2-deny-button-box-shadow: none;--swal2-deny-button-border-radius: 0.25em;--swal2-deny-button-background-color: #dc3741;--swal2-deny-button-color: #fff;--swal2-cancel-button-box-shadow: none;--swal2-cancel-button-border-radius: 0.25em;--swal2-cancel-button-background-color: #6e7881;--swal2-cancel-button-color: #fff;--swal2-toast-show-animation: swal2-toast-show 0.5s;--swal2-toast-hide-animation: swal2-toast-hide 0.1s forwards;--swal2-toast-border: none;--swal2-toast-box-shadow: 0 0 1px hsl(0deg 0% 0% / 0.075), 0 1px 2px hsl(0deg 0% 0% / 0.075), 1px 2px 4px hsl(0deg 0% 0% / 0.075), 1px 3px 8px hsl(0deg 0% 0% / 0.075), 2px 4px 16px hsl(0deg 0% 0% / 0.075)}[data-swal2-theme=dark]{--swal2-dark-theme-black: #19191a;--swal2-dark-theme-white: #e1e1e1;--swal2-background: var(--swal2-dark-theme-black);--swal2-color: var(--swal2-dark-theme-white);--swal2-footer-border-color: #555;--swal2-input-background: color-mix(in srgb, var(--swal2-dark-theme-black), var(--swal2-dark-theme-white) 10%);--swal2-validation-message-background: color-mix( in srgb, var(--swal2-dark-theme-black), var(--swal2-dark-theme-white) 10% );--swal2-validation-message-color: var(--swal2-dark-theme-white);--swal2-timer-progress-bar-background: rgba(255, 255, 255, 0.7)}@media(prefers-color-scheme: dark){[data-swal2-theme=auto]{--swal2-dark-theme-black: #19191a;--swal2-dark-theme-white: #e1e1e1;--swal2-background: var(--swal2-dark-theme-black);--swal2-color: var(--swal2-dark-theme-white);--swal2-footer-border-color: #555;--swal2-input-background: color-mix(in srgb, var(--swal2-dark-theme-black), var(--swal2-dark-theme-white) 10%);--swal2-validation-message-background: color-mix( in srgb, var(--swal2-dark-theme-black), var(--swal2-dark-theme-white) 10% );--swal2-validation-message-color: var(--swal2-dark-theme-white);--swal2-timer-progress-bar-background: rgba(255, 255, 255, 0.7)}}body.swal2-shown:not(.swal2-no-backdrop,.swal2-toast-shown){overflow:hidden}body.swal2-height-auto{height:auto !important}body.swal2-no-backdrop .swal2-container{background-color:rgba(0,0,0,0) !important;pointer-events:none}body.swal2-no-backdrop .swal2-container .swal2-popup{pointer-events:all}body.swal2-no-backdrop .swal2-container .swal2-modal{box-shadow:0 0 10px var(--swal2-backdrop)}body.swal2-toast-shown .swal2-container{box-sizing:border-box;width:360px;max-width:100%;background-color:rgba(0,0,0,0);pointer-events:none}body.swal2-toast-shown .swal2-container.swal2-top{inset:0 auto auto 50%;transform:translateX(-50%)}body.swal2-toast-shown .swal2-container.swal2-top-end,body.swal2-toast-shown .swal2-container.swal2-top-right{inset:0 0 auto auto}body.swal2-toast-shown .swal2-container.swal2-top-start,body.swal2-toast-shown .swal2-container.swal2-top-left{inset:0 auto auto 0}body.swal2-toast-shown .swal2-container.swal2-center-start,body.swal2-toast-shown .swal2-container.swal2-center-left{inset:50% auto auto 0;transform:translateY(-50%)}body.swal2-toast-shown .swal2-container.swal2-center{inset:50% auto auto 50%;transform:translate(-50%, -50%)}body.swal2-toast-shown .swal2-container.swal2-center-end,body.swal2-toast-shown .swal2-container.swal2-center-right{inset:50% 0 auto auto;transform:translateY(-50%)}body.swal2-toast-shown .swal2-container.swal2-bottom-start,body.swal2-toast-shown .swal2-container.swal2-bottom-left{inset:auto auto 0 0}body.swal2-toast-shown .swal2-container.swal2-bottom{inset:auto auto 0 50%;transform:translateX(-50%)}body.swal2-toast-shown .swal2-container.swal2-bottom-end,body.swal2-toast-shown .swal2-container.swal2-bottom-right{inset:auto 0 0 auto}@media print{body.swal2-shown:not(.swal2-no-backdrop,.swal2-toast-shown){overflow-y:scroll !important}body.swal2-shown:not(.swal2-no-backdrop,.swal2-toast-shown)>[aria-hidden=true]{display:none}body.swal2-shown:not(.swal2-no-backdrop,.swal2-toast-shown) .swal2-container{position:static !important}}div:where(.swal2-container){display:grid;position:fixed;z-index:1060;inset:0;box-sizing:border-box;grid-template-areas:\"top-start top top-end\" \"center-start center center-end\" \"bottom-start bottom-center bottom-end\";grid-template-rows:minmax(min-content, auto) minmax(min-content, auto) minmax(min-content, auto);height:100%;padding:var(--swal2-container-padding);overflow-x:hidden;transition:var(--swal2-backdrop-transition);-webkit-overflow-scrolling:touch}div:where(.swal2-container).swal2-backdrop-show,div:where(.swal2-container).swal2-noanimation{background:var(--swal2-backdrop)}div:where(.swal2-container).swal2-backdrop-hide{background:rgba(0,0,0,0) !important}div:where(.swal2-container).swal2-top-start,div:where(.swal2-container).swal2-center-start,div:where(.swal2-container).swal2-bottom-start{grid-template-columns:minmax(0, 1fr) auto auto}div:where(.swal2-container).swal2-top,div:where(.swal2-container).swal2-center,div:where(.swal2-container).swal2-bottom{grid-template-columns:auto minmax(0, 1fr) auto}div:where(.swal2-container).swal2-top-end,div:where(.swal2-container).swal2-center-end,div:where(.swal2-container).swal2-bottom-end{grid-template-columns:auto auto minmax(0, 1fr)}div:where(.swal2-container).swal2-top-start>.swal2-popup{align-self:start}div:where(.swal2-container).swal2-top>.swal2-popup{grid-column:2;place-self:start center}div:where(.swal2-container).swal2-top-end>.swal2-popup,div:where(.swal2-container).swal2-top-right>.swal2-popup{grid-column:3;place-self:start end}div:where(.swal2-container).swal2-center-start>.swal2-popup,div:where(.swal2-container).swal2-center-left>.swal2-popup{grid-row:2;align-self:center}div:where(.swal2-container).swal2-center>.swal2-popup{grid-column:2;grid-row:2;place-self:center center}div:where(.swal2-container).swal2-center-end>.swal2-popup,div:where(.swal2-container).swal2-center-right>.swal2-popup{grid-column:3;grid-row:2;place-self:center end}div:where(.swal2-container).swal2-bottom-start>.swal2-popup,div:where(.swal2-container).swal2-bottom-left>.swal2-popup{grid-column:1;grid-row:3;align-self:end}div:where(.swal2-container).swal2-bottom>.swal2-popup{grid-column:2;grid-row:3;place-self:end center}div:where(.swal2-container).swal2-bottom-end>.swal2-popup,div:where(.swal2-container).swal2-bottom-right>.swal2-popup{grid-column:3;grid-row:3;place-self:end end}div:where(.swal2-container).swal2-grow-row>.swal2-popup,div:where(.swal2-container).swal2-grow-fullscreen>.swal2-popup{grid-column:1/4;width:100%}div:where(.swal2-container).swal2-grow-column>.swal2-popup,div:where(.swal2-container).swal2-grow-fullscreen>.swal2-popup{grid-row:1/4;align-self:stretch}div:where(.swal2-container).swal2-no-transition{transition:none !important}div:where(.swal2-container)[popover]{width:auto;border:0}div:where(.swal2-container) div:where(.swal2-popup){display:none;position:relative;box-sizing:border-box;grid-template-columns:minmax(0, 100%);width:var(--swal2-width);max-width:100%;padding:var(--swal2-padding);border:var(--swal2-border);border-radius:var(--swal2-border-radius);background:var(--swal2-background);color:var(--swal2-color);font-family:inherit;font-size:1rem;container-name:swal2-popup}div:where(.swal2-container) div:where(.swal2-popup):focus{outline:none}div:where(.swal2-container) div:where(.swal2-popup).swal2-loading{overflow-y:hidden}div:where(.swal2-container) div:where(.swal2-popup).swal2-draggable{cursor:grab}div:where(.swal2-container) div:where(.swal2-popup).swal2-draggable div:where(.swal2-icon){cursor:grab}div:where(.swal2-container) div:where(.swal2-popup).swal2-dragging{cursor:grabbing}div:where(.swal2-container) div:where(.swal2-popup).swal2-dragging div:where(.swal2-icon){cursor:grabbing}div:where(.swal2-container) h2:where(.swal2-title){position:relative;max-width:100%;margin:0;padding:var(--swal2-title-padding);color:inherit;font-size:1.875em;font-weight:600;text-align:center;text-transform:none;overflow-wrap:break-word;cursor:initial}div:where(.swal2-container) div:where(.swal2-actions){display:flex;z-index:1;box-sizing:border-box;flex-wrap:wrap;align-items:center;justify-content:var(--swal2-actions-justify-content);width:var(--swal2-actions-width);margin:var(--swal2-actions-margin);padding:var(--swal2-actions-padding);border-radius:var(--swal2-actions-border-radius);background:var(--swal2-actions-background)}div:where(.swal2-container) div:where(.swal2-loader){display:none;align-items:center;justify-content:center;width:2.2em;height:2.2em;margin:0 1.875em;animation:swal2-rotate-loading 1.5s linear 0s infinite normal;border-width:.25em;border-style:solid;border-radius:100%;border-color:#2778c4 rgba(0,0,0,0) #2778c4 rgba(0,0,0,0)}div:where(.swal2-container) button:where(.swal2-styled){margin:.3125em;padding:.625em 1.1em;transition:var(--swal2-action-button-transition);border:none;box-shadow:0 0 0 3px rgba(0,0,0,0);font-weight:500}div:where(.swal2-container) button:where(.swal2-styled):not([disabled]){cursor:pointer}div:where(.swal2-container) button:where(.swal2-styled):where(.swal2-confirm){border-radius:var(--swal2-confirm-button-border-radius);background:initial;background-color:var(--swal2-confirm-button-background-color);box-shadow:var(--swal2-confirm-button-box-shadow);color:var(--swal2-confirm-button-color);font-size:1em}div:where(.swal2-container) button:where(.swal2-styled):where(.swal2-confirm):hover{background-color:color-mix(in srgb, var(--swal2-confirm-button-background-color), var(--swal2-action-button-hover))}div:where(.swal2-container) button:where(.swal2-styled):where(.swal2-confirm):active{background-color:color-mix(in srgb, var(--swal2-confirm-button-background-color), var(--swal2-action-button-active))}div:where(.swal2-container) button:where(.swal2-styled):where(.swal2-deny){border-radius:var(--swal2-deny-button-border-radius);background:initial;background-color:var(--swal2-deny-button-background-color);box-shadow:var(--swal2-deny-button-box-shadow);color:var(--swal2-deny-button-color);font-size:1em}div:where(.swal2-container) button:where(.swal2-styled):where(.swal2-deny):hover{background-color:color-mix(in srgb, var(--swal2-deny-button-background-color), var(--swal2-action-button-hover))}div:where(.swal2-container) button:where(.swal2-styled):where(.swal2-deny):active{background-color:color-mix(in srgb, var(--swal2-deny-button-background-color), var(--swal2-action-button-active))}div:where(.swal2-container) button:where(.swal2-styled):where(.swal2-cancel){border-radius:var(--swal2-cancel-button-border-radius);background:initial;background-color:var(--swal2-cancel-button-background-color);box-shadow:var(--swal2-cancel-button-box-shadow);color:var(--swal2-cancel-button-color);font-size:1em}div:where(.swal2-container) button:where(.swal2-styled):where(.swal2-cancel):hover{background-color:color-mix(in srgb, var(--swal2-cancel-button-background-color), var(--swal2-action-button-hover))}div:where(.swal2-container) button:where(.swal2-styled):where(.swal2-cancel):active{background-color:color-mix(in srgb, var(--swal2-cancel-button-background-color), var(--swal2-action-button-active))}div:where(.swal2-container) button:where(.swal2-styled):focus-visible{outline:none;box-shadow:var(--swal2-action-button-focus-box-shadow)}div:where(.swal2-container) button:where(.swal2-styled)[disabled]:not(.swal2-loading){opacity:.4}div:where(.swal2-container) button:where(.swal2-styled)::-moz-focus-inner{border:0}div:where(.swal2-container) div:where(.swal2-footer){margin:1em 0 0;padding:1em 1em 0;border-top:1px solid var(--swal2-footer-border-color);background:var(--swal2-footer-background);color:var(--swal2-footer-color);font-size:1em;text-align:center;cursor:initial}div:where(.swal2-container) .swal2-timer-progress-bar-container{position:absolute;right:0;bottom:0;left:0;grid-column:auto !important;overflow:hidden;border-bottom-right-radius:var(--swal2-border-radius);border-bottom-left-radius:var(--swal2-border-radius)}div:where(.swal2-container) div:where(.swal2-timer-progress-bar){width:100%;height:.25em;background:var(--swal2-timer-progress-bar-background)}div:where(.swal2-container) img:where(.swal2-image){max-width:100%;margin:2em auto 1em;cursor:initial}div:where(.swal2-container) button:where(.swal2-close){position:var(--swal2-close-button-position);inset:var(--swal2-close-button-inset);z-index:2;align-items:center;justify-content:center;width:1.2em;height:1.2em;margin-top:0;margin-right:0;margin-bottom:-1.2em;padding:0;overflow:hidden;transition:var(--swal2-close-button-transition);border:none;border-radius:var(--swal2-border-radius);outline:var(--swal2-close-button-outline);background:rgba(0,0,0,0);color:var(--swal2-close-button-color);font-family:monospace;font-size:var(--swal2-close-button-font-size);cursor:pointer;justify-self:end}div:where(.swal2-container) button:where(.swal2-close):hover{transform:var(--swal2-close-button-hover-transform);background:rgba(0,0,0,0);color:#f27474}div:where(.swal2-container) button:where(.swal2-close):focus-visible{outline:none;box-shadow:var(--swal2-close-button-focus-box-shadow)}div:where(.swal2-container) button:where(.swal2-close)::-moz-focus-inner{border:0}div:where(.swal2-container) div:where(.swal2-html-container){z-index:1;justify-content:center;margin:0;padding:var(--swal2-html-container-padding);overflow:auto;color:inherit;font-size:1.125em;font-weight:normal;line-height:normal;text-align:center;overflow-wrap:break-word;word-break:break-word;cursor:initial}div:where(.swal2-container) input:where(.swal2-input),div:where(.swal2-container) input:where(.swal2-file),div:where(.swal2-container) textarea:where(.swal2-textarea),div:where(.swal2-container) select:where(.swal2-select),div:where(.swal2-container) div:where(.swal2-radio),div:where(.swal2-container) label:where(.swal2-checkbox){margin:1em 2em 3px}div:where(.swal2-container) input:where(.swal2-input),div:where(.swal2-container) input:where(.swal2-file),div:where(.swal2-container) textarea:where(.swal2-textarea){box-sizing:border-box;width:auto;transition:var(--swal2-input-transition);border:var(--swal2-input-border);border-radius:var(--swal2-input-border-radius);background:var(--swal2-input-background);box-shadow:var(--swal2-input-box-shadow);color:inherit;font-size:1.125em}div:where(.swal2-container) input:where(.swal2-input).swal2-inputerror,div:where(.swal2-container) input:where(.swal2-file).swal2-inputerror,div:where(.swal2-container) textarea:where(.swal2-textarea).swal2-inputerror{border-color:#f27474 !important;box-shadow:0 0 2px #f27474 !important}div:where(.swal2-container) input:where(.swal2-input):hover,div:where(.swal2-container) input:where(.swal2-file):hover,div:where(.swal2-container) textarea:where(.swal2-textarea):hover{box-shadow:var(--swal2-input-hover-box-shadow)}div:where(.swal2-container) input:where(.swal2-input):focus,div:where(.swal2-container) input:where(.swal2-file):focus,div:where(.swal2-container) textarea:where(.swal2-textarea):focus{border:var(--swal2-input-focus-border);outline:none;box-shadow:var(--swal2-input-focus-box-shadow)}div:where(.swal2-container) input:where(.swal2-input)::placeholder,div:where(.swal2-container) input:where(.swal2-file)::placeholder,div:where(.swal2-container) textarea:where(.swal2-textarea)::placeholder{color:#ccc}div:where(.swal2-container) .swal2-range{margin:1em 2em 3px;background:var(--swal2-background)}div:where(.swal2-container) .swal2-range input{width:80%}div:where(.swal2-container) .swal2-range output{width:20%;color:inherit;font-weight:600;text-align:center}div:where(.swal2-container) .swal2-range input,div:where(.swal2-container) .swal2-range output{height:2.625em;padding:0;font-size:1.125em;line-height:2.625em}div:where(.swal2-container) .swal2-input{height:2.625em;padding:0 .75em}div:where(.swal2-container) .swal2-file{width:75%;margin-right:auto;margin-left:auto;background:var(--swal2-input-background);font-size:1.125em}div:where(.swal2-container) .swal2-textarea{height:6.75em;padding:.75em}div:where(.swal2-container) .swal2-select{min-width:50%;max-width:100%;padding:.375em .625em;background:var(--swal2-input-background);color:inherit;font-size:1.125em}div:where(.swal2-container) .swal2-radio,div:where(.swal2-container) .swal2-checkbox{align-items:center;justify-content:center;background:var(--swal2-background);color:inherit}div:where(.swal2-container) .swal2-radio label,div:where(.swal2-container) .swal2-checkbox label{margin:0 .6em;font-size:1.125em}div:where(.swal2-container) .swal2-radio input,div:where(.swal2-container) .swal2-checkbox input{flex-shrink:0;margin:0 .4em}div:where(.swal2-container) label:where(.swal2-input-label){display:flex;justify-content:center;margin:1em auto 0}div:where(.swal2-container) div:where(.swal2-validation-message){align-items:center;justify-content:center;margin:1em 0 0;padding:.625em;overflow:hidden;background:var(--swal2-validation-message-background);color:var(--swal2-validation-message-color);font-size:1em;font-weight:300}div:where(.swal2-container) div:where(.swal2-validation-message)::before{content:\"!\";display:inline-block;width:1.5em;min-width:1.5em;height:1.5em;margin:0 .625em;border-radius:50%;background-color:#f27474;color:#fff;font-weight:600;line-height:1.5em;text-align:center}div:where(.swal2-container) .swal2-progress-steps{flex-wrap:wrap;align-items:center;max-width:100%;margin:1.25em auto;padding:0;background:rgba(0,0,0,0);font-weight:600}div:where(.swal2-container) .swal2-progress-steps li{display:inline-block;position:relative}div:where(.swal2-container) .swal2-progress-steps .swal2-progress-step{z-index:20;flex-shrink:0;width:2em;height:2em;border-radius:2em;background:#2778c4;color:#fff;line-height:2em;text-align:center}div:where(.swal2-container) .swal2-progress-steps .swal2-progress-step.swal2-active-progress-step{background:#2778c4}div:where(.swal2-container) .swal2-progress-steps .swal2-progress-step.swal2-active-progress-step~.swal2-progress-step{background:var(--swal2-progress-step-background);color:#fff}div:where(.swal2-container) .swal2-progress-steps .swal2-progress-step.swal2-active-progress-step~.swal2-progress-step-line{background:var(--swal2-progress-step-background)}div:where(.swal2-container) .swal2-progress-steps .swal2-progress-step-line{z-index:10;flex-shrink:0;width:2.5em;height:.4em;margin:0 -1px;background:#2778c4}div:where(.swal2-icon){position:relative;box-sizing:content-box;justify-content:center;width:5em;height:5em;margin:2.5em auto .6em;zoom:var(--swal2-icon-zoom);border:.25em solid rgba(0,0,0,0);border-radius:50%;border-color:#000;font-family:inherit;line-height:5em;cursor:default;user-select:none}div:where(.swal2-icon) .swal2-icon-content{display:flex;align-items:center;font-size:3.75em}div:where(.swal2-icon).swal2-error{border-color:#f27474;color:#f27474}div:where(.swal2-icon).swal2-error .swal2-x-mark{position:relative;flex-grow:1}div:where(.swal2-icon).swal2-error [class^=swal2-x-mark-line]{display:block;position:absolute;top:2.3125em;width:2.9375em;height:.3125em;border-radius:.125em;background-color:#f27474}div:where(.swal2-icon).swal2-error [class^=swal2-x-mark-line][class$=left]{left:1.0625em;transform:rotate(45deg)}div:where(.swal2-icon).swal2-error [class^=swal2-x-mark-line][class$=right]{right:1em;transform:rotate(-45deg)}@container swal2-popup style(--swal2-icon-animations:true){div:where(.swal2-icon).swal2-error.swal2-icon-show{animation:swal2-animate-error-icon .5s}div:where(.swal2-icon).swal2-error.swal2-icon-show .swal2-x-mark{animation:swal2-animate-error-x-mark .5s}}div:where(.swal2-icon).swal2-warning{border-color:#f8bb86;color:#f8bb86}@container swal2-popup style(--swal2-icon-animations:true){div:where(.swal2-icon).swal2-warning.swal2-icon-show{animation:swal2-animate-error-icon .5s}div:where(.swal2-icon).swal2-warning.swal2-icon-show .swal2-icon-content{animation:swal2-animate-i-mark .5s}}div:where(.swal2-icon).swal2-info{border-color:#3fc3ee;color:#3fc3ee}@container swal2-popup style(--swal2-icon-animations:true){div:where(.swal2-icon).swal2-info.swal2-icon-show{animation:swal2-animate-error-icon .5s}div:where(.swal2-icon).swal2-info.swal2-icon-show .swal2-icon-content{animation:swal2-animate-i-mark .8s}}div:where(.swal2-icon).swal2-question{border-color:#87adbd;color:#87adbd}@container swal2-popup style(--swal2-icon-animations:true){div:where(.swal2-icon).swal2-question.swal2-icon-show{animation:swal2-animate-error-icon .5s}div:where(.swal2-icon).swal2-question.swal2-icon-show .swal2-icon-content{animation:swal2-animate-question-mark .8s}}div:where(.swal2-icon).swal2-success{border-color:#a5dc86;color:#a5dc86}div:where(.swal2-icon).swal2-success [class^=swal2-success-circular-line]{position:absolute;width:3.75em;height:7.5em;border-radius:50%}div:where(.swal2-icon).swal2-success [class^=swal2-success-circular-line][class$=left]{top:-0.4375em;left:-2.0635em;transform:rotate(-45deg);transform-origin:3.75em 3.75em;border-radius:7.5em 0 0 7.5em}div:where(.swal2-icon).swal2-success [class^=swal2-success-circular-line][class$=right]{top:-0.6875em;left:1.875em;transform:rotate(-45deg);transform-origin:0 3.75em;border-radius:0 7.5em 7.5em 0}div:where(.swal2-icon).swal2-success .swal2-success-ring{position:absolute;z-index:2;top:-0.25em;left:-0.25em;box-sizing:content-box;width:100%;height:100%;border:.25em solid rgba(165,220,134,.3);border-radius:50%}div:where(.swal2-icon).swal2-success .swal2-success-fix{position:absolute;z-index:1;top:.5em;left:1.625em;width:.4375em;height:5.625em;transform:rotate(-45deg)}div:where(.swal2-icon).swal2-success [class^=swal2-success-line]{display:block;position:absolute;z-index:2;height:.3125em;border-radius:.125em;background-color:#a5dc86}div:where(.swal2-icon).swal2-success [class^=swal2-success-line][class$=tip]{top:2.875em;left:.8125em;width:1.5625em;transform:rotate(45deg)}div:where(.swal2-icon).swal2-success [class^=swal2-success-line][class$=long]{top:2.375em;right:.5em;width:2.9375em;transform:rotate(-45deg)}@container swal2-popup style(--swal2-icon-animations:true){div:where(.swal2-icon).swal2-success.swal2-icon-show .swal2-success-line-tip{animation:swal2-animate-success-line-tip .75s}div:where(.swal2-icon).swal2-success.swal2-icon-show .swal2-success-line-long{animation:swal2-animate-success-line-long .75s}div:where(.swal2-icon).swal2-success.swal2-icon-show .swal2-success-circular-line-right{animation:swal2-rotate-success-circular-line 4.25s ease-in}}[class^=swal2]{-webkit-tap-highlight-color:rgba(0,0,0,0)}.swal2-show{animation:var(--swal2-show-animation)}.swal2-hide{animation:var(--swal2-hide-animation)}.swal2-noanimation{transition:none}.swal2-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}.swal2-rtl .swal2-close{margin-right:initial;margin-left:0}.swal2-rtl .swal2-timer-progress-bar{right:0;left:auto}.swal2-toast{box-sizing:border-box;grid-column:1/4 !important;grid-row:1/4 !important;grid-template-columns:min-content auto min-content;padding:1em;overflow-y:hidden;border:var(--swal2-toast-border);background:var(--swal2-background);box-shadow:var(--swal2-toast-box-shadow);pointer-events:all}.swal2-toast>*{grid-column:2}.swal2-toast h2:where(.swal2-title){margin:.5em 1em;padding:0;font-size:1em;text-align:initial}.swal2-toast .swal2-loading{justify-content:center}.swal2-toast input:where(.swal2-input){height:2em;margin:.5em;font-size:1em}.swal2-toast .swal2-validation-message{font-size:1em}.swal2-toast div:where(.swal2-footer){margin:.5em 0 0;padding:.5em 0 0;font-size:.8em}.swal2-toast button:where(.swal2-close){grid-column:3/3;grid-row:1/99;align-self:center;width:.8em;height:.8em;margin:0;font-size:2em}.swal2-toast div:where(.swal2-html-container){margin:.5em 1em;padding:0;overflow:initial;font-size:1em;text-align:initial}.swal2-toast div:where(.swal2-html-container):empty{padding:0}.swal2-toast .swal2-loader{grid-column:1;grid-row:1/99;align-self:center;width:2em;height:2em;margin:.25em}.swal2-toast .swal2-icon{grid-column:1;grid-row:1/99;align-self:center;width:2em;min-width:2em;height:2em;margin:0 .5em 0 0}.swal2-toast .swal2-icon .swal2-icon-content{display:flex;align-items:center;font-size:1.8em;font-weight:bold}.swal2-toast .swal2-icon.swal2-success .swal2-success-ring{width:2em;height:2em}.swal2-toast .swal2-icon.swal2-error [class^=swal2-x-mark-line]{top:.875em;width:1.375em}.swal2-toast .swal2-icon.swal2-error [class^=swal2-x-mark-line][class$=left]{left:.3125em}.swal2-toast .swal2-icon.swal2-error [class^=swal2-x-mark-line][class$=right]{right:.3125em}.swal2-toast div:where(.swal2-actions){justify-content:flex-start;height:auto;margin:0;margin-top:.5em;padding:0 .5em}.swal2-toast button:where(.swal2-styled){margin:.25em .5em;padding:.4em .6em;font-size:1em}.swal2-toast .swal2-success{border-color:#a5dc86}.swal2-toast .swal2-success [class^=swal2-success-circular-line]{position:absolute;width:1.6em;height:3em;border-radius:50%}.swal2-toast .swal2-success [class^=swal2-success-circular-line][class$=left]{top:-0.8em;left:-0.5em;transform:rotate(-45deg);transform-origin:2em 2em;border-radius:4em 0 0 4em}.swal2-toast .swal2-success [class^=swal2-success-circular-line][class$=right]{top:-0.25em;left:.9375em;transform-origin:0 1.5em;border-radius:0 4em 4em 0}.swal2-toast .swal2-success .swal2-success-ring{width:2em;height:2em}.swal2-toast .swal2-success .swal2-success-fix{top:0;left:.4375em;width:.4375em;height:2.6875em}.swal2-toast .swal2-success [class^=swal2-success-line]{height:.3125em}.swal2-toast .swal2-success [class^=swal2-success-line][class$=tip]{top:1.125em;left:.1875em;width:.75em}.swal2-toast .swal2-success [class^=swal2-success-line][class$=long]{top:.9375em;right:.1875em;width:1.375em}@container swal2-popup style(--swal2-icon-animations:true){.swal2-toast .swal2-success.swal2-icon-show .swal2-success-line-tip{animation:swal2-toast-animate-success-line-tip .75s}.swal2-toast .swal2-success.swal2-icon-show .swal2-success-line-long{animation:swal2-toast-animate-success-line-long .75s}}.swal2-toast.swal2-show{animation:var(--swal2-toast-show-animation)}.swal2-toast.swal2-hide{animation:var(--swal2-toast-hide-animation)}@keyframes swal2-show{0%{transform:translate3d(0, -50px, 0) scale(0.9);opacity:0}100%{transform:translate3d(0, 0, 0) scale(1);opacity:1}}@keyframes swal2-hide{0%{transform:translate3d(0, 0, 0) scale(1);opacity:1}100%{transform:translate3d(0, -50px, 0) scale(0.9);opacity:0}}@keyframes swal2-animate-success-line-tip{0%{top:1.1875em;left:.0625em;width:0}54%{top:1.0625em;left:.125em;width:0}70%{top:2.1875em;left:-0.375em;width:3.125em}84%{top:3em;left:1.3125em;width:1.0625em}100%{top:2.8125em;left:.8125em;width:1.5625em}}@keyframes swal2-animate-success-line-long{0%{top:3.375em;right:2.875em;width:0}65%{top:3.375em;right:2.875em;width:0}84%{top:2.1875em;right:0;width:3.4375em}100%{top:2.375em;right:.5em;width:2.9375em}}@keyframes swal2-rotate-success-circular-line{0%{transform:rotate(-45deg)}5%{transform:rotate(-45deg)}12%{transform:rotate(-405deg)}100%{transform:rotate(-405deg)}}@keyframes swal2-animate-error-x-mark{0%{margin-top:1.625em;transform:scale(0.4);opacity:0}50%{margin-top:1.625em;transform:scale(0.4);opacity:0}80%{margin-top:-0.375em;transform:scale(1.15)}100%{margin-top:0;transform:scale(1);opacity:1}}@keyframes swal2-animate-error-icon{0%{transform:rotateX(100deg);opacity:0}100%{transform:rotateX(0deg);opacity:1}}@keyframes swal2-rotate-loading{0%{transform:rotate(0deg)}100%{transform:rotate(360deg)}}@keyframes swal2-animate-question-mark{0%{transform:rotateY(-360deg)}100%{transform:rotateY(0)}}@keyframes swal2-animate-i-mark{0%{transform:rotateZ(45deg);opacity:0}25%{transform:rotateZ(-25deg);opacity:.4}50%{transform:rotateZ(15deg);opacity:.8}75%{transform:rotateZ(-5deg);opacity:1}100%{transform:rotateX(0);opacity:1}}@keyframes swal2-toast-show{0%{transform:translateY(-0.625em) rotateZ(2deg)}33%{transform:translateY(0) rotateZ(-2deg)}66%{transform:translateY(0.3125em) rotateZ(2deg)}100%{transform:translateY(0) rotateZ(0deg)}}@keyframes swal2-toast-hide{100%{transform:rotateZ(1deg);opacity:0}}@keyframes swal2-toast-animate-success-line-tip{0%{top:.5625em;left:.0625em;width:0}54%{top:.125em;left:.125em;width:0}70%{top:.625em;left:-0.25em;width:1.625em}84%{top:1.0625em;left:.75em;width:.5em}100%{top:1.125em;left:.1875em;width:.75em}}@keyframes swal2-toast-animate-success-line-long{0%{top:1.625em;right:1.375em;width:0}65%{top:1.25em;right:.9375em;width:0}84%{top:.9375em;right:0;width:1.125em}100%{top:.9375em;right:.1875em;width:1.375em}}"); \ No newline at end of file diff --git a/public/assets/sweetalert2/dist/sweetalert2.all.min.js b/public/assets/sweetalert2/dist/sweetalert2.all.min.js new file mode 100644 index 0000000..28efb45 --- /dev/null +++ b/public/assets/sweetalert2/dist/sweetalert2.all.min.js @@ -0,0 +1,6 @@ +/*! +* sweetalert2 v11.26.18 +* Released under the MIT License. +*/ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).Sweetalert2=t()}(this,function(){"use strict";function e(e,t,n){if("function"==typeof e?e===t:e.has(t))return arguments.length<3?t:n;throw new TypeError("Private element is not present on this object")}function t(t,n){return t.get(e(t,n))}function n(e,t,n){(function(e,t){if(t.has(e))throw new TypeError("Cannot initialize the same private elements twice on an object")})(e,t),t.set(e,n)}const o={},i=e=>new Promise(t=>{if(!e)return t();const n=window.scrollX,i=window.scrollY;o.restoreFocusTimeout=setTimeout(()=>{o.previousActiveElement instanceof HTMLElement?(o.previousActiveElement.focus(),o.previousActiveElement=null):document.body&&document.body.focus(),t()},100),window.scrollTo(n,i)}),s="swal2-",r=["container","shown","height-auto","iosfix","popup","modal","no-backdrop","no-transition","toast","toast-shown","show","hide","close","title","html-container","actions","confirm","deny","cancel","footer","icon","icon-content","image","input","file","range","select","radio","checkbox","label","textarea","inputerror","input-label","validation-message","progress-steps","active-progress-step","progress-step","progress-step-line","loader","loading","styled","top","top-start","top-end","top-left","top-right","center","center-start","center-end","center-left","center-right","bottom","bottom-start","bottom-end","bottom-left","bottom-right","grow-row","grow-column","grow-fullscreen","rtl","timer-progress-bar","timer-progress-bar-container","scrollbar-measure","icon-success","icon-warning","icon-info","icon-question","icon-error","draggable","dragging"].reduce((e,t)=>(e[t]=s+t,e),{}),a=["success","warning","info","question","error"].reduce((e,t)=>(e[t]=s+t,e),{}),l="SweetAlert2:",c=e=>e.charAt(0).toUpperCase()+e.slice(1),u=e=>{console.warn(`${l} ${"object"==typeof e?e.join(" "):e}`)},d=e=>{console.error(`${l} ${e}`)},p=[],m=(e,t=null)=>{var n;n=`"${e}" is deprecated and will be removed in the next major release.${t?` Use "${t}" instead.`:""}`,p.includes(n)||(p.push(n),u(n))},h=e=>"function"==typeof e?e():e,g=e=>e&&"function"==typeof e.toPromise,f=e=>g(e)?e.toPromise():Promise.resolve(e),b=e=>e&&Promise.resolve(e)===e,y=()=>document.body.querySelector(`.${r.container}`),v=e=>{const t=y();return t?t.querySelector(e):null},w=e=>v(`.${e}`),C=()=>w(r.popup),A=()=>w(r.icon),E=()=>w(r.title),k=()=>w(r["html-container"]),B=()=>w(r.image),$=()=>w(r["progress-steps"]),L=()=>w(r["validation-message"]),P=()=>v(`.${r.actions} .${r.confirm}`),x=()=>v(`.${r.actions} .${r.cancel}`),T=()=>v(`.${r.actions} .${r.deny}`),S=()=>v(`.${r.loader}`),O=()=>w(r.actions),M=()=>w(r.footer),j=()=>w(r["timer-progress-bar"]),H=()=>w(r.close),I=()=>{const e=C();if(!e)return[];const t=e.querySelectorAll('[tabindex]:not([tabindex="-1"]):not([tabindex="0"])'),n=Array.from(t).sort((e,t)=>{const n=parseInt(e.getAttribute("tabindex")||"0"),o=parseInt(t.getAttribute("tabindex")||"0");return n>o?1:n"-1"!==e.getAttribute("tabindex"));return[...new Set(n.concat(i))].filter(e=>ee(e))},D=()=>N(document.body,r.shown)&&!N(document.body,r["toast-shown"])&&!N(document.body,r["no-backdrop"]),V=()=>{const e=C();return!!e&&N(e,r.toast)},q=(e,t)=>{if(e.textContent="",t){const n=(new DOMParser).parseFromString(t,"text/html"),o=n.querySelector("head");o&&Array.from(o.childNodes).forEach(t=>{e.appendChild(t)});const i=n.querySelector("body");i&&Array.from(i.childNodes).forEach(t=>{t instanceof HTMLVideoElement||t instanceof HTMLAudioElement?e.appendChild(t.cloneNode(!0)):e.appendChild(t)})}},N=(e,t)=>{if(!t)return!1;const n=t.split(/\s+/);for(let t=0;t{if(((e,t)=>{Array.from(e.classList).forEach(n=>{Object.values(r).includes(n)||Object.values(a).includes(n)||Object.values(t.showClass||{}).includes(n)||e.classList.remove(n)})})(e,t),!t.customClass)return;const o=t.customClass[n];o&&("string"==typeof o||o.forEach?z(e,o):u(`Invalid type of customClass.${n}! Expected string or iterable object, got "${typeof o}"`))},R=(e,t)=>{if(!t)return null;switch(t){case"select":case"textarea":case"file":return e.querySelector(`.${r.popup} > .${r[t]}`);case"checkbox":return e.querySelector(`.${r.popup} > .${r.checkbox} input`);case"radio":return e.querySelector(`.${r.popup} > .${r.radio} input:checked`)||e.querySelector(`.${r.popup} > .${r.radio} input:first-child`);case"range":return e.querySelector(`.${r.popup} > .${r.range} input`);default:return e.querySelector(`.${r.popup} > .${r.input}`)}},F=e=>{if(e.focus(),"file"!==e.type){const t=e.value;e.value="",e.value=t}},U=(e,t,n)=>{e&&t&&("string"==typeof t&&(t=t.split(/\s+/).filter(Boolean)),t.forEach(t=>{Array.isArray(e)?e.forEach(e=>{n?e.classList.add(t):e.classList.remove(t)}):n?e.classList.add(t):e.classList.remove(t)}))},z=(e,t)=>{U(e,t,!0)},W=(e,t)=>{U(e,t,!1)},K=(e,t)=>{const n=Array.from(e.children);for(let e=0;e{n===`${parseInt(`${n}`)}`&&(n=parseInt(n)),n||0===parseInt(`${n}`)?e.style.setProperty(t,"number"==typeof n?`${n}px`:n):e.style.removeProperty(t)},X=(e,t="flex")=>{e&&(e.style.display=t)},Z=e=>{e&&(e.style.display="none")},J=(e,t="block")=>{e&&new MutationObserver(()=>{Q(e,e.innerHTML,t)}).observe(e,{childList:!0,subtree:!0})},G=(e,t,n,o)=>{const i=e.querySelector(t);i&&i.style.setProperty(n,o)},Q=(e,t,n="flex")=>{t?X(e,n):Z(e)},ee=e=>Boolean(e&&(e.offsetWidth||e.offsetHeight||e.getClientRects().length)),te=e=>Boolean(e.scrollHeight>e.clientHeight),ne=e=>{const t=window.getComputedStyle(e),n=parseFloat(t.getPropertyValue("animation-duration")||"0"),o=parseFloat(t.getPropertyValue("transition-duration")||"0");return n>0||o>0},oe=(e,t=!1)=>{const n=j();n&&ee(n)&&(t&&(n.style.transition="none",n.style.width="100%"),setTimeout(()=>{n.style.transition=`width ${e/1e3}s linear`,n.style.width="0%"},10))},ie=`\n
      \n \n
        \n
        \n \n

        \n
        \n \n \n
        \n \n \n
        \n \n
        \n \n \n
        \n
        \n
        \n \n \n \n
        \n
        \n
        \n
        \n
        \n
        \n`.replace(/(^|\n)\s*/g,""),se=()=>{o.currentInstance&&o.currentInstance.resetValidationMessage()},re=e=>{const t=(()=>{const e=y();return!!e&&(e.remove(),W([document.documentElement,document.body],[r["no-backdrop"],r["toast-shown"],r["has-column"]]),!0)})();if("undefined"==typeof window||"undefined"==typeof document)return void d("SweetAlert2 requires document to initialize");const n=document.createElement("div");n.className=r.container,t&&z(n,r["no-transition"]),q(n,ie),n.dataset.swal2Theme=e.theme;const i=(e=>{if("string"==typeof e){const t=document.querySelector(e);if(!t)throw new Error(`Target element "${e}" not found`);return t}return e})(e.target||"body");i.appendChild(n),e.topLayer&&(n.setAttribute("popover",""),n.showPopover()),(e=>{const t=C();t&&(t.setAttribute("role",e.toast?"alert":"dialog"),t.setAttribute("aria-live",e.toast?"polite":"assertive"),e.toast||t.setAttribute("aria-modal","true"))})(e),(e=>{"rtl"===window.getComputedStyle(e).direction&&(z(y(),r.rtl),o.isRTL=!0)})(i),(()=>{const e=C();if(!e)return;const t=K(e,r.input),n=K(e,r.file),o=e.querySelector(`.${r.range} input`),i=e.querySelector(`.${r.range} output`),s=K(e,r.select),a=e.querySelector(`.${r.checkbox} input`),l=K(e,r.textarea);t&&(t.oninput=se),n&&(n.onchange=se),s&&(s.onchange=se),a&&(a.onchange=se),l&&(l.oninput=se),o&&i&&(o.oninput=()=>{se(),i.value=o.value},o.onchange=()=>{se(),i.value=o.value})})()},ae=(e,t)=>{e instanceof HTMLElement?t.appendChild(e):"object"==typeof e?le(e,t):e&&q(t,e)},le=(e,t)=>{"jquery"in e?ce(t,e):q(t,e.toString())},ce=(e,t)=>{if(e.textContent="",0 in t)for(let n=0;n in t;n++)e.appendChild(t[n].cloneNode(!0));else e.appendChild(t.cloneNode(!0))},ue=(e,t)=>{const n=O(),o=S();n&&o&&(t.showConfirmButton||t.showDenyButton||t.showCancelButton?X(n):Z(n),_(n,t,"actions"),function(e,t,n){const o=P(),i=T(),s=x();if(!o||!i||!s)return;pe(o,"confirm",n),pe(i,"deny",n),pe(s,"cancel",n),function(e,t,n,o){if(!o.buttonsStyling)return void W([e,t,n],r.styled);z([e,t,n],r.styled),o.confirmButtonColor&&e.style.setProperty("--swal2-confirm-button-background-color",o.confirmButtonColor);o.denyButtonColor&&t.style.setProperty("--swal2-deny-button-background-color",o.denyButtonColor);o.cancelButtonColor&&n.style.setProperty("--swal2-cancel-button-background-color",o.cancelButtonColor);de(e),de(t),de(n)}(o,i,s,n),n.reverseButtons&&(n.toast?(e.insertBefore(s,o),e.insertBefore(i,o)):(e.insertBefore(s,t),e.insertBefore(i,t),e.insertBefore(o,t)))}(n,o,t),q(o,t.loaderHtml||""),_(o,t,"loader"))};function de(e){const t=window.getComputedStyle(e);if(t.getPropertyValue("--swal2-action-button-focus-box-shadow"))return;const n=t.backgroundColor.replace(/rgba?\((\d+), (\d+), (\d+).*/,"rgba($1, $2, $3, 0.5)");e.style.setProperty("--swal2-action-button-focus-box-shadow",t.getPropertyValue("--swal2-outline").replace(/ rgba\(.*/,` ${n}`))}function pe(e,t,n){const o=c(t);Q(e,n[`show${o}Button`],"inline-block"),q(e,n[`${t}ButtonText`]||""),e.setAttribute("aria-label",n[`${t}ButtonAriaLabel`]||""),e.className=r[t],_(e,n,`${t}Button`)}const me=(e,t)=>{const n=y();n&&(!function(e,t){"string"==typeof t?e.style.background=t:t||z([document.documentElement,document.body],r["no-backdrop"])}(n,t.backdrop),function(e,t){if(!t)return;t in r?z(e,r[t]):(u('The "position" parameter is not valid, defaulting to "center"'),z(e,r.center))}(n,t.position),function(e,t){if(!t)return;z(e,r[`grow-${t}`])}(n,t.grow),_(n,t,"container"))};var he={innerParams:new WeakMap,domCache:new WeakMap};const ge=["input","file","range","select","radio","checkbox","textarea"],fe=e=>{if(!e.input)return;if(!Ee[e.input])return void d(`Unexpected type of input! Expected ${Object.keys(Ee).join(" | ")}, got "${e.input}"`);const t=Ce(e.input);if(!t)return;const n=Ee[e.input](t,e);X(t),e.inputAutoFocus&&setTimeout(()=>{F(n)})},be=(e,t)=>{const n=C();if(!n)return;const o=R(n,e);if(o){(e=>{for(let t=0;t{if(!e.input)return;const t=Ce(e.input);t&&_(t,e,"input")},ve=(e,t)=>{!e.placeholder&&t.inputPlaceholder&&(e.placeholder=t.inputPlaceholder)},we=(e,t,n)=>{if(n.inputLabel){const o=document.createElement("label"),i=r["input-label"];o.setAttribute("for",e.id),o.className=i,"object"==typeof n.customClass&&z(o,n.customClass.inputLabel),o.innerText=n.inputLabel,t.insertAdjacentElement("beforebegin",o)}},Ce=e=>{const t=C();if(t)return K(t,r[e]||r.input)},Ae=(e,t)=>{["string","number"].includes(typeof t)?e.value=`${t}`:b(t)||u(`Unexpected type of inputValue! Expected "string", "number" or "Promise", got "${typeof t}"`)},Ee={};Ee.text=Ee.email=Ee.password=Ee.number=Ee.tel=Ee.url=Ee.search=Ee.date=Ee["datetime-local"]=Ee.time=Ee.week=Ee.month=(e,t)=>{const n=e;return Ae(n,t.inputValue),we(n,n,t),ve(n,t),n.type=t.input,n},Ee.file=(e,t)=>{const n=e;return we(n,n,t),ve(n,t),n},Ee.range=(e,t)=>{const n=e,o=n.querySelector("input"),i=n.querySelector("output");return o&&(Ae(o,t.inputValue),o.type=t.input,we(o,e,t)),i&&Ae(i,t.inputValue),e},Ee.select=(e,t)=>{const n=e;if(n.textContent="",t.inputPlaceholder){const e=document.createElement("option");q(e,t.inputPlaceholder),e.value="",e.disabled=!0,e.selected=!0,n.appendChild(e)}return we(n,n,t),n},Ee.radio=e=>(e.textContent="",e),Ee.checkbox=(e,t)=>{const n=C();if(!n)throw new Error("Popup not found");const o=R(n,"checkbox");if(!o)throw new Error("Checkbox input not found");o.value="1",o.checked=Boolean(t.inputValue);const i=e.querySelector("span");if(i){const e=t.inputPlaceholder||t.inputLabel;e&&q(i,e)}return o},Ee.textarea=(e,t)=>{const n=e;Ae(n,t.inputValue),ve(n,t),we(n,n,t);return setTimeout(()=>{if("MutationObserver"in window){const e=C();if(!e)return;const o=parseInt(window.getComputedStyle(e).width);new MutationObserver(()=>{if(!document.body.contains(n))return;const e=n.offsetWidth+(i=n,parseInt(window.getComputedStyle(i).marginLeft)+parseInt(window.getComputedStyle(i).marginRight));var i;const s=C();s&&(e>o?s.style.width=`${e}px`:Y(s,"width",t.width))}).observe(n,{attributes:!0,attributeFilter:["style"]})}}),n};const ke=(e,t)=>{const n=k();n&&(J(n),_(n,t,"htmlContainer"),t.html?(ae(t.html,n),X(n,"block")):t.text?(n.textContent=t.text,X(n,"block")):Z(n),((e,t)=>{const n=C();if(!n)return;const o=he.innerParams.get(e),i=!o||t.input!==o.input;ge.forEach(e=>{const o=K(n,r[e]);o&&(be(e,t.inputAttributes),o.className=r[e],i&&Z(o))}),t.input&&(i&&fe(t),ye(t))})(e,t))},Be=(e,t)=>{for(const[n,o]of Object.entries(a))t.icon!==n&&W(e,o);z(e,t.icon&&a[t.icon]),Pe(e,t),$e(),_(e,t,"icon")},$e=()=>{const e=C();if(!e)return;const t=window.getComputedStyle(e).getPropertyValue("background-color"),n=e.querySelectorAll("[class^=swal2-success-circular-line], .swal2-success-fix");for(let e=0;e{if(!t.icon&&!t.iconHtml)return;let n=e.innerHTML,o="";if(t.iconHtml)o=xe(t.iconHtml);else if("success"===t.icon)o=(e=>`\n ${e.animation?'
        ':""}\n \n
        \n ${e.animation?'
        ':""}\n ${e.animation?'
        ':""}\n`)(t),n=n.replace(/ style=".*?"/g,"");else if("error"===t.icon)o='\n \n \n \n \n';else if(t.icon){o=xe({question:"?",warning:"!",info:"i"}[t.icon])}n.trim()!==o.trim()&&q(e,o)},Pe=(e,t)=>{if(t.iconColor){e.style.color=t.iconColor,e.style.borderColor=t.iconColor;for(const n of[".swal2-success-line-tip",".swal2-success-line-long",".swal2-x-mark-line-left",".swal2-x-mark-line-right"])G(e,n,"background-color",t.iconColor);G(e,".swal2-success-ring","border-color",t.iconColor)}},xe=e=>`
        ${e}
        `;let Te=!1,Se=0,Oe=0,Me=0,je=0;const He=e=>{const t=C();if(!t)return;const n=A();if(e.target===t||n&&n.contains(e.target)){Te=!0;const n=Ve(e);Se=n.clientX,Oe=n.clientY,Me=parseInt(t.style.insetInlineStart)||0,je=parseInt(t.style.insetBlockStart)||0,z(t,"swal2-dragging")}},Ie=e=>{const t=C();if(t&&Te){let{clientX:n,clientY:i}=Ve(e);const s=n-Se;t.style.insetInlineStart=`${Me+(o.isRTL?-s:s)}px`,t.style.insetBlockStart=`${je+(i-Oe)}px`}},De=()=>{const e=C();Te=!1,W(e,"swal2-dragging")},Ve=e=>{let t=0,n=0;return e.type.startsWith("mouse")?(t=e.clientX,n=e.clientY):e.type.startsWith("touch")&&(t=e.touches[0].clientX,n=e.touches[0].clientY),{clientX:t,clientY:n}},qe=(e,t)=>{const n=y(),o=C();if(n&&o){if(t.toast){Y(n,"width",t.width),o.style.width="100%";const e=S();e&&o.insertBefore(e,A())}else Y(o,"width",t.width);Y(o,"padding",t.padding),t.color&&(o.style.color=t.color),t.background&&(o.style.background=t.background),Z(L()),Ne(o,t),t.draggable&&!t.toast?(z(o,r.draggable),(e=>{e.addEventListener("mousedown",He),document.body.addEventListener("mousemove",Ie),e.addEventListener("mouseup",De),e.addEventListener("touchstart",He),document.body.addEventListener("touchmove",Ie),e.addEventListener("touchend",De)})(o)):(W(o,r.draggable),(e=>{e.removeEventListener("mousedown",He),document.body.removeEventListener("mousemove",Ie),e.removeEventListener("mouseup",De),e.removeEventListener("touchstart",He),document.body.removeEventListener("touchmove",Ie),e.removeEventListener("touchend",De)})(o))}},Ne=(e,t)=>{const n=t.showClass||{};e.className=`${r.popup} ${ee(e)?n.popup:""}`,t.toast?(z([document.documentElement,document.body],r["toast-shown"]),z(e,r.toast)):z(e,r.modal),_(e,t,"popup"),"string"==typeof t.customClass&&z(e,t.customClass),t.icon&&z(e,r[`icon-${t.icon}`])},_e=e=>{const t=document.createElement("li");return z(t,r["progress-step"]),q(t,e),t},Re=e=>{const t=document.createElement("li");return z(t,r["progress-step-line"]),e.progressStepsDistance&&Y(t,"width",e.progressStepsDistance),t},Fe=(e,t)=>{var n;qe(0,t),me(0,t),((e,t)=>{const n=$();if(!n)return;const{progressSteps:o,currentProgressStep:i}=t;o&&0!==o.length&&void 0!==i?(X(n),n.textContent="",i>=o.length&&u("Invalid currentProgressStep parameter, it should be less than progressSteps.length (currentProgressStep like JS arrays starts from 0)"),o.forEach((e,s)=>{const a=_e(e);if(n.appendChild(a),s===i&&z(a,r["active-progress-step"]),s!==o.length-1){const e=Re(t);n.appendChild(e)}})):Z(n)})(0,t),((e,t)=>{const n=he.innerParams.get(e),o=A();if(!o)return;if(n&&t.icon===n.icon)return Le(o,t),void Be(o,t);if(!t.icon&&!t.iconHtml)return void Z(o);if(t.icon&&-1===Object.keys(a).indexOf(t.icon))return d(`Unknown icon! Expected "success", "error", "warning", "info" or "question", got "${t.icon}"`),void Z(o);X(o),Le(o,t),Be(o,t),z(o,t.showClass&&t.showClass.icon),window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change",$e)})(e,t),((e,t)=>{const n=B();n&&(t.imageUrl?(X(n,""),n.setAttribute("src",t.imageUrl),n.setAttribute("alt",t.imageAlt||""),Y(n,"width",t.imageWidth),Y(n,"height",t.imageHeight),n.className=r.image,_(n,t,"image")):Z(n))})(0,t),((e,t)=>{const n=E();n&&(J(n),Q(n,Boolean(t.title||t.titleText),"block"),t.title&&ae(t.title,n),t.titleText&&(n.innerText=t.titleText),_(n,t,"title"))})(0,t),((e,t)=>{const n=H();n&&(q(n,t.closeButtonHtml||""),_(n,t,"closeButton"),Q(n,t.showCloseButton),n.setAttribute("aria-label",t.closeButtonAriaLabel||""))})(0,t),ke(e,t),ue(0,t),((e,t)=>{const n=M();n&&(J(n),Q(n,Boolean(t.footer),"block"),t.footer&&ae(t.footer,n),_(n,t,"footer"))})(0,t);const i=C();"function"==typeof t.didRender&&i&&t.didRender(i),null===(n=o.eventEmitter)||void 0===n||n.emit("didRender",i)},Ue=()=>{var e;return null===(e=P())||void 0===e?void 0:e.click()},ze=Object.freeze({cancel:"cancel",backdrop:"backdrop",close:"close",esc:"esc",timer:"timer"}),We=e=>{if(e.keydownTarget&&e.keydownHandlerAdded&&e.keydownHandler){const t=e.keydownHandler;e.keydownTarget.removeEventListener("keydown",t,{capture:e.keydownListenerCapture}),e.keydownHandlerAdded=!1}},Ke=(e,t)=>{var n;const o=I();if(o.length)return-2===(e+=t)&&(e=o.length-1),e===o.length?e=0:-1===e&&(e=o.length-1),void o[e].focus();null===(n=C())||void 0===n||n.focus()},Ye=["ArrowRight","ArrowDown"],Xe=["ArrowLeft","ArrowUp"],Ze=(e,t,n)=>{e&&(t.isComposing||229===t.keyCode||(e.stopKeydownPropagation&&t.stopPropagation(),"Enter"===t.key?Je(t,e):"Tab"===t.key?Ge(t):[...Ye,...Xe].includes(t.key)?Qe(t.key):"Escape"===t.key&&et(t,e,n)))},Je=(e,t)=>{if(!h(t.allowEnterKey))return;const n=C();if(!n||!t.input)return;const o=R(n,t.input);if(e.target&&o&&e.target instanceof HTMLElement&&e.target.outerHTML===o.outerHTML){if(["textarea","file"].includes(t.input))return;Ue(),e.preventDefault()}},Ge=e=>{const t=e.target,n=I();let o=-1;for(let e=0;e{const t=O(),n=P(),o=T(),i=x();if(!(t&&n&&o&&i))return;const s=[n,o,i];if(document.activeElement instanceof HTMLElement&&!s.includes(document.activeElement))return;const r=Ye.includes(e)?"nextElementSibling":"previousElementSibling";let a=document.activeElement;if(a){for(let e=0;e{e.preventDefault(),h(t.allowEscapeKey)&&n(ze.esc)};var tt={swalPromiseResolve:new WeakMap,swalPromiseReject:new WeakMap};const nt=()=>{Array.from(document.body.children).forEach(e=>{e.hasAttribute("data-previous-aria-hidden")?(e.setAttribute("aria-hidden",e.getAttribute("data-previous-aria-hidden")||""),e.removeAttribute("data-previous-aria-hidden")):e.removeAttribute("aria-hidden")})},ot="undefined"!=typeof window&&Boolean(window.GestureEvent),it=()=>{const e=y();if(!e)return;let t;e.ontouchstart=e=>{t=st(e)},e.ontouchmove=e=>{t&&(e.preventDefault(),e.stopPropagation())}},st=e=>{const t=e.target,n=y(),o=k();return!(!n||!o)&&(!rt(e)&&!at(e)&&(t===n||!(te(n)||!(t instanceof HTMLElement)||((e,t)=>{let n=e;for(;n&&n!==t;){if(te(n))return!0;n=n.parentElement}return!1})(t,o)||"INPUT"===t.tagName||"TEXTAREA"===t.tagName||te(o)&&o.contains(t))))},rt=e=>Boolean(e.touches&&e.touches.length&&"stylus"===e.touches[0].touchType),at=e=>e.touches&&e.touches.length>1;let lt=null;const ct=e=>{null===lt&&(document.body.scrollHeight>window.innerHeight||"scroll"===e)&&(lt=parseInt(window.getComputedStyle(document.body).getPropertyValue("padding-right")),document.body.style.paddingRight=`${lt+(()=>{const e=document.createElement("div");e.className=r["scrollbar-measure"],document.body.appendChild(e);const t=e.getBoundingClientRect().width-e.clientWidth;return document.body.removeChild(e),t})()}px`)};function ut(e,t,n,s){V()?yt(e,s):(i(n).then(()=>yt(e,s)),We(o)),ot?(t.setAttribute("style","display:none !important"),t.removeAttribute("class"),t.innerHTML=""):t.remove(),D()&&(null!==lt&&(document.body.style.paddingRight=`${lt}px`,lt=null),(()=>{if(N(document.body,r.iosfix)){const e=parseInt(document.body.style.top,10);W(document.body,r.iosfix),document.body.style.top="",document.body.scrollTop=-1*e}})(),nt()),W([document.documentElement,document.body],[r.shown,r["height-auto"],r["no-backdrop"],r["toast-shown"]])}function dt(e){e=gt(e);const t=tt.swalPromiseResolve.get(this),n=pt(this);this.isAwaitingPromise?e.isDismissed||(ht(this),t(e)):n&&t(e)}const pt=e=>{const t=C();if(!t)return!1;const n=he.innerParams.get(e);if(!n||N(t,n.hideClass.popup))return!1;W(t,n.showClass.popup),z(t,n.hideClass.popup);const o=y();return W(o,n.showClass.backdrop),z(o,n.hideClass.backdrop),ft(e,t,n),!0};function mt(e){const t=tt.swalPromiseReject.get(this);ht(this),t&&t(e)}const ht=e=>{e.isAwaitingPromise&&(delete e.isAwaitingPromise,he.innerParams.get(e)||e._destroy())},gt=e=>void 0===e?{isConfirmed:!1,isDenied:!1,isDismissed:!0}:Object.assign({isConfirmed:!1,isDenied:!1,isDismissed:!1},e),ft=(e,t,n)=>{var i;const s=y(),r=ne(t);"function"==typeof n.willClose&&n.willClose(t),null===(i=o.eventEmitter)||void 0===i||i.emit("willClose",t),r&&s?bt(e,t,s,Boolean(n.returnFocus),n.didClose):s&&ut(e,s,Boolean(n.returnFocus),n.didClose)},bt=(e,t,n,i,s)=>{o.swalCloseEventFinishedCallback=ut.bind(null,e,n,i,s);const r=function(e){var n;e.target===t&&(null===(n=o.swalCloseEventFinishedCallback)||void 0===n||n.call(o),delete o.swalCloseEventFinishedCallback,t.removeEventListener("animationend",r),t.removeEventListener("transitionend",r))};t.addEventListener("animationend",r),t.addEventListener("transitionend",r)},yt=(e,t)=>{setTimeout(()=>{var n;"function"==typeof t&&t.bind(e.params)(),null===(n=o.eventEmitter)||void 0===n||n.emit("didClose"),e._destroy&&e._destroy()})},vt=e=>{let t=C();if(t||new Qn,t=C(),!t)return;const n=S();V()?Z(A()):wt(t,e),X(n),t.setAttribute("data-loading","true"),t.setAttribute("aria-busy","true"),t.focus()},wt=(e,t)=>{const n=O(),o=S();n&&o&&(!t&&ee(P())&&(t=P()),X(n),t&&(Z(t),o.setAttribute("data-button-to-replace",t.className),n.insertBefore(o,t)),z([e,n],r.loading))},Ct=e=>e.checked?1:0,At=e=>e.checked?e.value:null,Et=e=>e.files&&e.files.length?null!==e.getAttribute("multiple")?e.files:e.files[0]:null,kt=(e,t)=>{const n=C();if(!n)return;const o=e=>{"select"===t.input?function(e,t,n){const o=K(e,r.select);if(!o)return;const i=(e,t,o)=>{const i=document.createElement("option");i.value=o,q(i,t),i.selected=Lt(o,n.inputValue),e.appendChild(i)};t.forEach(e=>{const t=e[0],n=e[1];if(Array.isArray(n)){const e=document.createElement("optgroup");e.label=t,e.disabled=!1,o.appendChild(e),n.forEach(t=>i(e,t[1],t[0]))}else i(o,n,t)}),o.focus()}(n,$t(e),t):"radio"===t.input&&function(e,t,n){const o=K(e,r.radio);if(!o)return;t.forEach(e=>{const t=e[0],i=e[1],s=document.createElement("input"),a=document.createElement("label");s.type="radio",s.name=r.radio,s.value=t,Lt(t,n.inputValue)&&(s.checked=!0);const l=document.createElement("span");q(l,i),l.className=r.label,a.appendChild(s),a.appendChild(l),o.appendChild(a)});const i=o.querySelectorAll("input");i.length&&i[0].focus()}(n,$t(e),t)};g(t.inputOptions)||b(t.inputOptions)?(vt(P()),f(t.inputOptions).then(t=>{e.hideLoading(),o(t)})):"object"==typeof t.inputOptions?o(t.inputOptions):d("Unexpected type of inputOptions! Expected object, Map or Promise, got "+typeof t.inputOptions)},Bt=(e,t)=>{const n=e.getInput();n&&(Z(n),f(t.inputValue).then(o=>{n.value="number"===t.input?`${parseFloat(o)||0}`:`${o}`,X(n),n.focus(),e.hideLoading()}).catch(t=>{d(`Error in inputValue promise: ${t}`),n.value="",X(n),n.focus(),e.hideLoading()}))};const $t=e=>{const t=[];return e instanceof Map?e.forEach((e,n)=>{let o=e;"object"==typeof o&&(o=$t(o)),t.push([n,o])}):Object.keys(e).forEach(n=>{let o=e[n];"object"==typeof o&&(o=$t(o)),t.push([n,o])}),t},Lt=(e,t)=>Boolean(t)&&null!=t&&t.toString()===e.toString(),Pt=(e,t)=>{const n=he.innerParams.get(e);if(!n.input)return void d(`The "input" parameter is needed to be set when using returnInputValueOn${c(t)}`);const o=e.getInput(),i=((e,t)=>{const n=e.getInput();if(!n)return null;switch(t.input){case"checkbox":return Ct(n);case"radio":return At(n);case"file":return Et(n);default:return t.inputAutoTrim?n.value.trim():n.value}})(e,n);n.inputValidator?xt(e,i,t):o&&!o.checkValidity()?(e.enableButtons(),e.showValidationMessage(n.validationMessage||o.validationMessage)):"deny"===t?Tt(e,i):Mt(e,i)},xt=(e,t,n)=>{const o=he.innerParams.get(e);e.disableInput();Promise.resolve().then(()=>f(o.inputValidator(t,o.validationMessage))).then(o=>{e.enableButtons(),e.enableInput(),o?e.showValidationMessage(o):"deny"===n?Tt(e,t):Mt(e,t)})},Tt=(e,t)=>{const n=he.innerParams.get(e);if(n.showLoaderOnDeny&&vt(T()),n.preDeny){e.isAwaitingPromise=!0;Promise.resolve().then(()=>f(n.preDeny(t,n.validationMessage))).then(n=>{!1===n?(e.hideLoading(),ht(e)):e.close({isDenied:!0,value:void 0===n?t:n})}).catch(t=>Ot(e,t))}else e.close({isDenied:!0,value:t})},St=(e,t)=>{e.close({isConfirmed:!0,value:t})},Ot=(e,t)=>{e.rejectPromise(t)},Mt=(e,t)=>{const n=he.innerParams.get(e);if(n.showLoaderOnConfirm&&vt(),n.preConfirm){e.resetValidationMessage(),e.isAwaitingPromise=!0;Promise.resolve().then(()=>f(n.preConfirm(t,n.validationMessage))).then(n=>{ee(L())||!1===n?(e.hideLoading(),ht(e)):St(e,void 0===n?t:n)}).catch(t=>Ot(e,t))}else St(e,t)};function jt(){const e=he.innerParams.get(this);if(!e)return;const t=he.domCache.get(this);Z(t.loader),V()?e.icon&&X(A()):Ht(t),W([t.popup,t.actions],r.loading),t.popup.removeAttribute("aria-busy"),t.popup.removeAttribute("data-loading"),t.confirmButton.disabled=!1,t.denyButton.disabled=!1,t.cancelButton.disabled=!1}const Ht=e=>{const t=e.loader.getAttribute("data-button-to-replace"),n=t?e.popup.getElementsByClassName(t):[];n.length?X(n[0],"inline-block"):ee(P())||ee(T())||ee(x())||Z(e.actions)};function It(){const e=he.innerParams.get(this),t=he.domCache.get(this);return t?R(t.popup,e.input):null}function Dt(e,t,n){const o=he.domCache.get(e);t.forEach(e=>{o[e].disabled=n})}function Vt(e,t){const n=C();if(n&&e)if("radio"===e.type){const e=n.querySelectorAll(`[name="${r.radio}"]`);for(let n=0;nObject.prototype.hasOwnProperty.call(zt,e),Zt=e=>-1!==Wt.indexOf(e),Jt=e=>Kt[e],Gt=e=>{Xt(e)||u(`Unknown parameter "${e}"`)},Qt=e=>{Yt.includes(e)&&u(`The parameter "${e}" is incompatible with toasts`)},en=e=>{const t=Jt(e);t&&m(e,t)},tn=e=>{!1===e.backdrop&&e.allowOutsideClick&&u('"allowOutsideClick" parameter requires `backdrop` parameter to be set to `true`'),e.theme&&!["light","dark","auto","minimal","borderless","bootstrap-4","bootstrap-4-light","bootstrap-4-dark","bootstrap-5","bootstrap-5-light","bootstrap-5-dark","material-ui","material-ui-light","material-ui-dark","embed-iframe","bulma","bulma-light","bulma-dark"].includes(e.theme)&&u(`Invalid theme "${e.theme}"`);for(const t in e)Gt(t),e.toast&&Qt(t),en(t)};function nn(e){const t=y(),n=C(),o=he.innerParams.get(this);if(!n||N(n,o.hideClass.popup))return void u("You're trying to update the closed or closing popup, that won't work. Use the update() method in preConfirm parameter or show a new popup.");const i=on(e),s=Object.assign({},o,i);tn(s),t&&(t.dataset.swal2Theme=s.theme),Fe(this,s),he.innerParams.set(this,s),Object.defineProperties(this,{params:{value:Object.assign({},this.params,e),writable:!1,enumerable:!0}})}const on=e=>{const t={};return Object.keys(e).forEach(n=>{if(Zt(n)){const o=e;t[n]=o[n]}else u(`Invalid parameter to update: ${n}`)}),t};function sn(){var e;const t=he.domCache.get(this),n=he.innerParams.get(this);n?(t.popup&&o.swalCloseEventFinishedCallback&&(o.swalCloseEventFinishedCallback(),delete o.swalCloseEventFinishedCallback),"function"==typeof n.didDestroy&&n.didDestroy(),null===(e=o.eventEmitter)||void 0===e||e.emit("didDestroy"),rn(this)):an(this)}const rn=e=>{an(e),delete e.params,delete o.keydownHandler,delete o.keydownTarget,delete o.currentInstance},an=e=>{e.isAwaitingPromise?(ln(he,e),e.isAwaitingPromise=!0):(ln(tt,e),ln(he,e),delete e.isAwaitingPromise,delete e.disableButtons,delete e.enableButtons,delete e.getInput,delete e.disableInput,delete e.enableInput,delete e.hideLoading,delete e.disableLoading,delete e.showValidationMessage,delete e.resetValidationMessage,delete e.close,delete e.closePopup,delete e.closeModal,delete e.closeToast,delete e.rejectPromise,delete e.update,delete e._destroy)},ln=(e,t)=>{for(const n in e)e[n].delete(t)};var cn=Object.freeze({__proto__:null,_destroy:sn,close:dt,closeModal:dt,closePopup:dt,closeToast:dt,disableButtons:Nt,disableInput:Rt,disableLoading:jt,enableButtons:qt,enableInput:_t,getInput:It,handleAwaitingPromise:ht,hideLoading:jt,rejectPromise:mt,resetValidationMessage:Ut,showValidationMessage:Ft,update:nn});const un=(e,t,n)=>{t.popup.onclick=()=>{e&&(dn(e)||e.timer||e.input)||n(ze.close)}},dn=e=>Boolean(e.showConfirmButton||e.showDenyButton||e.showCancelButton||e.showCloseButton);let pn=!1;const mn=e=>{e.popup.onmousedown=()=>{e.container.onmouseup=function(t){e.container.onmouseup=()=>{},t.target===e.container&&(pn=!0)}}},hn=e=>{e.container.onmousedown=t=>{t.target===e.container&&t.preventDefault(),e.popup.onmouseup=function(t){e.popup.onmouseup=()=>{},(t.target===e.popup||t.target instanceof HTMLElement&&e.popup.contains(t.target))&&(pn=!0)}}},gn=(e,t,n)=>{t.container.onclick=o=>{pn?pn=!1:o.target===t.container&&h(e.allowOutsideClick)&&n(ze.backdrop)}},fn=e=>e instanceof Element||(e=>"object"==typeof e&&null!==e&&"jquery"in e)(e);const bn=()=>{if(o.timeout)return(()=>{const e=j();if(!e)return;const t=parseInt(window.getComputedStyle(e).width);e.style.removeProperty("transition"),e.style.width="100%";const n=t/parseInt(window.getComputedStyle(e).width)*100;e.style.width=`${n}%`})(),o.timeout.stop()},yn=()=>{if(o.timeout){const e=o.timeout.start();return oe(e),e}};let vn=!1;const wn={};const Cn=e=>{for(let t=e.target;t&&t!==document;t=t.parentNode)for(const e in wn){const n=t.getAttribute&&t.getAttribute(e);if(n)return void wn[e].fire({template:n})}};o.eventEmitter=new class{constructor(){this.events={}}_getHandlersByEventName(e){return void 0===this.events[e]&&(this.events[e]=[]),this.events[e]}on(e,t){const n=this._getHandlersByEventName(e);n.includes(t)||n.push(t)}once(e,t){const n=(...o)=>{this.removeListener(e,n),t.apply(this,o)};this.on(e,n)}emit(e,...t){this._getHandlersByEventName(e).forEach(e=>{try{e.apply(this,t)}catch(e){console.error(e)}})}removeListener(e,t){const n=this._getHandlersByEventName(e),o=n.indexOf(t);o>-1&&n.splice(o,1)}removeAllListeners(e){void 0!==this.events[e]&&(this.events[e].length=0)}reset(){this.events={}}};var An=Object.freeze({__proto__:null,argsToParams:e=>{const t={};return"object"!=typeof e[0]||fn(e[0])?["title","html","icon"].forEach((n,o)=>{const i=e[o];"string"==typeof i||fn(i)?t[n]=i:void 0!==i&&d(`Unexpected type of ${n}! Expected "string" or "Element", got ${typeof i}`)}):Object.assign(t,e[0]),t},bindClickHandler:function(e="data-swal-template"){wn[e]=this,vn||(document.body.addEventListener("click",Cn),vn=!0)},clickCancel:()=>{var e;return null===(e=x())||void 0===e?void 0:e.click()},clickConfirm:Ue,clickDeny:()=>{var e;return null===(e=T())||void 0===e?void 0:e.click()},enableLoading:vt,fire:function(...e){return new this(...e)},getActions:O,getCancelButton:x,getCloseButton:H,getConfirmButton:P,getContainer:y,getDenyButton:T,getFocusableElements:I,getFooter:M,getHtmlContainer:k,getIcon:A,getIconContent:()=>w(r["icon-content"]),getImage:B,getInputLabel:()=>w(r["input-label"]),getLoader:S,getPopup:C,getProgressSteps:$,getTimerLeft:()=>o.timeout&&o.timeout.getTimerLeft(),getTimerProgressBar:j,getTitle:E,getValidationMessage:L,increaseTimer:e=>{if(o.timeout){const t=o.timeout.increase(e);return oe(t,!0),t}},isDeprecatedParameter:Jt,isLoading:()=>{const e=C();return!!e&&e.hasAttribute("data-loading")},isTimerRunning:()=>Boolean(o.timeout&&o.timeout.isRunning()),isUpdatableParameter:Zt,isValidParameter:Xt,isVisible:()=>ee(C()),mixin:function(e){return class extends(this){_main(t,n){return super._main(t,Object.assign({},e,n))}}},off:(e,t)=>{o.eventEmitter&&(e?t?o.eventEmitter.removeListener(e,t):o.eventEmitter.removeAllListeners(e):o.eventEmitter.reset())},on:(e,t)=>{o.eventEmitter&&o.eventEmitter.on(e,t)},once:(e,t)=>{o.eventEmitter&&o.eventEmitter.once(e,t)},resumeTimer:yn,showLoading:vt,stopTimer:bn,toggleTimer:()=>{const e=o.timeout;return e&&(e.running?bn():yn())}});class En{constructor(e,t){this.callback=e,this.remaining=t,this.running=!1,this.start()}start(){return this.running||(this.running=!0,this.started=new Date,this.id=setTimeout(this.callback,this.remaining)),this.remaining}stop(){return this.started&&this.running&&(this.running=!1,clearTimeout(this.id),this.remaining-=(new Date).getTime()-this.started.getTime()),this.remaining}increase(e){const t=this.running;return t&&this.stop(),this.remaining+=e,t&&this.start(),this.remaining}getTimerLeft(){return this.running&&(this.stop(),this.start()),this.remaining}isRunning(){return this.running}}const kn=["swal-title","swal-html","swal-footer"],Bn=e=>{const t={};return Array.from(e.querySelectorAll("swal-param")).forEach(e=>{Mn(e,["name","value"]);const n=e.getAttribute("name"),o=e.getAttribute("value");n&&o&&(t[n]=n in zt&&"boolean"==typeof zt[n]?"false"!==o:n in zt&&"object"==typeof zt[n]?JSON.parse(o):o)}),t},$n=e=>{const t={};return Array.from(e.querySelectorAll("swal-function-param")).forEach(e=>{const n=e.getAttribute("name"),o=e.getAttribute("value");n&&o&&(t[n]=new Function(`return ${o}`)())}),t},Ln=e=>{const t={};return Array.from(e.querySelectorAll("swal-button")).forEach(e=>{Mn(e,["type","color","aria-label"]);const n=e.getAttribute("type");if(n&&["confirm","cancel","deny"].includes(n)){if(t[`${n}ButtonText`]=e.innerHTML,t[`show${c(n)}Button`]=!0,e.hasAttribute("color")){const o=e.getAttribute("color");null!==o&&(t[`${n}ButtonColor`]=o)}if(e.hasAttribute("aria-label")){const o=e.getAttribute("aria-label");null!==o&&(t[`${n}ButtonAriaLabel`]=o)}}}),t},Pn=e=>{const t={},n=e.querySelector("swal-image");return n&&(Mn(n,["src","width","height","alt"]),n.hasAttribute("src")&&(t.imageUrl=n.getAttribute("src")||void 0),n.hasAttribute("width")&&(t.imageWidth=n.getAttribute("width")||void 0),n.hasAttribute("height")&&(t.imageHeight=n.getAttribute("height")||void 0),n.hasAttribute("alt")&&(t.imageAlt=n.getAttribute("alt")||void 0)),t},xn=e=>{const t={},n=e.querySelector("swal-icon");return n&&(Mn(n,["type","color"]),n.hasAttribute("type")&&(t.icon=n.getAttribute("type")),n.hasAttribute("color")&&(t.iconColor=n.getAttribute("color")),t.iconHtml=n.innerHTML),t},Tn=e=>{const t={},n=e.querySelector("swal-input");n&&(Mn(n,["type","label","placeholder","value"]),t.input=n.getAttribute("type")||"text",n.hasAttribute("label")&&(t.inputLabel=n.getAttribute("label")),n.hasAttribute("placeholder")&&(t.inputPlaceholder=n.getAttribute("placeholder")),n.hasAttribute("value")&&(t.inputValue=n.getAttribute("value")));const o=Array.from(e.querySelectorAll("swal-input-option"));return o.length&&(t.inputOptions={},o.forEach(e=>{Mn(e,["value"]);const n=e.getAttribute("value");if(!n)return;const o=e.innerHTML;t.inputOptions[n]=o})),t},Sn=(e,t)=>{const n={};for(const o in t){const i=t[o],s=e.querySelector(i);s&&(Mn(s,[]),n[i.replace(/^swal-/,"")]=s.innerHTML.trim())}return n},On=e=>{const t=kn.concat(["swal-param","swal-function-param","swal-button","swal-image","swal-icon","swal-input","swal-input-option"]);Array.from(e.children).forEach(e=>{const n=e.tagName.toLowerCase();t.includes(n)||u(`Unrecognized element <${n}>`)})},Mn=(e,t)=>{Array.from(e.attributes).forEach(n=>{-1===t.indexOf(n.name)&&u([`Unrecognized attribute "${n.name}" on <${e.tagName.toLowerCase()}>.`,""+(t.length?`Allowed attributes are: ${t.join(", ")}`:"To set the value, use HTML within the element.")])})},jn=e=>{var t,n;const i=y(),s=C();if(!i||!s)return;"function"==typeof e.willOpen&&e.willOpen(s),null===(t=o.eventEmitter)||void 0===t||t.emit("willOpen",s);const r=window.getComputedStyle(document.body).overflowY;if(Vn(i,s,e),setTimeout(()=>{In(i,s)},10),D()&&(Dn(i,void 0!==e.scrollbarPadding&&e.scrollbarPadding,r),(()=>{const e=y();Array.from(document.body.children).forEach(t=>{t.contains(e)||(t.hasAttribute("aria-hidden")&&t.setAttribute("data-previous-aria-hidden",t.getAttribute("aria-hidden")||""),t.setAttribute("aria-hidden","true"))})})()),V()||o.previousActiveElement||(o.previousActiveElement=document.activeElement),"function"==typeof e.didOpen){const t=e.didOpen;setTimeout(()=>t(s))}null===(n=o.eventEmitter)||void 0===n||n.emit("didOpen",s)},Hn=e=>{const t=C();if(!t||e.target!==t)return;const n=y();n&&(t.removeEventListener("animationend",Hn),t.removeEventListener("transitionend",Hn),n.style.overflowY="auto",W(n,r["no-transition"]))},In=(e,t)=>{ne(t)?(e.style.overflowY="hidden",t.addEventListener("animationend",Hn),t.addEventListener("transitionend",Hn)):e.style.overflowY="auto"},Dn=(e,t,n)=>{(()=>{if(ot&&!N(document.body,r.iosfix)){const e=document.body.scrollTop;document.body.style.top=-1*e+"px",z(document.body,r.iosfix),it()}})(),t&&"hidden"!==n&&ct(n),setTimeout(()=>{e.scrollTop=0})},Vn=(e,t,n)=>{var o;null!==(o=n.showClass)&&void 0!==o&&o.backdrop&&z(e,n.showClass.backdrop),n.animation?(t.style.setProperty("opacity","0","important"),X(t,"grid"),setTimeout(()=>{var e;null!==(e=n.showClass)&&void 0!==e&&e.popup&&z(t,n.showClass.popup),t.style.removeProperty("opacity")},10)):X(t,"grid"),z([document.documentElement,document.body],r.shown),n.heightAuto&&n.backdrop&&!n.toast&&z([document.documentElement,document.body],r["height-auto"])};var qn=(e,t)=>/^[a-zA-Z0-9.+_'-]+@[a-zA-Z0-9.-]+\.[a-zA-Z0-9-]+$/.test(e)?Promise.resolve():Promise.resolve(t||"Invalid email address"),Nn=(e,t)=>/^https?:\/\/(www\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\.[a-z]{2,63}\b([-a-zA-Z0-9@:%_+.~#?&/=]*)$/.test(e)?Promise.resolve():Promise.resolve(t||"Invalid URL");function _n(e){!function(e){e.inputValidator||("email"===e.input&&(e.inputValidator=qn),"url"===e.input&&(e.inputValidator=Nn))}(e),e.showLoaderOnConfirm&&!e.preConfirm&&u("showLoaderOnConfirm is set to true, but preConfirm is not defined.\nshowLoaderOnConfirm should be used together with preConfirm, see usage example:\nhttps://sweetalert2.github.io/#ajax-request"),function(e){(!e.target||"string"==typeof e.target&&!document.querySelector(e.target)||"string"!=typeof e.target&&!e.target.appendChild)&&(u('Target parameter is not valid, defaulting to "body"'),e.target="body")}(e),"string"==typeof e.title&&(e.title=e.title.split("\n").join("
        ")),re(e)}let Rn;var Fn=new WeakMap;class Un{constructor(...t){if(n(this,Fn,Promise.resolve({isConfirmed:!1,isDenied:!1,isDismissed:!0})),"undefined"==typeof window)return;Rn=this;const o=Object.freeze(this.constructor.argsToParams(t));var i,s,r;this.params=o,this.isAwaitingPromise=!1,i=Fn,s=this,r=this._main(Rn.params),i.set(e(i,s),r)}_main(e,t={}){if(tn(Object.assign({},t,e)),o.currentInstance){const e=tt.swalPromiseResolve.get(o.currentInstance),{isAwaitingPromise:t}=o.currentInstance;o.currentInstance._destroy(),t||e({isDismissed:!0}),D()&&nt()}o.currentInstance=Rn;const n=Wn(e,t);_n(n),Object.freeze(n),o.timeout&&(o.timeout.stop(),delete o.timeout),clearTimeout(o.restoreFocusTimeout);const i=Kn(Rn);return Fe(Rn,n),he.innerParams.set(Rn,n),zn(Rn,i,n)}then(e){return t(Fn,this).then(e)}finally(e){return t(Fn,this).finally(e)}}const zn=(e,t,n)=>new Promise((i,s)=>{const r=t=>{e.close({isDismissed:!0,dismiss:t,isConfirmed:!1,isDenied:!1})};tt.swalPromiseResolve.set(e,i),tt.swalPromiseReject.set(e,s),t.confirmButton.onclick=()=>{(e=>{const t=he.innerParams.get(e);e.disableButtons(),t.input?Pt(e,"confirm"):Mt(e,!0)})(e)},t.denyButton.onclick=()=>{(e=>{const t=he.innerParams.get(e);e.disableButtons(),t.returnInputValueOnDeny?Pt(e,"deny"):Tt(e,!1)})(e)},t.cancelButton.onclick=()=>{((e,t)=>{e.disableButtons(),t(ze.cancel)})(e,r)},t.closeButton.onclick=()=>{r(ze.close)},((e,t,n)=>{e.toast?un(e,t,n):(mn(t),hn(t),gn(e,t,n))})(n,t,r),((e,t,n)=>{if(We(e),!t.toast){const o=e=>Ze(t,e,n);e.keydownHandler=o;const i=t.keydownListenerCapture?window:C();if(i){e.keydownTarget=i,e.keydownListenerCapture=t.keydownListenerCapture;const n=o;e.keydownTarget.addEventListener("keydown",n,{capture:e.keydownListenerCapture}),e.keydownHandlerAdded=!0}}})(o,n,r),((e,t)=>{"select"===t.input||"radio"===t.input?kt(e,t):["text","email","number","tel","textarea"].some(e=>e===t.input)&&(g(t.inputValue)||b(t.inputValue))&&(vt(P()),Bt(e,t))})(e,n),jn(n),Yn(o,n,r),Xn(t,n),setTimeout(()=>{t.container.scrollTop=0})}),Wn=(e,t)=>{const n=(e=>{const t="string"==typeof e.template?document.querySelector(e.template):e.template;if(!t)return{};const n=t.content;return On(n),Object.assign(Bn(n),$n(n),Ln(n),Pn(n),xn(n),Tn(n),Sn(n,kn))})(e),o=Object.assign({},zt,t,n,e);return o.showClass=Object.assign({},zt.showClass,o.showClass),o.hideClass=Object.assign({},zt.hideClass,o.hideClass),!1===o.animation&&(o.showClass={backdrop:"swal2-noanimation"},o.hideClass={}),o},Kn=e=>{const t={popup:C(),container:y(),actions:O(),confirmButton:P(),denyButton:T(),cancelButton:x(),loader:S(),closeButton:H(),validationMessage:L(),progressSteps:$()};return he.domCache.set(e,t),t},Yn=(e,t,n)=>{const o=j();Z(o),t.timer&&(e.timeout=new En(()=>{n("timer"),delete e.timeout},t.timer),t.timerProgressBar&&o&&(X(o),_(o,t,"timerProgressBar"),setTimeout(()=>{e.timeout&&e.timeout.running&&oe(t.timer)})))},Xn=(e,t)=>{if(!t.toast)return h(t.allowEnterKey)?void(Zn(e)||Jn(e,t)||Ke(-1,1)):(m("allowEnterKey"),void Gn())},Zn=e=>{const t=Array.from(e.popup.querySelectorAll("[autofocus]"));for(const e of t)if(e instanceof HTMLElement&&ee(e))return e.focus(),!0;return!1},Jn=(e,t)=>t.focusDeny&&ee(e.denyButton)?(e.denyButton.focus(),!0):t.focusCancel&&ee(e.cancelButton)?(e.cancelButton.focus(),!0):!(!t.focusConfirm||!ee(e.confirmButton))&&(e.confirmButton.focus(),!0),Gn=()=>{document.activeElement instanceof HTMLElement&&"function"==typeof document.activeElement.blur&&document.activeElement.blur()};Un.prototype.disableButtons=Nt,Un.prototype.enableButtons=qt,Un.prototype.getInput=It,Un.prototype.disableInput=Rt,Un.prototype.enableInput=_t,Un.prototype.hideLoading=jt,Un.prototype.disableLoading=jt,Un.prototype.showValidationMessage=Ft,Un.prototype.resetValidationMessage=Ut,Un.prototype.close=dt,Un.prototype.closePopup=dt,Un.prototype.closeModal=dt,Un.prototype.closeToast=dt,Un.prototype.rejectPromise=mt,Un.prototype.update=nn,Un.prototype._destroy=sn,Object.assign(Un,An),Object.keys(cn).forEach(e=>{Un[e]=function(...t){if(Rn&&Rn[e])return Rn[e](...t)}}),Un.DismissReason=ze,Un.version="11.26.18";const Qn=Un;return Qn.default=Qn,Qn}),void 0!==this&&this.Sweetalert2&&(this.swal=this.sweetAlert=this.Swal=this.SweetAlert=this.Sweetalert2); +"undefined"!=typeof document&&function(e,t){var n=e.createElement("style");if(e.getElementsByTagName("head")[0].appendChild(n),n.styleSheet)n.styleSheet.disabled||(n.styleSheet.cssText=t);else try{n.innerHTML=t}catch(e){n.innerText=t}}(document,":root{--swal2-outline: 0 0 0 3px rgba(100, 150, 200, 0.5);--swal2-container-padding: 0.625em;--swal2-backdrop: rgba(0, 0, 0, 0.4);--swal2-backdrop-transition: background-color 0.15s;--swal2-width: 32em;--swal2-padding: 0 0 1.25em;--swal2-border: none;--swal2-border-radius: 0.3125rem;--swal2-background: white;--swal2-color: #545454;--swal2-show-animation: swal2-show 0.3s;--swal2-hide-animation: swal2-hide 0.15s forwards;--swal2-icon-zoom: 1;--swal2-icon-animations: true;--swal2-title-padding: 0.8em 1em 0;--swal2-html-container-padding: 1em 1.6em 0.3em;--swal2-input-border: 1px solid #d9d9d9;--swal2-input-border-radius: 0.1875em;--swal2-input-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.06), 0 0 0 3px transparent;--swal2-input-background: transparent;--swal2-input-transition: border-color 0.2s, box-shadow 0.2s;--swal2-input-hover-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.06), 0 0 0 3px transparent;--swal2-input-focus-border: 1px solid #b4dbed;--swal2-input-focus-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.06), 0 0 0 3px rgba(100, 150, 200, 0.5);--swal2-progress-step-background: #add8e6;--swal2-validation-message-background: #f0f0f0;--swal2-validation-message-color: #666;--swal2-footer-border-color: #eee;--swal2-footer-background: transparent;--swal2-footer-color: inherit;--swal2-timer-progress-bar-background: rgba(0, 0, 0, 0.3);--swal2-close-button-position: initial;--swal2-close-button-inset: auto;--swal2-close-button-font-size: 2.5em;--swal2-close-button-color: #ccc;--swal2-close-button-transition: color 0.2s, box-shadow 0.2s;--swal2-close-button-outline: initial;--swal2-close-button-box-shadow: inset 0 0 0 3px transparent;--swal2-close-button-focus-box-shadow: inset var(--swal2-outline);--swal2-close-button-hover-transform: none;--swal2-actions-justify-content: center;--swal2-actions-width: auto;--swal2-actions-margin: 1.25em auto 0;--swal2-actions-padding: 0;--swal2-actions-border-radius: 0;--swal2-actions-background: transparent;--swal2-action-button-transition: background-color 0.2s, box-shadow 0.2s;--swal2-action-button-hover: black 10%;--swal2-action-button-active: black 10%;--swal2-confirm-button-box-shadow: none;--swal2-confirm-button-border-radius: 0.25em;--swal2-confirm-button-background-color: #7066e0;--swal2-confirm-button-color: #fff;--swal2-deny-button-box-shadow: none;--swal2-deny-button-border-radius: 0.25em;--swal2-deny-button-background-color: #dc3741;--swal2-deny-button-color: #fff;--swal2-cancel-button-box-shadow: none;--swal2-cancel-button-border-radius: 0.25em;--swal2-cancel-button-background-color: #6e7881;--swal2-cancel-button-color: #fff;--swal2-toast-show-animation: swal2-toast-show 0.5s;--swal2-toast-hide-animation: swal2-toast-hide 0.1s forwards;--swal2-toast-border: none;--swal2-toast-box-shadow: 0 0 1px hsl(0deg 0% 0% / 0.075), 0 1px 2px hsl(0deg 0% 0% / 0.075), 1px 2px 4px hsl(0deg 0% 0% / 0.075), 1px 3px 8px hsl(0deg 0% 0% / 0.075), 2px 4px 16px hsl(0deg 0% 0% / 0.075)}[data-swal2-theme=dark]{--swal2-dark-theme-black: #19191a;--swal2-dark-theme-white: #e1e1e1;--swal2-background: var(--swal2-dark-theme-black);--swal2-color: var(--swal2-dark-theme-white);--swal2-footer-border-color: #555;--swal2-input-background: color-mix(in srgb, var(--swal2-dark-theme-black), var(--swal2-dark-theme-white) 10%);--swal2-validation-message-background: color-mix( in srgb, var(--swal2-dark-theme-black), var(--swal2-dark-theme-white) 10% );--swal2-validation-message-color: var(--swal2-dark-theme-white);--swal2-timer-progress-bar-background: rgba(255, 255, 255, 0.7)}@media(prefers-color-scheme: dark){[data-swal2-theme=auto]{--swal2-dark-theme-black: #19191a;--swal2-dark-theme-white: #e1e1e1;--swal2-background: var(--swal2-dark-theme-black);--swal2-color: var(--swal2-dark-theme-white);--swal2-footer-border-color: #555;--swal2-input-background: color-mix(in srgb, var(--swal2-dark-theme-black), var(--swal2-dark-theme-white) 10%);--swal2-validation-message-background: color-mix( in srgb, var(--swal2-dark-theme-black), var(--swal2-dark-theme-white) 10% );--swal2-validation-message-color: var(--swal2-dark-theme-white);--swal2-timer-progress-bar-background: rgba(255, 255, 255, 0.7)}}body.swal2-shown:not(.swal2-no-backdrop,.swal2-toast-shown){overflow:hidden}body.swal2-height-auto{height:auto !important}body.swal2-no-backdrop .swal2-container{background-color:rgba(0,0,0,0) !important;pointer-events:none}body.swal2-no-backdrop .swal2-container .swal2-popup{pointer-events:all}body.swal2-no-backdrop .swal2-container .swal2-modal{box-shadow:0 0 10px var(--swal2-backdrop)}body.swal2-toast-shown .swal2-container{box-sizing:border-box;width:360px;max-width:100%;background-color:rgba(0,0,0,0);pointer-events:none}body.swal2-toast-shown .swal2-container.swal2-top{inset:0 auto auto 50%;transform:translateX(-50%)}body.swal2-toast-shown .swal2-container.swal2-top-end,body.swal2-toast-shown .swal2-container.swal2-top-right{inset:0 0 auto auto}body.swal2-toast-shown .swal2-container.swal2-top-start,body.swal2-toast-shown .swal2-container.swal2-top-left{inset:0 auto auto 0}body.swal2-toast-shown .swal2-container.swal2-center-start,body.swal2-toast-shown .swal2-container.swal2-center-left{inset:50% auto auto 0;transform:translateY(-50%)}body.swal2-toast-shown .swal2-container.swal2-center{inset:50% auto auto 50%;transform:translate(-50%, -50%)}body.swal2-toast-shown .swal2-container.swal2-center-end,body.swal2-toast-shown .swal2-container.swal2-center-right{inset:50% 0 auto auto;transform:translateY(-50%)}body.swal2-toast-shown .swal2-container.swal2-bottom-start,body.swal2-toast-shown .swal2-container.swal2-bottom-left{inset:auto auto 0 0}body.swal2-toast-shown .swal2-container.swal2-bottom{inset:auto auto 0 50%;transform:translateX(-50%)}body.swal2-toast-shown .swal2-container.swal2-bottom-end,body.swal2-toast-shown .swal2-container.swal2-bottom-right{inset:auto 0 0 auto}@media print{body.swal2-shown:not(.swal2-no-backdrop,.swal2-toast-shown){overflow-y:scroll !important}body.swal2-shown:not(.swal2-no-backdrop,.swal2-toast-shown)>[aria-hidden=true]{display:none}body.swal2-shown:not(.swal2-no-backdrop,.swal2-toast-shown) .swal2-container{position:static !important}}div:where(.swal2-container){display:grid;position:fixed;z-index:1060;inset:0;box-sizing:border-box;grid-template-areas:\"top-start top top-end\" \"center-start center center-end\" \"bottom-start bottom-center bottom-end\";grid-template-rows:minmax(min-content, auto) minmax(min-content, auto) minmax(min-content, auto);height:100%;padding:var(--swal2-container-padding);overflow-x:hidden;transition:var(--swal2-backdrop-transition);-webkit-overflow-scrolling:touch}div:where(.swal2-container).swal2-backdrop-show,div:where(.swal2-container).swal2-noanimation{background:var(--swal2-backdrop)}div:where(.swal2-container).swal2-backdrop-hide{background:rgba(0,0,0,0) !important}div:where(.swal2-container).swal2-top-start,div:where(.swal2-container).swal2-center-start,div:where(.swal2-container).swal2-bottom-start{grid-template-columns:minmax(0, 1fr) auto auto}div:where(.swal2-container).swal2-top,div:where(.swal2-container).swal2-center,div:where(.swal2-container).swal2-bottom{grid-template-columns:auto minmax(0, 1fr) auto}div:where(.swal2-container).swal2-top-end,div:where(.swal2-container).swal2-center-end,div:where(.swal2-container).swal2-bottom-end{grid-template-columns:auto auto minmax(0, 1fr)}div:where(.swal2-container).swal2-top-start>.swal2-popup{align-self:start}div:where(.swal2-container).swal2-top>.swal2-popup{grid-column:2;place-self:start center}div:where(.swal2-container).swal2-top-end>.swal2-popup,div:where(.swal2-container).swal2-top-right>.swal2-popup{grid-column:3;place-self:start end}div:where(.swal2-container).swal2-center-start>.swal2-popup,div:where(.swal2-container).swal2-center-left>.swal2-popup{grid-row:2;align-self:center}div:where(.swal2-container).swal2-center>.swal2-popup{grid-column:2;grid-row:2;place-self:center center}div:where(.swal2-container).swal2-center-end>.swal2-popup,div:where(.swal2-container).swal2-center-right>.swal2-popup{grid-column:3;grid-row:2;place-self:center end}div:where(.swal2-container).swal2-bottom-start>.swal2-popup,div:where(.swal2-container).swal2-bottom-left>.swal2-popup{grid-column:1;grid-row:3;align-self:end}div:where(.swal2-container).swal2-bottom>.swal2-popup{grid-column:2;grid-row:3;place-self:end center}div:where(.swal2-container).swal2-bottom-end>.swal2-popup,div:where(.swal2-container).swal2-bottom-right>.swal2-popup{grid-column:3;grid-row:3;place-self:end end}div:where(.swal2-container).swal2-grow-row>.swal2-popup,div:where(.swal2-container).swal2-grow-fullscreen>.swal2-popup{grid-column:1/4;width:100%}div:where(.swal2-container).swal2-grow-column>.swal2-popup,div:where(.swal2-container).swal2-grow-fullscreen>.swal2-popup{grid-row:1/4;align-self:stretch}div:where(.swal2-container).swal2-no-transition{transition:none !important}div:where(.swal2-container)[popover]{width:auto;border:0}div:where(.swal2-container) div:where(.swal2-popup){display:none;position:relative;box-sizing:border-box;grid-template-columns:minmax(0, 100%);width:var(--swal2-width);max-width:100%;padding:var(--swal2-padding);border:var(--swal2-border);border-radius:var(--swal2-border-radius);background:var(--swal2-background);color:var(--swal2-color);font-family:inherit;font-size:1rem;container-name:swal2-popup}div:where(.swal2-container) div:where(.swal2-popup):focus{outline:none}div:where(.swal2-container) div:where(.swal2-popup).swal2-loading{overflow-y:hidden}div:where(.swal2-container) div:where(.swal2-popup).swal2-draggable{cursor:grab}div:where(.swal2-container) div:where(.swal2-popup).swal2-draggable div:where(.swal2-icon){cursor:grab}div:where(.swal2-container) div:where(.swal2-popup).swal2-dragging{cursor:grabbing}div:where(.swal2-container) div:where(.swal2-popup).swal2-dragging div:where(.swal2-icon){cursor:grabbing}div:where(.swal2-container) h2:where(.swal2-title){position:relative;max-width:100%;margin:0;padding:var(--swal2-title-padding);color:inherit;font-size:1.875em;font-weight:600;text-align:center;text-transform:none;overflow-wrap:break-word;cursor:initial}div:where(.swal2-container) div:where(.swal2-actions){display:flex;z-index:1;box-sizing:border-box;flex-wrap:wrap;align-items:center;justify-content:var(--swal2-actions-justify-content);width:var(--swal2-actions-width);margin:var(--swal2-actions-margin);padding:var(--swal2-actions-padding);border-radius:var(--swal2-actions-border-radius);background:var(--swal2-actions-background)}div:where(.swal2-container) div:where(.swal2-loader){display:none;align-items:center;justify-content:center;width:2.2em;height:2.2em;margin:0 1.875em;animation:swal2-rotate-loading 1.5s linear 0s infinite normal;border-width:.25em;border-style:solid;border-radius:100%;border-color:#2778c4 rgba(0,0,0,0) #2778c4 rgba(0,0,0,0)}div:where(.swal2-container) button:where(.swal2-styled){margin:.3125em;padding:.625em 1.1em;transition:var(--swal2-action-button-transition);border:none;box-shadow:0 0 0 3px rgba(0,0,0,0);font-weight:500}div:where(.swal2-container) button:where(.swal2-styled):not([disabled]){cursor:pointer}div:where(.swal2-container) button:where(.swal2-styled):where(.swal2-confirm){border-radius:var(--swal2-confirm-button-border-radius);background:initial;background-color:var(--swal2-confirm-button-background-color);box-shadow:var(--swal2-confirm-button-box-shadow);color:var(--swal2-confirm-button-color);font-size:1em}div:where(.swal2-container) button:where(.swal2-styled):where(.swal2-confirm):hover{background-color:color-mix(in srgb, var(--swal2-confirm-button-background-color), var(--swal2-action-button-hover))}div:where(.swal2-container) button:where(.swal2-styled):where(.swal2-confirm):active{background-color:color-mix(in srgb, var(--swal2-confirm-button-background-color), var(--swal2-action-button-active))}div:where(.swal2-container) button:where(.swal2-styled):where(.swal2-deny){border-radius:var(--swal2-deny-button-border-radius);background:initial;background-color:var(--swal2-deny-button-background-color);box-shadow:var(--swal2-deny-button-box-shadow);color:var(--swal2-deny-button-color);font-size:1em}div:where(.swal2-container) button:where(.swal2-styled):where(.swal2-deny):hover{background-color:color-mix(in srgb, var(--swal2-deny-button-background-color), var(--swal2-action-button-hover))}div:where(.swal2-container) button:where(.swal2-styled):where(.swal2-deny):active{background-color:color-mix(in srgb, var(--swal2-deny-button-background-color), var(--swal2-action-button-active))}div:where(.swal2-container) button:where(.swal2-styled):where(.swal2-cancel){border-radius:var(--swal2-cancel-button-border-radius);background:initial;background-color:var(--swal2-cancel-button-background-color);box-shadow:var(--swal2-cancel-button-box-shadow);color:var(--swal2-cancel-button-color);font-size:1em}div:where(.swal2-container) button:where(.swal2-styled):where(.swal2-cancel):hover{background-color:color-mix(in srgb, var(--swal2-cancel-button-background-color), var(--swal2-action-button-hover))}div:where(.swal2-container) button:where(.swal2-styled):where(.swal2-cancel):active{background-color:color-mix(in srgb, var(--swal2-cancel-button-background-color), var(--swal2-action-button-active))}div:where(.swal2-container) button:where(.swal2-styled):focus-visible{outline:none;box-shadow:var(--swal2-action-button-focus-box-shadow)}div:where(.swal2-container) button:where(.swal2-styled)[disabled]:not(.swal2-loading){opacity:.4}div:where(.swal2-container) button:where(.swal2-styled)::-moz-focus-inner{border:0}div:where(.swal2-container) div:where(.swal2-footer){margin:1em 0 0;padding:1em 1em 0;border-top:1px solid var(--swal2-footer-border-color);background:var(--swal2-footer-background);color:var(--swal2-footer-color);font-size:1em;text-align:center;cursor:initial}div:where(.swal2-container) .swal2-timer-progress-bar-container{position:absolute;right:0;bottom:0;left:0;grid-column:auto !important;overflow:hidden;border-bottom-right-radius:var(--swal2-border-radius);border-bottom-left-radius:var(--swal2-border-radius)}div:where(.swal2-container) div:where(.swal2-timer-progress-bar){width:100%;height:.25em;background:var(--swal2-timer-progress-bar-background)}div:where(.swal2-container) img:where(.swal2-image){max-width:100%;margin:2em auto 1em;cursor:initial}div:where(.swal2-container) button:where(.swal2-close){position:var(--swal2-close-button-position);inset:var(--swal2-close-button-inset);z-index:2;align-items:center;justify-content:center;width:1.2em;height:1.2em;margin-top:0;margin-right:0;margin-bottom:-1.2em;padding:0;overflow:hidden;transition:var(--swal2-close-button-transition);border:none;border-radius:var(--swal2-border-radius);outline:var(--swal2-close-button-outline);background:rgba(0,0,0,0);color:var(--swal2-close-button-color);font-family:monospace;font-size:var(--swal2-close-button-font-size);cursor:pointer;justify-self:end}div:where(.swal2-container) button:where(.swal2-close):hover{transform:var(--swal2-close-button-hover-transform);background:rgba(0,0,0,0);color:#f27474}div:where(.swal2-container) button:where(.swal2-close):focus-visible{outline:none;box-shadow:var(--swal2-close-button-focus-box-shadow)}div:where(.swal2-container) button:where(.swal2-close)::-moz-focus-inner{border:0}div:where(.swal2-container) div:where(.swal2-html-container){z-index:1;justify-content:center;margin:0;padding:var(--swal2-html-container-padding);overflow:auto;color:inherit;font-size:1.125em;font-weight:normal;line-height:normal;text-align:center;overflow-wrap:break-word;word-break:break-word;cursor:initial}div:where(.swal2-container) input:where(.swal2-input),div:where(.swal2-container) input:where(.swal2-file),div:where(.swal2-container) textarea:where(.swal2-textarea),div:where(.swal2-container) select:where(.swal2-select),div:where(.swal2-container) div:where(.swal2-radio),div:where(.swal2-container) label:where(.swal2-checkbox){margin:1em 2em 3px}div:where(.swal2-container) input:where(.swal2-input),div:where(.swal2-container) input:where(.swal2-file),div:where(.swal2-container) textarea:where(.swal2-textarea){box-sizing:border-box;width:auto;transition:var(--swal2-input-transition);border:var(--swal2-input-border);border-radius:var(--swal2-input-border-radius);background:var(--swal2-input-background);box-shadow:var(--swal2-input-box-shadow);color:inherit;font-size:1.125em}div:where(.swal2-container) input:where(.swal2-input).swal2-inputerror,div:where(.swal2-container) input:where(.swal2-file).swal2-inputerror,div:where(.swal2-container) textarea:where(.swal2-textarea).swal2-inputerror{border-color:#f27474 !important;box-shadow:0 0 2px #f27474 !important}div:where(.swal2-container) input:where(.swal2-input):hover,div:where(.swal2-container) input:where(.swal2-file):hover,div:where(.swal2-container) textarea:where(.swal2-textarea):hover{box-shadow:var(--swal2-input-hover-box-shadow)}div:where(.swal2-container) input:where(.swal2-input):focus,div:where(.swal2-container) input:where(.swal2-file):focus,div:where(.swal2-container) textarea:where(.swal2-textarea):focus{border:var(--swal2-input-focus-border);outline:none;box-shadow:var(--swal2-input-focus-box-shadow)}div:where(.swal2-container) input:where(.swal2-input)::placeholder,div:where(.swal2-container) input:where(.swal2-file)::placeholder,div:where(.swal2-container) textarea:where(.swal2-textarea)::placeholder{color:#ccc}div:where(.swal2-container) .swal2-range{margin:1em 2em 3px;background:var(--swal2-background)}div:where(.swal2-container) .swal2-range input{width:80%}div:where(.swal2-container) .swal2-range output{width:20%;color:inherit;font-weight:600;text-align:center}div:where(.swal2-container) .swal2-range input,div:where(.swal2-container) .swal2-range output{height:2.625em;padding:0;font-size:1.125em;line-height:2.625em}div:where(.swal2-container) .swal2-input{height:2.625em;padding:0 .75em}div:where(.swal2-container) .swal2-file{width:75%;margin-right:auto;margin-left:auto;background:var(--swal2-input-background);font-size:1.125em}div:where(.swal2-container) .swal2-textarea{height:6.75em;padding:.75em}div:where(.swal2-container) .swal2-select{min-width:50%;max-width:100%;padding:.375em .625em;background:var(--swal2-input-background);color:inherit;font-size:1.125em}div:where(.swal2-container) .swal2-radio,div:where(.swal2-container) .swal2-checkbox{align-items:center;justify-content:center;background:var(--swal2-background);color:inherit}div:where(.swal2-container) .swal2-radio label,div:where(.swal2-container) .swal2-checkbox label{margin:0 .6em;font-size:1.125em}div:where(.swal2-container) .swal2-radio input,div:where(.swal2-container) .swal2-checkbox input{flex-shrink:0;margin:0 .4em}div:where(.swal2-container) label:where(.swal2-input-label){display:flex;justify-content:center;margin:1em auto 0}div:where(.swal2-container) div:where(.swal2-validation-message){align-items:center;justify-content:center;margin:1em 0 0;padding:.625em;overflow:hidden;background:var(--swal2-validation-message-background);color:var(--swal2-validation-message-color);font-size:1em;font-weight:300}div:where(.swal2-container) div:where(.swal2-validation-message)::before{content:\"!\";display:inline-block;width:1.5em;min-width:1.5em;height:1.5em;margin:0 .625em;border-radius:50%;background-color:#f27474;color:#fff;font-weight:600;line-height:1.5em;text-align:center}div:where(.swal2-container) .swal2-progress-steps{flex-wrap:wrap;align-items:center;max-width:100%;margin:1.25em auto;padding:0;background:rgba(0,0,0,0);font-weight:600}div:where(.swal2-container) .swal2-progress-steps li{display:inline-block;position:relative}div:where(.swal2-container) .swal2-progress-steps .swal2-progress-step{z-index:20;flex-shrink:0;width:2em;height:2em;border-radius:2em;background:#2778c4;color:#fff;line-height:2em;text-align:center}div:where(.swal2-container) .swal2-progress-steps .swal2-progress-step.swal2-active-progress-step{background:#2778c4}div:where(.swal2-container) .swal2-progress-steps .swal2-progress-step.swal2-active-progress-step~.swal2-progress-step{background:var(--swal2-progress-step-background);color:#fff}div:where(.swal2-container) .swal2-progress-steps .swal2-progress-step.swal2-active-progress-step~.swal2-progress-step-line{background:var(--swal2-progress-step-background)}div:where(.swal2-container) .swal2-progress-steps .swal2-progress-step-line{z-index:10;flex-shrink:0;width:2.5em;height:.4em;margin:0 -1px;background:#2778c4}div:where(.swal2-icon){position:relative;box-sizing:content-box;justify-content:center;width:5em;height:5em;margin:2.5em auto .6em;zoom:var(--swal2-icon-zoom);border:.25em solid rgba(0,0,0,0);border-radius:50%;border-color:#000;font-family:inherit;line-height:5em;cursor:default;user-select:none}div:where(.swal2-icon) .swal2-icon-content{display:flex;align-items:center;font-size:3.75em}div:where(.swal2-icon).swal2-error{border-color:#f27474;color:#f27474}div:where(.swal2-icon).swal2-error .swal2-x-mark{position:relative;flex-grow:1}div:where(.swal2-icon).swal2-error [class^=swal2-x-mark-line]{display:block;position:absolute;top:2.3125em;width:2.9375em;height:.3125em;border-radius:.125em;background-color:#f27474}div:where(.swal2-icon).swal2-error [class^=swal2-x-mark-line][class$=left]{left:1.0625em;transform:rotate(45deg)}div:where(.swal2-icon).swal2-error [class^=swal2-x-mark-line][class$=right]{right:1em;transform:rotate(-45deg)}@container swal2-popup style(--swal2-icon-animations:true){div:where(.swal2-icon).swal2-error.swal2-icon-show{animation:swal2-animate-error-icon .5s}div:where(.swal2-icon).swal2-error.swal2-icon-show .swal2-x-mark{animation:swal2-animate-error-x-mark .5s}}div:where(.swal2-icon).swal2-warning{border-color:#f8bb86;color:#f8bb86}@container swal2-popup style(--swal2-icon-animations:true){div:where(.swal2-icon).swal2-warning.swal2-icon-show{animation:swal2-animate-error-icon .5s}div:where(.swal2-icon).swal2-warning.swal2-icon-show .swal2-icon-content{animation:swal2-animate-i-mark .5s}}div:where(.swal2-icon).swal2-info{border-color:#3fc3ee;color:#3fc3ee}@container swal2-popup style(--swal2-icon-animations:true){div:where(.swal2-icon).swal2-info.swal2-icon-show{animation:swal2-animate-error-icon .5s}div:where(.swal2-icon).swal2-info.swal2-icon-show .swal2-icon-content{animation:swal2-animate-i-mark .8s}}div:where(.swal2-icon).swal2-question{border-color:#87adbd;color:#87adbd}@container swal2-popup style(--swal2-icon-animations:true){div:where(.swal2-icon).swal2-question.swal2-icon-show{animation:swal2-animate-error-icon .5s}div:where(.swal2-icon).swal2-question.swal2-icon-show .swal2-icon-content{animation:swal2-animate-question-mark .8s}}div:where(.swal2-icon).swal2-success{border-color:#a5dc86;color:#a5dc86}div:where(.swal2-icon).swal2-success [class^=swal2-success-circular-line]{position:absolute;width:3.75em;height:7.5em;border-radius:50%}div:where(.swal2-icon).swal2-success [class^=swal2-success-circular-line][class$=left]{top:-0.4375em;left:-2.0635em;transform:rotate(-45deg);transform-origin:3.75em 3.75em;border-radius:7.5em 0 0 7.5em}div:where(.swal2-icon).swal2-success [class^=swal2-success-circular-line][class$=right]{top:-0.6875em;left:1.875em;transform:rotate(-45deg);transform-origin:0 3.75em;border-radius:0 7.5em 7.5em 0}div:where(.swal2-icon).swal2-success .swal2-success-ring{position:absolute;z-index:2;top:-0.25em;left:-0.25em;box-sizing:content-box;width:100%;height:100%;border:.25em solid rgba(165,220,134,.3);border-radius:50%}div:where(.swal2-icon).swal2-success .swal2-success-fix{position:absolute;z-index:1;top:.5em;left:1.625em;width:.4375em;height:5.625em;transform:rotate(-45deg)}div:where(.swal2-icon).swal2-success [class^=swal2-success-line]{display:block;position:absolute;z-index:2;height:.3125em;border-radius:.125em;background-color:#a5dc86}div:where(.swal2-icon).swal2-success [class^=swal2-success-line][class$=tip]{top:2.875em;left:.8125em;width:1.5625em;transform:rotate(45deg)}div:where(.swal2-icon).swal2-success [class^=swal2-success-line][class$=long]{top:2.375em;right:.5em;width:2.9375em;transform:rotate(-45deg)}@container swal2-popup style(--swal2-icon-animations:true){div:where(.swal2-icon).swal2-success.swal2-icon-show .swal2-success-line-tip{animation:swal2-animate-success-line-tip .75s}div:where(.swal2-icon).swal2-success.swal2-icon-show .swal2-success-line-long{animation:swal2-animate-success-line-long .75s}div:where(.swal2-icon).swal2-success.swal2-icon-show .swal2-success-circular-line-right{animation:swal2-rotate-success-circular-line 4.25s ease-in}}[class^=swal2]{-webkit-tap-highlight-color:rgba(0,0,0,0)}.swal2-show{animation:var(--swal2-show-animation)}.swal2-hide{animation:var(--swal2-hide-animation)}.swal2-noanimation{transition:none}.swal2-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}.swal2-rtl .swal2-close{margin-right:initial;margin-left:0}.swal2-rtl .swal2-timer-progress-bar{right:0;left:auto}.swal2-toast{box-sizing:border-box;grid-column:1/4 !important;grid-row:1/4 !important;grid-template-columns:min-content auto min-content;padding:1em;overflow-y:hidden;border:var(--swal2-toast-border);background:var(--swal2-background);box-shadow:var(--swal2-toast-box-shadow);pointer-events:all}.swal2-toast>*{grid-column:2}.swal2-toast h2:where(.swal2-title){margin:.5em 1em;padding:0;font-size:1em;text-align:initial}.swal2-toast .swal2-loading{justify-content:center}.swal2-toast input:where(.swal2-input){height:2em;margin:.5em;font-size:1em}.swal2-toast .swal2-validation-message{font-size:1em}.swal2-toast div:where(.swal2-footer){margin:.5em 0 0;padding:.5em 0 0;font-size:.8em}.swal2-toast button:where(.swal2-close){grid-column:3/3;grid-row:1/99;align-self:center;width:.8em;height:.8em;margin:0;font-size:2em}.swal2-toast div:where(.swal2-html-container){margin:.5em 1em;padding:0;overflow:initial;font-size:1em;text-align:initial}.swal2-toast div:where(.swal2-html-container):empty{padding:0}.swal2-toast .swal2-loader{grid-column:1;grid-row:1/99;align-self:center;width:2em;height:2em;margin:.25em}.swal2-toast .swal2-icon{grid-column:1;grid-row:1/99;align-self:center;width:2em;min-width:2em;height:2em;margin:0 .5em 0 0}.swal2-toast .swal2-icon .swal2-icon-content{display:flex;align-items:center;font-size:1.8em;font-weight:bold}.swal2-toast .swal2-icon.swal2-success .swal2-success-ring{width:2em;height:2em}.swal2-toast .swal2-icon.swal2-error [class^=swal2-x-mark-line]{top:.875em;width:1.375em}.swal2-toast .swal2-icon.swal2-error [class^=swal2-x-mark-line][class$=left]{left:.3125em}.swal2-toast .swal2-icon.swal2-error [class^=swal2-x-mark-line][class$=right]{right:.3125em}.swal2-toast div:where(.swal2-actions){justify-content:flex-start;height:auto;margin:0;margin-top:.5em;padding:0 .5em}.swal2-toast button:where(.swal2-styled){margin:.25em .5em;padding:.4em .6em;font-size:1em}.swal2-toast .swal2-success{border-color:#a5dc86}.swal2-toast .swal2-success [class^=swal2-success-circular-line]{position:absolute;width:1.6em;height:3em;border-radius:50%}.swal2-toast .swal2-success [class^=swal2-success-circular-line][class$=left]{top:-0.8em;left:-0.5em;transform:rotate(-45deg);transform-origin:2em 2em;border-radius:4em 0 0 4em}.swal2-toast .swal2-success [class^=swal2-success-circular-line][class$=right]{top:-0.25em;left:.9375em;transform-origin:0 1.5em;border-radius:0 4em 4em 0}.swal2-toast .swal2-success .swal2-success-ring{width:2em;height:2em}.swal2-toast .swal2-success .swal2-success-fix{top:0;left:.4375em;width:.4375em;height:2.6875em}.swal2-toast .swal2-success [class^=swal2-success-line]{height:.3125em}.swal2-toast .swal2-success [class^=swal2-success-line][class$=tip]{top:1.125em;left:.1875em;width:.75em}.swal2-toast .swal2-success [class^=swal2-success-line][class$=long]{top:.9375em;right:.1875em;width:1.375em}@container swal2-popup style(--swal2-icon-animations:true){.swal2-toast .swal2-success.swal2-icon-show .swal2-success-line-tip{animation:swal2-toast-animate-success-line-tip .75s}.swal2-toast .swal2-success.swal2-icon-show .swal2-success-line-long{animation:swal2-toast-animate-success-line-long .75s}}.swal2-toast.swal2-show{animation:var(--swal2-toast-show-animation)}.swal2-toast.swal2-hide{animation:var(--swal2-toast-hide-animation)}@keyframes swal2-show{0%{transform:translate3d(0, -50px, 0) scale(0.9);opacity:0}100%{transform:translate3d(0, 0, 0) scale(1);opacity:1}}@keyframes swal2-hide{0%{transform:translate3d(0, 0, 0) scale(1);opacity:1}100%{transform:translate3d(0, -50px, 0) scale(0.9);opacity:0}}@keyframes swal2-animate-success-line-tip{0%{top:1.1875em;left:.0625em;width:0}54%{top:1.0625em;left:.125em;width:0}70%{top:2.1875em;left:-0.375em;width:3.125em}84%{top:3em;left:1.3125em;width:1.0625em}100%{top:2.8125em;left:.8125em;width:1.5625em}}@keyframes swal2-animate-success-line-long{0%{top:3.375em;right:2.875em;width:0}65%{top:3.375em;right:2.875em;width:0}84%{top:2.1875em;right:0;width:3.4375em}100%{top:2.375em;right:.5em;width:2.9375em}}@keyframes swal2-rotate-success-circular-line{0%{transform:rotate(-45deg)}5%{transform:rotate(-45deg)}12%{transform:rotate(-405deg)}100%{transform:rotate(-405deg)}}@keyframes swal2-animate-error-x-mark{0%{margin-top:1.625em;transform:scale(0.4);opacity:0}50%{margin-top:1.625em;transform:scale(0.4);opacity:0}80%{margin-top:-0.375em;transform:scale(1.15)}100%{margin-top:0;transform:scale(1);opacity:1}}@keyframes swal2-animate-error-icon{0%{transform:rotateX(100deg);opacity:0}100%{transform:rotateX(0deg);opacity:1}}@keyframes swal2-rotate-loading{0%{transform:rotate(0deg)}100%{transform:rotate(360deg)}}@keyframes swal2-animate-question-mark{0%{transform:rotateY(-360deg)}100%{transform:rotateY(0)}}@keyframes swal2-animate-i-mark{0%{transform:rotateZ(45deg);opacity:0}25%{transform:rotateZ(-25deg);opacity:.4}50%{transform:rotateZ(15deg);opacity:.8}75%{transform:rotateZ(-5deg);opacity:1}100%{transform:rotateX(0);opacity:1}}@keyframes swal2-toast-show{0%{transform:translateY(-0.625em) rotateZ(2deg)}33%{transform:translateY(0) rotateZ(-2deg)}66%{transform:translateY(0.3125em) rotateZ(2deg)}100%{transform:translateY(0) rotateZ(0deg)}}@keyframes swal2-toast-hide{100%{transform:rotateZ(1deg);opacity:0}}@keyframes swal2-toast-animate-success-line-tip{0%{top:.5625em;left:.0625em;width:0}54%{top:.125em;left:.125em;width:0}70%{top:.625em;left:-0.25em;width:1.625em}84%{top:1.0625em;left:.75em;width:.5em}100%{top:1.125em;left:.1875em;width:.75em}}@keyframes swal2-toast-animate-success-line-long{0%{top:1.625em;right:1.375em;width:0}65%{top:1.25em;right:.9375em;width:0}84%{top:.9375em;right:0;width:1.125em}100%{top:.9375em;right:.1875em;width:1.375em}}"); \ No newline at end of file diff --git a/public/assets/sweetalert2/dist/sweetalert2.css b/public/assets/sweetalert2/dist/sweetalert2.css new file mode 100644 index 0000000..eddecae --- /dev/null +++ b/public/assets/sweetalert2/dist/sweetalert2.css @@ -0,0 +1,1233 @@ +:root { + --swal2-outline: 0 0 0 3px rgba(100, 150, 200, 0.5); + --swal2-container-padding: 0.625em; + --swal2-backdrop: rgba(0, 0, 0, 0.4); + --swal2-backdrop-transition: background-color 0.15s; + --swal2-width: 32em; + --swal2-padding: 0 0 1.25em; + --swal2-border: none; + --swal2-border-radius: 0.3125rem; + --swal2-background: white; + --swal2-color: #545454; + --swal2-show-animation: swal2-show 0.3s; + --swal2-hide-animation: swal2-hide 0.15s forwards; + --swal2-icon-zoom: 1; + --swal2-icon-animations: true; + --swal2-title-padding: 0.8em 1em 0; + --swal2-html-container-padding: 1em 1.6em 0.3em; + --swal2-input-border: 1px solid #d9d9d9; + --swal2-input-border-radius: 0.1875em; + --swal2-input-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.06), 0 0 0 3px transparent; + --swal2-input-background: transparent; + --swal2-input-transition: border-color 0.2s, box-shadow 0.2s; + --swal2-input-hover-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.06), 0 0 0 3px transparent; + --swal2-input-focus-border: 1px solid #b4dbed; + --swal2-input-focus-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.06), 0 0 0 3px rgba(100, 150, 200, 0.5); + --swal2-progress-step-background: #add8e6; + --swal2-validation-message-background: #f0f0f0; + --swal2-validation-message-color: #666; + --swal2-footer-border-color: #eee; + --swal2-footer-background: transparent; + --swal2-footer-color: inherit; + --swal2-timer-progress-bar-background: rgba(0, 0, 0, 0.3); + --swal2-close-button-position: initial; + --swal2-close-button-inset: auto; + --swal2-close-button-font-size: 2.5em; + --swal2-close-button-color: #ccc; + --swal2-close-button-transition: color 0.2s, box-shadow 0.2s; + --swal2-close-button-outline: initial; + --swal2-close-button-box-shadow: inset 0 0 0 3px transparent; + --swal2-close-button-focus-box-shadow: inset var(--swal2-outline); + --swal2-close-button-hover-transform: none; + --swal2-actions-justify-content: center; + --swal2-actions-width: auto; + --swal2-actions-margin: 1.25em auto 0; + --swal2-actions-padding: 0; + --swal2-actions-border-radius: 0; + --swal2-actions-background: transparent; + --swal2-action-button-transition: background-color 0.2s, box-shadow 0.2s; + --swal2-action-button-hover: black 10%; + --swal2-action-button-active: black 10%; + --swal2-confirm-button-box-shadow: none; + --swal2-confirm-button-border-radius: 0.25em; + --swal2-confirm-button-background-color: #7066e0; + --swal2-confirm-button-color: #fff; + --swal2-deny-button-box-shadow: none; + --swal2-deny-button-border-radius: 0.25em; + --swal2-deny-button-background-color: #dc3741; + --swal2-deny-button-color: #fff; + --swal2-cancel-button-box-shadow: none; + --swal2-cancel-button-border-radius: 0.25em; + --swal2-cancel-button-background-color: #6e7881; + --swal2-cancel-button-color: #fff; + --swal2-toast-show-animation: swal2-toast-show 0.5s; + --swal2-toast-hide-animation: swal2-toast-hide 0.1s forwards; + --swal2-toast-border: none; + --swal2-toast-box-shadow: + 0 0 1px hsl(0deg 0% 0% / 0.075), 0 1px 2px hsl(0deg 0% 0% / 0.075), 1px 2px 4px hsl(0deg 0% 0% / 0.075), + 1px 3px 8px hsl(0deg 0% 0% / 0.075), 2px 4px 16px hsl(0deg 0% 0% / 0.075); +} + +[data-swal2-theme=dark] { + --swal2-dark-theme-black: #19191a; + --swal2-dark-theme-white: #e1e1e1; + --swal2-background: var(--swal2-dark-theme-black); + --swal2-color: var(--swal2-dark-theme-white); + --swal2-footer-border-color: #555; + --swal2-input-background: color-mix(in srgb, var(--swal2-dark-theme-black), var(--swal2-dark-theme-white) 10%); + --swal2-validation-message-background: color-mix( + in srgb, + var(--swal2-dark-theme-black), + var(--swal2-dark-theme-white) 10% + ); + --swal2-validation-message-color: var(--swal2-dark-theme-white); + --swal2-timer-progress-bar-background: rgba(255, 255, 255, 0.7); +} + +@media (prefers-color-scheme: dark) { + [data-swal2-theme=auto] { + --swal2-dark-theme-black: #19191a; + --swal2-dark-theme-white: #e1e1e1; + --swal2-background: var(--swal2-dark-theme-black); + --swal2-color: var(--swal2-dark-theme-white); + --swal2-footer-border-color: #555; + --swal2-input-background: color-mix(in srgb, var(--swal2-dark-theme-black), var(--swal2-dark-theme-white) 10%); + --swal2-validation-message-background: color-mix( + in srgb, + var(--swal2-dark-theme-black), + var(--swal2-dark-theme-white) 10% + ); + --swal2-validation-message-color: var(--swal2-dark-theme-white); + --swal2-timer-progress-bar-background: rgba(255, 255, 255, 0.7); + } +} +body.swal2-shown:not(.swal2-no-backdrop, .swal2-toast-shown) { + overflow: hidden; +} +body.swal2-height-auto { + height: auto !important; +} +body.swal2-no-backdrop .swal2-container { + background-color: transparent !important; + pointer-events: none; +} +body.swal2-no-backdrop .swal2-container .swal2-popup { + pointer-events: all; +} +body.swal2-no-backdrop .swal2-container .swal2-modal { + box-shadow: 0 0 10px var(--swal2-backdrop); +} +body.swal2-toast-shown .swal2-container { + box-sizing: border-box; + width: 360px; + max-width: 100%; + background-color: transparent; + pointer-events: none; +} +body.swal2-toast-shown .swal2-container.swal2-top { + inset: 0 auto auto 50%; + transform: translateX(-50%); +} +body.swal2-toast-shown .swal2-container.swal2-top-end, body.swal2-toast-shown .swal2-container.swal2-top-right { + inset: 0 0 auto auto; +} +body.swal2-toast-shown .swal2-container.swal2-top-start, body.swal2-toast-shown .swal2-container.swal2-top-left { + inset: 0 auto auto 0; +} +body.swal2-toast-shown .swal2-container.swal2-center-start, body.swal2-toast-shown .swal2-container.swal2-center-left { + inset: 50% auto auto 0; + transform: translateY(-50%); +} +body.swal2-toast-shown .swal2-container.swal2-center { + inset: 50% auto auto 50%; + transform: translate(-50%, -50%); +} +body.swal2-toast-shown .swal2-container.swal2-center-end, body.swal2-toast-shown .swal2-container.swal2-center-right { + inset: 50% 0 auto auto; + transform: translateY(-50%); +} +body.swal2-toast-shown .swal2-container.swal2-bottom-start, body.swal2-toast-shown .swal2-container.swal2-bottom-left { + inset: auto auto 0 0; +} +body.swal2-toast-shown .swal2-container.swal2-bottom { + inset: auto auto 0 50%; + transform: translateX(-50%); +} +body.swal2-toast-shown .swal2-container.swal2-bottom-end, body.swal2-toast-shown .swal2-container.swal2-bottom-right { + inset: auto 0 0 auto; +} +@media print { + body.swal2-shown:not(.swal2-no-backdrop, .swal2-toast-shown) { + overflow-y: scroll !important; + } + body.swal2-shown:not(.swal2-no-backdrop, .swal2-toast-shown) > [aria-hidden=true] { + display: none; + } + body.swal2-shown:not(.swal2-no-backdrop, .swal2-toast-shown) .swal2-container { + position: static !important; + } +} + +div:where(.swal2-container) { + display: grid; + position: fixed; + z-index: 1060; + inset: 0; + box-sizing: border-box; + grid-template-areas: "top-start top top-end" "center-start center center-end" "bottom-start bottom-center bottom-end"; + grid-template-rows: minmax(min-content, auto) minmax(min-content, auto) minmax(min-content, auto); + height: 100%; + padding: var(--swal2-container-padding); + overflow-x: hidden; + transition: var(--swal2-backdrop-transition); + -webkit-overflow-scrolling: touch; +} +div:where(.swal2-container).swal2-backdrop-show, div:where(.swal2-container).swal2-noanimation { + background: var(--swal2-backdrop); +} +div:where(.swal2-container).swal2-backdrop-hide { + background: transparent !important; +} +div:where(.swal2-container).swal2-top-start, div:where(.swal2-container).swal2-center-start, div:where(.swal2-container).swal2-bottom-start { + grid-template-columns: minmax(0, 1fr) auto auto; +} +div:where(.swal2-container).swal2-top, div:where(.swal2-container).swal2-center, div:where(.swal2-container).swal2-bottom { + grid-template-columns: auto minmax(0, 1fr) auto; +} +div:where(.swal2-container).swal2-top-end, div:where(.swal2-container).swal2-center-end, div:where(.swal2-container).swal2-bottom-end { + grid-template-columns: auto auto minmax(0, 1fr); +} +div:where(.swal2-container).swal2-top-start > .swal2-popup { + align-self: start; +} +div:where(.swal2-container).swal2-top > .swal2-popup { + grid-column: 2; + place-self: start center; +} +div:where(.swal2-container).swal2-top-end > .swal2-popup, div:where(.swal2-container).swal2-top-right > .swal2-popup { + grid-column: 3; + place-self: start end; +} +div:where(.swal2-container).swal2-center-start > .swal2-popup, div:where(.swal2-container).swal2-center-left > .swal2-popup { + grid-row: 2; + align-self: center; +} +div:where(.swal2-container).swal2-center > .swal2-popup { + grid-column: 2; + grid-row: 2; + place-self: center center; +} +div:where(.swal2-container).swal2-center-end > .swal2-popup, div:where(.swal2-container).swal2-center-right > .swal2-popup { + grid-column: 3; + grid-row: 2; + place-self: center end; +} +div:where(.swal2-container).swal2-bottom-start > .swal2-popup, div:where(.swal2-container).swal2-bottom-left > .swal2-popup { + grid-column: 1; + grid-row: 3; + align-self: end; +} +div:where(.swal2-container).swal2-bottom > .swal2-popup { + grid-column: 2; + grid-row: 3; + place-self: end center; +} +div:where(.swal2-container).swal2-bottom-end > .swal2-popup, div:where(.swal2-container).swal2-bottom-right > .swal2-popup { + grid-column: 3; + grid-row: 3; + place-self: end end; +} +div:where(.swal2-container).swal2-grow-row > .swal2-popup, div:where(.swal2-container).swal2-grow-fullscreen > .swal2-popup { + grid-column: 1/4; + width: 100%; +} +div:where(.swal2-container).swal2-grow-column > .swal2-popup, div:where(.swal2-container).swal2-grow-fullscreen > .swal2-popup { + grid-row: 1/4; + align-self: stretch; +} +div:where(.swal2-container).swal2-no-transition { + transition: none !important; +} +div:where(.swal2-container)[popover] { + width: auto; + border: 0; +} +div:where(.swal2-container) div:where(.swal2-popup) { + display: none; + position: relative; + box-sizing: border-box; + grid-template-columns: minmax(0, 100%); + width: var(--swal2-width); + max-width: 100%; + padding: var(--swal2-padding); + border: var(--swal2-border); + border-radius: var(--swal2-border-radius); + background: var(--swal2-background); + color: var(--swal2-color); + font-family: inherit; + font-size: 1rem; + container-name: swal2-popup; +} +div:where(.swal2-container) div:where(.swal2-popup):focus { + outline: none; +} +div:where(.swal2-container) div:where(.swal2-popup).swal2-loading { + overflow-y: hidden; +} +div:where(.swal2-container) div:where(.swal2-popup).swal2-draggable { + cursor: grab; +} +div:where(.swal2-container) div:where(.swal2-popup).swal2-draggable div:where(.swal2-icon) { + cursor: grab; +} +div:where(.swal2-container) div:where(.swal2-popup).swal2-dragging { + cursor: grabbing; +} +div:where(.swal2-container) div:where(.swal2-popup).swal2-dragging div:where(.swal2-icon) { + cursor: grabbing; +} +div:where(.swal2-container) h2:where(.swal2-title) { + position: relative; + max-width: 100%; + margin: 0; + padding: var(--swal2-title-padding); + color: inherit; + font-size: 1.875em; + font-weight: 600; + text-align: center; + text-transform: none; + overflow-wrap: break-word; + cursor: initial; +} +div:where(.swal2-container) div:where(.swal2-actions) { + display: flex; + z-index: 1; + box-sizing: border-box; + flex-wrap: wrap; + align-items: center; + justify-content: var(--swal2-actions-justify-content); + width: var(--swal2-actions-width); + margin: var(--swal2-actions-margin); + padding: var(--swal2-actions-padding); + border-radius: var(--swal2-actions-border-radius); + background: var(--swal2-actions-background); +} +div:where(.swal2-container) div:where(.swal2-loader) { + display: none; + align-items: center; + justify-content: center; + width: 2.2em; + height: 2.2em; + margin: 0 1.875em; + animation: swal2-rotate-loading 1.5s linear 0s infinite normal; + border-width: 0.25em; + border-style: solid; + border-radius: 100%; + border-color: #2778c4 transparent #2778c4 transparent; +} +div:where(.swal2-container) button:where(.swal2-styled) { + margin: 0.3125em; + padding: 0.625em 1.1em; + transition: var(--swal2-action-button-transition); + border: none; + box-shadow: 0 0 0 3px transparent; + font-weight: 500; +} +div:where(.swal2-container) button:where(.swal2-styled):not([disabled]) { + cursor: pointer; +} +div:where(.swal2-container) button:where(.swal2-styled):where(.swal2-confirm) { + border-radius: var(--swal2-confirm-button-border-radius); + background: initial; + background-color: var(--swal2-confirm-button-background-color); + box-shadow: var(--swal2-confirm-button-box-shadow); + color: var(--swal2-confirm-button-color); + font-size: 1em; +} +div:where(.swal2-container) button:where(.swal2-styled):where(.swal2-confirm):hover { + background-color: color-mix(in srgb, var(--swal2-confirm-button-background-color), var(--swal2-action-button-hover)); +} +div:where(.swal2-container) button:where(.swal2-styled):where(.swal2-confirm):active { + background-color: color-mix(in srgb, var(--swal2-confirm-button-background-color), var(--swal2-action-button-active)); +} +div:where(.swal2-container) button:where(.swal2-styled):where(.swal2-deny) { + border-radius: var(--swal2-deny-button-border-radius); + background: initial; + background-color: var(--swal2-deny-button-background-color); + box-shadow: var(--swal2-deny-button-box-shadow); + color: var(--swal2-deny-button-color); + font-size: 1em; +} +div:where(.swal2-container) button:where(.swal2-styled):where(.swal2-deny):hover { + background-color: color-mix(in srgb, var(--swal2-deny-button-background-color), var(--swal2-action-button-hover)); +} +div:where(.swal2-container) button:where(.swal2-styled):where(.swal2-deny):active { + background-color: color-mix(in srgb, var(--swal2-deny-button-background-color), var(--swal2-action-button-active)); +} +div:where(.swal2-container) button:where(.swal2-styled):where(.swal2-cancel) { + border-radius: var(--swal2-cancel-button-border-radius); + background: initial; + background-color: var(--swal2-cancel-button-background-color); + box-shadow: var(--swal2-cancel-button-box-shadow); + color: var(--swal2-cancel-button-color); + font-size: 1em; +} +div:where(.swal2-container) button:where(.swal2-styled):where(.swal2-cancel):hover { + background-color: color-mix(in srgb, var(--swal2-cancel-button-background-color), var(--swal2-action-button-hover)); +} +div:where(.swal2-container) button:where(.swal2-styled):where(.swal2-cancel):active { + background-color: color-mix(in srgb, var(--swal2-cancel-button-background-color), var(--swal2-action-button-active)); +} +div:where(.swal2-container) button:where(.swal2-styled):focus-visible { + outline: none; + box-shadow: var(--swal2-action-button-focus-box-shadow); +} +div:where(.swal2-container) button:where(.swal2-styled)[disabled]:not(.swal2-loading) { + opacity: 0.4; +} +div:where(.swal2-container) button:where(.swal2-styled)::-moz-focus-inner { + border: 0; +} +div:where(.swal2-container) div:where(.swal2-footer) { + margin: 1em 0 0; + padding: 1em 1em 0; + border-top: 1px solid var(--swal2-footer-border-color); + background: var(--swal2-footer-background); + color: var(--swal2-footer-color); + font-size: 1em; + text-align: center; + cursor: initial; +} +div:where(.swal2-container) .swal2-timer-progress-bar-container { + position: absolute; + right: 0; + bottom: 0; + left: 0; + grid-column: auto !important; + overflow: hidden; + border-bottom-right-radius: var(--swal2-border-radius); + border-bottom-left-radius: var(--swal2-border-radius); +} +div:where(.swal2-container) div:where(.swal2-timer-progress-bar) { + width: 100%; + height: 0.25em; + background: var(--swal2-timer-progress-bar-background); +} +div:where(.swal2-container) img:where(.swal2-image) { + max-width: 100%; + margin: 2em auto 1em; + cursor: initial; +} +div:where(.swal2-container) button:where(.swal2-close) { + position: var(--swal2-close-button-position); + inset: var(--swal2-close-button-inset); + z-index: 2; + align-items: center; + justify-content: center; + width: 1.2em; + height: 1.2em; + margin-top: 0; + margin-right: 0; + margin-bottom: -1.2em; + padding: 0; + overflow: hidden; + transition: var(--swal2-close-button-transition); + border: none; + border-radius: var(--swal2-border-radius); + outline: var(--swal2-close-button-outline); + background: transparent; + color: var(--swal2-close-button-color); + font-family: monospace; + font-size: var(--swal2-close-button-font-size); + cursor: pointer; + justify-self: end; +} +div:where(.swal2-container) button:where(.swal2-close):hover { + transform: var(--swal2-close-button-hover-transform); + background: transparent; + color: #f27474; +} +div:where(.swal2-container) button:where(.swal2-close):focus-visible { + outline: none; + box-shadow: var(--swal2-close-button-focus-box-shadow); +} +div:where(.swal2-container) button:where(.swal2-close)::-moz-focus-inner { + border: 0; +} +div:where(.swal2-container) div:where(.swal2-html-container) { + z-index: 1; + justify-content: center; + margin: 0; + padding: var(--swal2-html-container-padding); + overflow: auto; + color: inherit; + font-size: 1.125em; + font-weight: normal; + line-height: normal; + text-align: center; + overflow-wrap: break-word; + word-break: break-word; + cursor: initial; +} +div:where(.swal2-container) input:where(.swal2-input), +div:where(.swal2-container) input:where(.swal2-file), +div:where(.swal2-container) textarea:where(.swal2-textarea), +div:where(.swal2-container) select:where(.swal2-select), +div:where(.swal2-container) div:where(.swal2-radio), +div:where(.swal2-container) label:where(.swal2-checkbox) { + margin: 1em 2em 3px; +} +div:where(.swal2-container) input:where(.swal2-input), +div:where(.swal2-container) input:where(.swal2-file), +div:where(.swal2-container) textarea:where(.swal2-textarea) { + box-sizing: border-box; + width: auto; + transition: var(--swal2-input-transition); + border: var(--swal2-input-border); + border-radius: var(--swal2-input-border-radius); + background: var(--swal2-input-background); + box-shadow: var(--swal2-input-box-shadow); + color: inherit; + font-size: 1.125em; +} +div:where(.swal2-container) input:where(.swal2-input).swal2-inputerror, +div:where(.swal2-container) input:where(.swal2-file).swal2-inputerror, +div:where(.swal2-container) textarea:where(.swal2-textarea).swal2-inputerror { + border-color: #f27474 !important; + box-shadow: 0 0 2px #f27474 !important; +} +div:where(.swal2-container) input:where(.swal2-input):hover, +div:where(.swal2-container) input:where(.swal2-file):hover, +div:where(.swal2-container) textarea:where(.swal2-textarea):hover { + box-shadow: var(--swal2-input-hover-box-shadow); +} +div:where(.swal2-container) input:where(.swal2-input):focus, +div:where(.swal2-container) input:where(.swal2-file):focus, +div:where(.swal2-container) textarea:where(.swal2-textarea):focus { + border: var(--swal2-input-focus-border); + outline: none; + box-shadow: var(--swal2-input-focus-box-shadow); +} +div:where(.swal2-container) input:where(.swal2-input)::placeholder, +div:where(.swal2-container) input:where(.swal2-file)::placeholder, +div:where(.swal2-container) textarea:where(.swal2-textarea)::placeholder { + color: #ccc; +} +div:where(.swal2-container) .swal2-range { + margin: 1em 2em 3px; + background: var(--swal2-background); +} +div:where(.swal2-container) .swal2-range input { + width: 80%; +} +div:where(.swal2-container) .swal2-range output { + width: 20%; + color: inherit; + font-weight: 600; + text-align: center; +} +div:where(.swal2-container) .swal2-range input, +div:where(.swal2-container) .swal2-range output { + height: 2.625em; + padding: 0; + font-size: 1.125em; + line-height: 2.625em; +} +div:where(.swal2-container) .swal2-input { + height: 2.625em; + padding: 0 0.75em; +} +div:where(.swal2-container) .swal2-file { + width: 75%; + margin-right: auto; + margin-left: auto; + background: var(--swal2-input-background); + font-size: 1.125em; +} +div:where(.swal2-container) .swal2-textarea { + height: 6.75em; + padding: 0.75em; +} +div:where(.swal2-container) .swal2-select { + min-width: 50%; + max-width: 100%; + padding: 0.375em 0.625em; + background: var(--swal2-input-background); + color: inherit; + font-size: 1.125em; +} +div:where(.swal2-container) .swal2-radio, +div:where(.swal2-container) .swal2-checkbox { + align-items: center; + justify-content: center; + background: var(--swal2-background); + color: inherit; +} +div:where(.swal2-container) .swal2-radio label, +div:where(.swal2-container) .swal2-checkbox label { + margin: 0 0.6em; + font-size: 1.125em; +} +div:where(.swal2-container) .swal2-radio input, +div:where(.swal2-container) .swal2-checkbox input { + flex-shrink: 0; + margin: 0 0.4em; +} +div:where(.swal2-container) label:where(.swal2-input-label) { + display: flex; + justify-content: center; + margin: 1em auto 0; +} +div:where(.swal2-container) div:where(.swal2-validation-message) { + align-items: center; + justify-content: center; + margin: 1em 0 0; + padding: 0.625em; + overflow: hidden; + background: var(--swal2-validation-message-background); + color: var(--swal2-validation-message-color); + font-size: 1em; + font-weight: 300; +} +div:where(.swal2-container) div:where(.swal2-validation-message)::before { + content: "!"; + display: inline-block; + width: 1.5em; + min-width: 1.5em; + height: 1.5em; + margin: 0 0.625em; + border-radius: 50%; + background-color: #f27474; + color: #fff; + font-weight: 600; + line-height: 1.5em; + text-align: center; +} +div:where(.swal2-container) .swal2-progress-steps { + flex-wrap: wrap; + align-items: center; + max-width: 100%; + margin: 1.25em auto; + padding: 0; + background: transparent; + font-weight: 600; +} +div:where(.swal2-container) .swal2-progress-steps li { + display: inline-block; + position: relative; +} +div:where(.swal2-container) .swal2-progress-steps .swal2-progress-step { + z-index: 20; + flex-shrink: 0; + width: 2em; + height: 2em; + border-radius: 2em; + background: #2778c4; + color: #fff; + line-height: 2em; + text-align: center; +} +div:where(.swal2-container) .swal2-progress-steps .swal2-progress-step.swal2-active-progress-step { + background: #2778c4; +} +div:where(.swal2-container) .swal2-progress-steps .swal2-progress-step.swal2-active-progress-step ~ .swal2-progress-step { + background: var(--swal2-progress-step-background); + color: #fff; +} +div:where(.swal2-container) .swal2-progress-steps .swal2-progress-step.swal2-active-progress-step ~ .swal2-progress-step-line { + background: var(--swal2-progress-step-background); +} +div:where(.swal2-container) .swal2-progress-steps .swal2-progress-step-line { + z-index: 10; + flex-shrink: 0; + width: 2.5em; + height: 0.4em; + margin: 0 -1px; + background: #2778c4; +} + +div:where(.swal2-icon) { + position: relative; + box-sizing: content-box; + justify-content: center; + width: 5em; + height: 5em; + margin: 2.5em auto 0.6em; + zoom: var(--swal2-icon-zoom); + border: 0.25em solid transparent; + border-radius: 50%; + border-color: #000; + font-family: inherit; + line-height: 5em; + cursor: default; + user-select: none; +} +div:where(.swal2-icon) .swal2-icon-content { + display: flex; + align-items: center; + font-size: 3.75em; +} +div:where(.swal2-icon).swal2-error { + border-color: #f27474; + color: #f27474; +} +div:where(.swal2-icon).swal2-error .swal2-x-mark { + position: relative; + flex-grow: 1; +} +div:where(.swal2-icon).swal2-error [class^=swal2-x-mark-line] { + display: block; + position: absolute; + top: 2.3125em; + width: 2.9375em; + height: 0.3125em; + border-radius: 0.125em; + background-color: #f27474; +} +div:where(.swal2-icon).swal2-error [class^=swal2-x-mark-line][class$=left] { + left: 1.0625em; + transform: rotate(45deg); +} +div:where(.swal2-icon).swal2-error [class^=swal2-x-mark-line][class$=right] { + right: 1em; + transform: rotate(-45deg); +} +@container swal2-popup style(--swal2-icon-animations:true) { + div:where(.swal2-icon).swal2-error.swal2-icon-show { + animation: swal2-animate-error-icon 0.5s; + } + div:where(.swal2-icon).swal2-error.swal2-icon-show .swal2-x-mark { + animation: swal2-animate-error-x-mark 0.5s; + } +} +div:where(.swal2-icon).swal2-warning { + border-color: #f8bb86; + color: #f8bb86; +} +@container swal2-popup style(--swal2-icon-animations:true) { + div:where(.swal2-icon).swal2-warning.swal2-icon-show { + animation: swal2-animate-error-icon 0.5s; + } + div:where(.swal2-icon).swal2-warning.swal2-icon-show .swal2-icon-content { + animation: swal2-animate-i-mark 0.5s; + } +} +div:where(.swal2-icon).swal2-info { + border-color: #3fc3ee; + color: #3fc3ee; +} +@container swal2-popup style(--swal2-icon-animations:true) { + div:where(.swal2-icon).swal2-info.swal2-icon-show { + animation: swal2-animate-error-icon 0.5s; + } + div:where(.swal2-icon).swal2-info.swal2-icon-show .swal2-icon-content { + animation: swal2-animate-i-mark 0.8s; + } +} +div:where(.swal2-icon).swal2-question { + border-color: #87adbd; + color: #87adbd; +} +@container swal2-popup style(--swal2-icon-animations:true) { + div:where(.swal2-icon).swal2-question.swal2-icon-show { + animation: swal2-animate-error-icon 0.5s; + } + div:where(.swal2-icon).swal2-question.swal2-icon-show .swal2-icon-content { + animation: swal2-animate-question-mark 0.8s; + } +} +div:where(.swal2-icon).swal2-success { + border-color: #a5dc86; + color: #a5dc86; +} +div:where(.swal2-icon).swal2-success [class^=swal2-success-circular-line] { + position: absolute; + width: 3.75em; + height: 7.5em; + border-radius: 50%; +} +div:where(.swal2-icon).swal2-success [class^=swal2-success-circular-line][class$=left] { + top: -0.4375em; + left: -2.0635em; + transform: rotate(-45deg); + transform-origin: 3.75em 3.75em; + border-radius: 7.5em 0 0 7.5em; +} +div:where(.swal2-icon).swal2-success [class^=swal2-success-circular-line][class$=right] { + top: -0.6875em; + left: 1.875em; + transform: rotate(-45deg); + transform-origin: 0 3.75em; + border-radius: 0 7.5em 7.5em 0; +} +div:where(.swal2-icon).swal2-success .swal2-success-ring { + position: absolute; + z-index: 2; + top: -0.25em; + left: -0.25em; + box-sizing: content-box; + width: 100%; + height: 100%; + border: 0.25em solid rgba(165, 220, 134, 0.3); + border-radius: 50%; +} +div:where(.swal2-icon).swal2-success .swal2-success-fix { + position: absolute; + z-index: 1; + top: 0.5em; + left: 1.625em; + width: 0.4375em; + height: 5.625em; + transform: rotate(-45deg); +} +div:where(.swal2-icon).swal2-success [class^=swal2-success-line] { + display: block; + position: absolute; + z-index: 2; + height: 0.3125em; + border-radius: 0.125em; + background-color: #a5dc86; +} +div:where(.swal2-icon).swal2-success [class^=swal2-success-line][class$=tip] { + top: 2.875em; + left: 0.8125em; + width: 1.5625em; + transform: rotate(45deg); +} +div:where(.swal2-icon).swal2-success [class^=swal2-success-line][class$=long] { + top: 2.375em; + right: 0.5em; + width: 2.9375em; + transform: rotate(-45deg); +} +@container swal2-popup style(--swal2-icon-animations:true) { + div:where(.swal2-icon).swal2-success.swal2-icon-show .swal2-success-line-tip { + animation: swal2-animate-success-line-tip 0.75s; + } + div:where(.swal2-icon).swal2-success.swal2-icon-show .swal2-success-line-long { + animation: swal2-animate-success-line-long 0.75s; + } + div:where(.swal2-icon).swal2-success.swal2-icon-show .swal2-success-circular-line-right { + animation: swal2-rotate-success-circular-line 4.25s ease-in; + } +} + +[class^=swal2] { + -webkit-tap-highlight-color: transparent; +} + +.swal2-show { + animation: var(--swal2-show-animation); +} + +.swal2-hide { + animation: var(--swal2-hide-animation); +} + +.swal2-noanimation { + transition: none; +} + +.swal2-scrollbar-measure { + position: absolute; + top: -9999px; + width: 50px; + height: 50px; + overflow: scroll; +} + +.swal2-rtl .swal2-close { + margin-right: initial; + margin-left: 0; +} +.swal2-rtl .swal2-timer-progress-bar { + right: 0; + left: auto; +} + +.swal2-toast { + box-sizing: border-box; + grid-column: 1/4 !important; + grid-row: 1/4 !important; + grid-template-columns: min-content auto min-content; + padding: 1em; + overflow-y: hidden; + border: var(--swal2-toast-border); + background: var(--swal2-background); + box-shadow: var(--swal2-toast-box-shadow); + pointer-events: all; +} +.swal2-toast > * { + grid-column: 2; +} +.swal2-toast h2:where(.swal2-title) { + margin: 0.5em 1em; + padding: 0; + font-size: 1em; + text-align: initial; +} +.swal2-toast .swal2-loading { + justify-content: center; +} +.swal2-toast input:where(.swal2-input) { + height: 2em; + margin: 0.5em; + font-size: 1em; +} +.swal2-toast .swal2-validation-message { + font-size: 1em; +} +.swal2-toast div:where(.swal2-footer) { + margin: 0.5em 0 0; + padding: 0.5em 0 0; + font-size: 0.8em; +} +.swal2-toast button:where(.swal2-close) { + grid-column: 3/3; + grid-row: 1/99; + align-self: center; + width: 0.8em; + height: 0.8em; + margin: 0; + font-size: 2em; +} +.swal2-toast div:where(.swal2-html-container) { + margin: 0.5em 1em; + padding: 0; + overflow: initial; + font-size: 1em; + text-align: initial; +} +.swal2-toast div:where(.swal2-html-container):empty { + padding: 0; +} +.swal2-toast .swal2-loader { + grid-column: 1; + grid-row: 1/99; + align-self: center; + width: 2em; + height: 2em; + margin: 0.25em; +} +.swal2-toast .swal2-icon { + grid-column: 1; + grid-row: 1/99; + align-self: center; + width: 2em; + min-width: 2em; + height: 2em; + margin: 0 0.5em 0 0; +} +.swal2-toast .swal2-icon .swal2-icon-content { + display: flex; + align-items: center; + font-size: 1.8em; + font-weight: bold; +} +.swal2-toast .swal2-icon.swal2-success .swal2-success-ring { + width: 2em; + height: 2em; +} +.swal2-toast .swal2-icon.swal2-error [class^=swal2-x-mark-line] { + top: 0.875em; + width: 1.375em; +} +.swal2-toast .swal2-icon.swal2-error [class^=swal2-x-mark-line][class$=left] { + left: 0.3125em; +} +.swal2-toast .swal2-icon.swal2-error [class^=swal2-x-mark-line][class$=right] { + right: 0.3125em; +} +.swal2-toast div:where(.swal2-actions) { + justify-content: flex-start; + height: auto; + margin: 0; + margin-top: 0.5em; + padding: 0 0.5em; +} +.swal2-toast button:where(.swal2-styled) { + margin: 0.25em 0.5em; + padding: 0.4em 0.6em; + font-size: 1em; +} +.swal2-toast .swal2-success { + border-color: #a5dc86; +} +.swal2-toast .swal2-success [class^=swal2-success-circular-line] { + position: absolute; + width: 1.6em; + height: 3em; + border-radius: 50%; +} +.swal2-toast .swal2-success [class^=swal2-success-circular-line][class$=left] { + top: -0.8em; + left: -0.5em; + transform: rotate(-45deg); + transform-origin: 2em 2em; + border-radius: 4em 0 0 4em; +} +.swal2-toast .swal2-success [class^=swal2-success-circular-line][class$=right] { + top: -0.25em; + left: 0.9375em; + transform-origin: 0 1.5em; + border-radius: 0 4em 4em 0; +} +.swal2-toast .swal2-success .swal2-success-ring { + width: 2em; + height: 2em; +} +.swal2-toast .swal2-success .swal2-success-fix { + top: 0; + left: 0.4375em; + width: 0.4375em; + height: 2.6875em; +} +.swal2-toast .swal2-success [class^=swal2-success-line] { + height: 0.3125em; +} +.swal2-toast .swal2-success [class^=swal2-success-line][class$=tip] { + top: 1.125em; + left: 0.1875em; + width: 0.75em; +} +.swal2-toast .swal2-success [class^=swal2-success-line][class$=long] { + top: 0.9375em; + right: 0.1875em; + width: 1.375em; +} +@container swal2-popup style(--swal2-icon-animations:true) { + .swal2-toast .swal2-success.swal2-icon-show .swal2-success-line-tip { + animation: swal2-toast-animate-success-line-tip 0.75s; + } + .swal2-toast .swal2-success.swal2-icon-show .swal2-success-line-long { + animation: swal2-toast-animate-success-line-long 0.75s; + } +} +.swal2-toast.swal2-show { + animation: var(--swal2-toast-show-animation); +} +.swal2-toast.swal2-hide { + animation: var(--swal2-toast-hide-animation); +} + +@keyframes swal2-show { + 0% { + transform: translate3d(0, -50px, 0) scale(0.9); + opacity: 0; + } + 100% { + transform: translate3d(0, 0, 0) scale(1); + opacity: 1; + } +} +@keyframes swal2-hide { + 0% { + transform: translate3d(0, 0, 0) scale(1); + opacity: 1; + } + 100% { + transform: translate3d(0, -50px, 0) scale(0.9); + opacity: 0; + } +} +@keyframes swal2-animate-success-line-tip { + 0% { + top: 1.1875em; + left: 0.0625em; + width: 0; + } + 54% { + top: 1.0625em; + left: 0.125em; + width: 0; + } + 70% { + top: 2.1875em; + left: -0.375em; + width: 3.125em; + } + 84% { + top: 3em; + left: 1.3125em; + width: 1.0625em; + } + 100% { + top: 2.8125em; + left: 0.8125em; + width: 1.5625em; + } +} +@keyframes swal2-animate-success-line-long { + 0% { + top: 3.375em; + right: 2.875em; + width: 0; + } + 65% { + top: 3.375em; + right: 2.875em; + width: 0; + } + 84% { + top: 2.1875em; + right: 0; + width: 3.4375em; + } + 100% { + top: 2.375em; + right: 0.5em; + width: 2.9375em; + } +} +@keyframes swal2-rotate-success-circular-line { + 0% { + transform: rotate(-45deg); + } + 5% { + transform: rotate(-45deg); + } + 12% { + transform: rotate(-405deg); + } + 100% { + transform: rotate(-405deg); + } +} +@keyframes swal2-animate-error-x-mark { + 0% { + margin-top: 1.625em; + transform: scale(0.4); + opacity: 0; + } + 50% { + margin-top: 1.625em; + transform: scale(0.4); + opacity: 0; + } + 80% { + margin-top: -0.375em; + transform: scale(1.15); + } + 100% { + margin-top: 0; + transform: scale(1); + opacity: 1; + } +} +@keyframes swal2-animate-error-icon { + 0% { + transform: rotateX(100deg); + opacity: 0; + } + 100% { + transform: rotateX(0deg); + opacity: 1; + } +} +@keyframes swal2-rotate-loading { + 0% { + transform: rotate(0deg); + } + 100% { + transform: rotate(360deg); + } +} +@keyframes swal2-animate-question-mark { + 0% { + transform: rotateY(-360deg); + } + 100% { + transform: rotateY(0); + } +} +@keyframes swal2-animate-i-mark { + 0% { + transform: rotateZ(45deg); + opacity: 0; + } + 25% { + transform: rotateZ(-25deg); + opacity: 0.4; + } + 50% { + transform: rotateZ(15deg); + opacity: 0.8; + } + 75% { + transform: rotateZ(-5deg); + opacity: 1; + } + 100% { + transform: rotateX(0); + opacity: 1; + } +} +@keyframes swal2-toast-show { + 0% { + transform: translateY(-0.625em) rotateZ(2deg); + } + 33% { + transform: translateY(0) rotateZ(-2deg); + } + 66% { + transform: translateY(0.3125em) rotateZ(2deg); + } + 100% { + transform: translateY(0) rotateZ(0deg); + } +} +@keyframes swal2-toast-hide { + 100% { + transform: rotateZ(1deg); + opacity: 0; + } +} +@keyframes swal2-toast-animate-success-line-tip { + 0% { + top: 0.5625em; + left: 0.0625em; + width: 0; + } + 54% { + top: 0.125em; + left: 0.125em; + width: 0; + } + 70% { + top: 0.625em; + left: -0.25em; + width: 1.625em; + } + 84% { + top: 1.0625em; + left: 0.75em; + width: 0.5em; + } + 100% { + top: 1.125em; + left: 0.1875em; + width: 0.75em; + } +} +@keyframes swal2-toast-animate-success-line-long { + 0% { + top: 1.625em; + right: 1.375em; + width: 0; + } + 65% { + top: 1.25em; + right: 0.9375em; + width: 0; + } + 84% { + top: 0.9375em; + right: 0; + width: 1.125em; + } + 100% { + top: 0.9375em; + right: 0.1875em; + width: 1.375em; + } +} diff --git a/public/assets/sweetalert2/dist/sweetalert2.esm.all.js b/public/assets/sweetalert2/dist/sweetalert2.esm.all.js new file mode 100644 index 0000000..f3f76c4 --- /dev/null +++ b/public/assets/sweetalert2/dist/sweetalert2.esm.all.js @@ -0,0 +1,4816 @@ +/*! +* sweetalert2 v11.26.18 +* Released under the MIT License. +*/ +function _assertClassBrand(e, t, n) { + if ("function" == typeof e ? e === t : e.has(t)) return arguments.length < 3 ? t : n; + throw new TypeError("Private element is not present on this object"); +} +function _checkPrivateRedeclaration(e, t) { + if (t.has(e)) throw new TypeError("Cannot initialize the same private elements twice on an object"); +} +function _classPrivateFieldGet2(s, a) { + return s.get(_assertClassBrand(s, a)); +} +function _classPrivateFieldInitSpec(e, t, a) { + _checkPrivateRedeclaration(e, t), t.set(e, a); +} +function _classPrivateFieldSet2(s, a, r) { + return s.set(_assertClassBrand(s, a), r), r; +} + +const RESTORE_FOCUS_TIMEOUT = 100; + +/** @type {GlobalState} */ +const globalState = {}; +const focusPreviousActiveElement = () => { + if (globalState.previousActiveElement instanceof HTMLElement) { + globalState.previousActiveElement.focus(); + globalState.previousActiveElement = null; + } else if (document.body) { + document.body.focus(); + } +}; + +/** + * Restore previous active (focused) element + * + * @param {boolean} returnFocus + * @returns {Promise} + */ +const restoreActiveElement = returnFocus => { + return new Promise(resolve => { + if (!returnFocus) { + return resolve(); + } + const x = window.scrollX; + const y = window.scrollY; + globalState.restoreFocusTimeout = setTimeout(() => { + focusPreviousActiveElement(); + resolve(); + }, RESTORE_FOCUS_TIMEOUT); // issues/900 + + window.scrollTo(x, y); + }); +}; + +const swalPrefix = 'swal2-'; + +/** + * @typedef {Record} SwalClasses + */ + +/** + * @typedef {'success' | 'warning' | 'info' | 'question' | 'error'} SwalIcon + * @typedef {Record} SwalIcons + */ + +/** @type {SwalClass[]} */ +const classNames = ['container', 'shown', 'height-auto', 'iosfix', 'popup', 'modal', 'no-backdrop', 'no-transition', 'toast', 'toast-shown', 'show', 'hide', 'close', 'title', 'html-container', 'actions', 'confirm', 'deny', 'cancel', 'footer', 'icon', 'icon-content', 'image', 'input', 'file', 'range', 'select', 'radio', 'checkbox', 'label', 'textarea', 'inputerror', 'input-label', 'validation-message', 'progress-steps', 'active-progress-step', 'progress-step', 'progress-step-line', 'loader', 'loading', 'styled', 'top', 'top-start', 'top-end', 'top-left', 'top-right', 'center', 'center-start', 'center-end', 'center-left', 'center-right', 'bottom', 'bottom-start', 'bottom-end', 'bottom-left', 'bottom-right', 'grow-row', 'grow-column', 'grow-fullscreen', 'rtl', 'timer-progress-bar', 'timer-progress-bar-container', 'scrollbar-measure', 'icon-success', 'icon-warning', 'icon-info', 'icon-question', 'icon-error', 'draggable', 'dragging']; +const swalClasses = classNames.reduce((acc, className) => { + acc[className] = swalPrefix + className; + return acc; +}, /** @type {SwalClasses} */{}); + +/** @type {SwalIcon[]} */ +const icons = ['success', 'warning', 'info', 'question', 'error']; +const iconTypes = icons.reduce((acc, icon) => { + acc[icon] = swalPrefix + icon; + return acc; +}, /** @type {SwalIcons} */{}); + +const consolePrefix = 'SweetAlert2:'; + +/** + * Capitalize the first letter of a string + * + * @param {string} str + * @returns {string} + */ +const capitalizeFirstLetter = str => str.charAt(0).toUpperCase() + str.slice(1); + +/** + * Standardize console warnings + * + * @param {string | string[]} message + */ +const warn = message => { + console.warn(`${consolePrefix} ${typeof message === 'object' ? message.join(' ') : message}`); +}; + +/** + * Standardize console errors + * + * @param {string} message + */ +const error = message => { + console.error(`${consolePrefix} ${message}`); +}; + +/** + * Private global state for `warnOnce` + * + * @type {string[]} + * @private + */ +const previousWarnOnceMessages = []; + +/** + * Show a console warning, but only if it hasn't already been shown + * + * @param {string} message + */ +const warnOnce = message => { + if (!previousWarnOnceMessages.includes(message)) { + previousWarnOnceMessages.push(message); + warn(message); + } +}; + +/** + * Show a one-time console warning about deprecated params/methods + * + * @param {string} deprecatedParam + * @param {string?} useInstead + */ +const warnAboutDeprecation = (deprecatedParam, useInstead = null) => { + warnOnce(`"${deprecatedParam}" is deprecated and will be removed in the next major release.${useInstead ? ` Use "${useInstead}" instead.` : ''}`); +}; + +/** + * If `arg` is a function, call it (with no arguments or context) and return the result. + * Otherwise, just pass the value through + * + * @param {(() => *) | *} arg + * @returns {*} + */ +const callIfFunction = arg => typeof arg === 'function' ? arg() : arg; + +/** + * @param {*} arg + * @returns {boolean} + */ +const hasToPromiseFn = arg => arg && typeof arg.toPromise === 'function'; + +/** + * @param {*} arg + * @returns {Promise<*>} + */ +const asPromise = arg => hasToPromiseFn(arg) ? arg.toPromise() : Promise.resolve(arg); + +/** + * @param {*} arg + * @returns {boolean} + */ +const isPromise = arg => arg && Promise.resolve(arg) === arg; + +/** + * Gets the popup container which contains the backdrop and the popup itself. + * + * @returns {HTMLElement | null} + */ +const getContainer = () => document.body.querySelector(`.${swalClasses.container}`); + +/** + * @param {string} selectorString + * @returns {HTMLElement | null} + */ +const elementBySelector = selectorString => { + const container = getContainer(); + return container ? container.querySelector(selectorString) : null; +}; + +/** + * @param {string} className + * @returns {HTMLElement | null} + */ +const elementByClass = className => { + return elementBySelector(`.${className}`); +}; + +/** + * @returns {HTMLElement | null} + */ +const getPopup = () => elementByClass(swalClasses.popup); + +/** + * @returns {HTMLElement | null} + */ +const getIcon = () => elementByClass(swalClasses.icon); + +/** + * @returns {HTMLElement | null} + */ +const getIconContent = () => elementByClass(swalClasses['icon-content']); + +/** + * @returns {HTMLElement | null} + */ +const getTitle = () => elementByClass(swalClasses.title); + +/** + * @returns {HTMLElement | null} + */ +const getHtmlContainer = () => elementByClass(swalClasses['html-container']); + +/** + * @returns {HTMLElement | null} + */ +const getImage = () => elementByClass(swalClasses.image); + +/** + * @returns {HTMLElement | null} + */ +const getProgressSteps = () => elementByClass(swalClasses['progress-steps']); + +/** + * @returns {HTMLElement | null} + */ +const getValidationMessage = () => elementByClass(swalClasses['validation-message']); + +/** + * @returns {HTMLButtonElement | null} + */ +const getConfirmButton = () => (/** @type {HTMLButtonElement} */elementBySelector(`.${swalClasses.actions} .${swalClasses.confirm}`)); + +/** + * @returns {HTMLButtonElement | null} + */ +const getCancelButton = () => (/** @type {HTMLButtonElement} */elementBySelector(`.${swalClasses.actions} .${swalClasses.cancel}`)); + +/** + * @returns {HTMLButtonElement | null} + */ +const getDenyButton = () => (/** @type {HTMLButtonElement} */elementBySelector(`.${swalClasses.actions} .${swalClasses.deny}`)); + +/** + * @returns {HTMLElement | null} + */ +const getInputLabel = () => elementByClass(swalClasses['input-label']); + +/** + * @returns {HTMLElement | null} + */ +const getLoader = () => elementBySelector(`.${swalClasses.loader}`); + +/** + * @returns {HTMLElement | null} + */ +const getActions = () => elementByClass(swalClasses.actions); + +/** + * @returns {HTMLElement | null} + */ +const getFooter = () => elementByClass(swalClasses.footer); + +/** + * @returns {HTMLElement | null} + */ +const getTimerProgressBar = () => elementByClass(swalClasses['timer-progress-bar']); + +/** + * @returns {HTMLElement | null} + */ +const getCloseButton = () => elementByClass(swalClasses.close); + +// https://github.com/jkup/focusable/blob/master/index.js +const focusable = ` + a[href], + area[href], + input:not([disabled]), + select:not([disabled]), + textarea:not([disabled]), + button:not([disabled]), + iframe, + object, + embed, + [tabindex="0"], + [contenteditable], + audio[controls], + video[controls], + summary +`; +/** + * @returns {HTMLElement[]} + */ +const getFocusableElements = () => { + const popup = getPopup(); + if (!popup) { + return []; + } + /** @type {NodeListOf} */ + const focusableElementsWithTabindex = popup.querySelectorAll('[tabindex]:not([tabindex="-1"]):not([tabindex="0"])'); + const focusableElementsWithTabindexSorted = Array.from(focusableElementsWithTabindex) + // sort according to tabindex + .sort((a, b) => { + const tabindexA = parseInt(a.getAttribute('tabindex') || '0'); + const tabindexB = parseInt(b.getAttribute('tabindex') || '0'); + if (tabindexA > tabindexB) { + return 1; + } else if (tabindexA < tabindexB) { + return -1; + } + return 0; + }); + + /** @type {NodeListOf} */ + const otherFocusableElements = popup.querySelectorAll(focusable); + const otherFocusableElementsFiltered = Array.from(otherFocusableElements).filter(el => el.getAttribute('tabindex') !== '-1'); + return [...new Set(focusableElementsWithTabindexSorted.concat(otherFocusableElementsFiltered))].filter(el => isVisible$1(el)); +}; + +/** + * @returns {boolean} + */ +const isModal = () => { + return hasClass(document.body, swalClasses.shown) && !hasClass(document.body, swalClasses['toast-shown']) && !hasClass(document.body, swalClasses['no-backdrop']); +}; + +/** + * @returns {boolean} + */ +const isToast = () => { + const popup = getPopup(); + if (!popup) { + return false; + } + return hasClass(popup, swalClasses.toast); +}; + +/** + * @returns {boolean} + */ +const isLoading = () => { + const popup = getPopup(); + if (!popup) { + return false; + } + return popup.hasAttribute('data-loading'); +}; + +/** + * Securely set innerHTML of an element + * https://github.com/sweetalert2/sweetalert2/issues/1926 + * + * @param {HTMLElement} elem + * @param {string} html + */ +const setInnerHtml = (elem, html) => { + elem.textContent = ''; + if (html) { + const parser = new DOMParser(); + const parsed = parser.parseFromString(html, `text/html`); + const head = parsed.querySelector('head'); + if (head) { + Array.from(head.childNodes).forEach(child => { + elem.appendChild(child); + }); + } + const body = parsed.querySelector('body'); + if (body) { + Array.from(body.childNodes).forEach(child => { + if (child instanceof HTMLVideoElement || child instanceof HTMLAudioElement) { + elem.appendChild(child.cloneNode(true)); // https://github.com/sweetalert2/sweetalert2/issues/2507 + } else { + elem.appendChild(child); + } + }); + } + } +}; + +/** + * @param {HTMLElement} elem + * @param {string} className + * @returns {boolean} + */ +const hasClass = (elem, className) => { + if (!className) { + return false; + } + const classList = className.split(/\s+/); + for (let i = 0; i < classList.length; i++) { + if (!elem.classList.contains(classList[i])) { + return false; + } + } + return true; +}; + +/** + * @param {HTMLElement} elem + * @param {SweetAlertOptions} params + */ +const removeCustomClasses = (elem, params) => { + Array.from(elem.classList).forEach(className => { + if (!Object.values(swalClasses).includes(className) && !Object.values(iconTypes).includes(className) && !Object.values(params.showClass || {}).includes(className)) { + elem.classList.remove(className); + } + }); +}; + +/** + * @param {HTMLElement} elem + * @param {SweetAlertOptions} params + * @param {string} className + */ +const applyCustomClass = (elem, params, className) => { + removeCustomClasses(elem, params); + if (!params.customClass) { + return; + } + const customClass = params.customClass[(/** @type {keyof SweetAlertCustomClass} */className)]; + if (!customClass) { + return; + } + if (typeof customClass !== 'string' && !customClass.forEach) { + warn(`Invalid type of customClass.${className}! Expected string or iterable object, got "${typeof customClass}"`); + return; + } + addClass(elem, customClass); +}; + +/** + * @param {HTMLElement} popup + * @param {import('./renderers/renderInput').InputClass | SweetAlertInput} inputClass + * @returns {HTMLInputElement | null} + */ +const getInput$1 = (popup, inputClass) => { + if (!inputClass) { + return null; + } + switch (inputClass) { + case 'select': + case 'textarea': + case 'file': + return popup.querySelector(`.${swalClasses.popup} > .${swalClasses[inputClass]}`); + case 'checkbox': + return popup.querySelector(`.${swalClasses.popup} > .${swalClasses.checkbox} input`); + case 'radio': + return popup.querySelector(`.${swalClasses.popup} > .${swalClasses.radio} input:checked`) || popup.querySelector(`.${swalClasses.popup} > .${swalClasses.radio} input:first-child`); + case 'range': + return popup.querySelector(`.${swalClasses.popup} > .${swalClasses.range} input`); + default: + return popup.querySelector(`.${swalClasses.popup} > .${swalClasses.input}`); + } +}; + +/** + * @param {HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement} input + */ +const focusInput = input => { + input.focus(); + + // place cursor at end of text in text input + if (input.type !== 'file') { + // http://stackoverflow.com/a/2345915 + const val = input.value; + input.value = ''; + input.value = val; + } +}; + +/** + * @param {HTMLElement | HTMLElement[] | null} target + * @param {string | string[] | readonly string[] | undefined} classList + * @param {boolean} condition + */ +const toggleClass = (target, classList, condition) => { + if (!target || !classList) { + return; + } + if (typeof classList === 'string') { + classList = classList.split(/\s+/).filter(Boolean); + } + classList.forEach(className => { + if (Array.isArray(target)) { + target.forEach(elem => { + if (condition) { + elem.classList.add(className); + } else { + elem.classList.remove(className); + } + }); + } else { + if (condition) { + target.classList.add(className); + } else { + target.classList.remove(className); + } + } + }); +}; + +/** + * @param {HTMLElement | HTMLElement[] | null} target + * @param {string | string[] | readonly string[] | undefined} classList + */ +const addClass = (target, classList) => { + toggleClass(target, classList, true); +}; + +/** + * @param {HTMLElement | HTMLElement[] | null} target + * @param {string | string[] | readonly string[] | undefined} classList + */ +const removeClass = (target, classList) => { + toggleClass(target, classList, false); +}; + +/** + * Get direct child of an element by class name + * + * @param {HTMLElement} elem + * @param {string} className + * @returns {HTMLElement | undefined} + */ +const getDirectChildByClass = (elem, className) => { + const children = Array.from(elem.children); + for (let i = 0; i < children.length; i++) { + const child = children[i]; + if (child instanceof HTMLElement && hasClass(child, className)) { + return child; + } + } +}; + +/** + * @param {HTMLElement} elem + * @param {string} property + * @param {string | number | null | undefined} value + */ +const applyNumericalStyle = (elem, property, value) => { + if (value === `${parseInt(`${value}`)}`) { + value = parseInt(value); + } + if (value || parseInt(`${value}`) === 0) { + elem.style.setProperty(property, typeof value === 'number' ? `${value}px` : (/** @type {string} */value)); + } else { + elem.style.removeProperty(property); + } +}; + +/** + * @param {HTMLElement | null} elem + * @param {string} display + */ +const show = (elem, display = 'flex') => { + if (!elem) { + return; + } + elem.style.display = display; +}; + +/** + * @param {HTMLElement | null} elem + */ +const hide = elem => { + if (!elem) { + return; + } + elem.style.display = 'none'; +}; + +/** + * @param {HTMLElement | null} elem + * @param {string} display + */ +const showWhenInnerHtmlPresent = (elem, display = 'block') => { + if (!elem) { + return; + } + new MutationObserver(() => { + toggle(elem, elem.innerHTML, display); + }).observe(elem, { + childList: true, + subtree: true + }); +}; + +/** + * @param {HTMLElement} parent + * @param {string} selector + * @param {string} property + * @param {string} value + */ +const setStyle = (parent, selector, property, value) => { + /** @type {HTMLElement | null} */ + const el = parent.querySelector(selector); + if (el) { + el.style.setProperty(property, value); + } +}; + +/** + * @param {HTMLElement} elem + * @param {boolean | string | null | undefined} condition + * @param {string} display + */ +const toggle = (elem, condition, display = 'flex') => { + if (condition) { + show(elem, display); + } else { + hide(elem); + } +}; + +/** + * borrowed from jquery $(elem).is(':visible') implementation + * + * @param {HTMLElement | null} elem + * @returns {boolean} + */ +const isVisible$1 = elem => Boolean(elem && (elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length)); + +/** + * @returns {boolean} + */ +const allButtonsAreHidden = () => !isVisible$1(getConfirmButton()) && !isVisible$1(getDenyButton()) && !isVisible$1(getCancelButton()); + +/** + * @param {HTMLElement} elem + * @returns {boolean} + */ +const isScrollable = elem => Boolean(elem.scrollHeight > elem.clientHeight); + +/** + * @param {HTMLElement} element + * @param {HTMLElement} stopElement + * @returns {boolean} + */ +const selfOrParentIsScrollable = (element, stopElement) => { + let parent = /** @type {HTMLElement | null} */element; + while (parent && parent !== stopElement) { + if (isScrollable(parent)) { + return true; + } + parent = parent.parentElement; + } + return false; +}; + +/** + * borrowed from https://stackoverflow.com/a/46352119 + * + * @param {HTMLElement} elem + * @returns {boolean} + */ +const hasCssAnimation = elem => { + const style = window.getComputedStyle(elem); + const animDuration = parseFloat(style.getPropertyValue('animation-duration') || '0'); + const transDuration = parseFloat(style.getPropertyValue('transition-duration') || '0'); + return animDuration > 0 || transDuration > 0; +}; + +/** + * @param {number} timer + * @param {boolean} reset + */ +const animateTimerProgressBar = (timer, reset = false) => { + const timerProgressBar = getTimerProgressBar(); + if (!timerProgressBar) { + return; + } + if (isVisible$1(timerProgressBar)) { + if (reset) { + timerProgressBar.style.transition = 'none'; + timerProgressBar.style.width = '100%'; + } + setTimeout(() => { + timerProgressBar.style.transition = `width ${timer / 1000}s linear`; + timerProgressBar.style.width = '0%'; + }, 10); + } +}; +const stopTimerProgressBar = () => { + const timerProgressBar = getTimerProgressBar(); + if (!timerProgressBar) { + return; + } + const timerProgressBarWidth = parseInt(window.getComputedStyle(timerProgressBar).width); + timerProgressBar.style.removeProperty('transition'); + timerProgressBar.style.width = '100%'; + const timerProgressBarFullWidth = parseInt(window.getComputedStyle(timerProgressBar).width); + const timerProgressBarPercent = timerProgressBarWidth / timerProgressBarFullWidth * 100; + timerProgressBar.style.width = `${timerProgressBarPercent}%`; +}; + +/** + * Detect Node env + * + * @returns {boolean} + */ +const isNodeEnv = () => typeof window === 'undefined' || typeof document === 'undefined'; + +const sweetHTML = ` +
        + +
          +
          + +

          +
          + + +
          + + +
          + +
          + + +
          +
          +
          + + + +
          +
          +
          +
          +
          +
          +`.replace(/(^|\n)\s*/g, ''); + +/** + * @returns {boolean} + */ +const resetOldContainer = () => { + const oldContainer = getContainer(); + if (!oldContainer) { + return false; + } + oldContainer.remove(); + removeClass([document.documentElement, document.body], [swalClasses['no-backdrop'], swalClasses['toast-shown'], + // @ts-ignore: 'has-column' is not defined in swalClasses but may be set dynamically + swalClasses['has-column']]); + return true; +}; +const resetValidationMessage$1 = () => { + if (globalState.currentInstance) { + globalState.currentInstance.resetValidationMessage(); + } +}; +const addInputChangeListeners = () => { + const popup = getPopup(); + if (!popup) { + return; + } + const input = getDirectChildByClass(popup, swalClasses.input); + const file = getDirectChildByClass(popup, swalClasses.file); + /** @type {HTMLInputElement | null} */ + const range = popup.querySelector(`.${swalClasses.range} input`); + /** @type {HTMLOutputElement | null} */ + const rangeOutput = popup.querySelector(`.${swalClasses.range} output`); + const select = getDirectChildByClass(popup, swalClasses.select); + /** @type {HTMLInputElement | null} */ + const checkbox = popup.querySelector(`.${swalClasses.checkbox} input`); + const textarea = getDirectChildByClass(popup, swalClasses.textarea); + if (input) { + input.oninput = resetValidationMessage$1; + } + if (file) { + file.onchange = resetValidationMessage$1; + } + if (select) { + select.onchange = resetValidationMessage$1; + } + if (checkbox) { + checkbox.onchange = resetValidationMessage$1; + } + if (textarea) { + textarea.oninput = resetValidationMessage$1; + } + if (range && rangeOutput) { + range.oninput = () => { + resetValidationMessage$1(); + rangeOutput.value = range.value; + }; + range.onchange = () => { + resetValidationMessage$1(); + rangeOutput.value = range.value; + }; + } +}; + +/** + * @param {string | HTMLElement} target + * @returns {HTMLElement} + */ +const getTarget = target => { + if (typeof target === 'string') { + const element = document.querySelector(target); + if (!element) { + throw new Error(`Target element "${target}" not found`); + } + return /** @type {HTMLElement} */element; + } + return target; +}; + +/** + * @param {SweetAlertOptions} params + */ +const setupAccessibility = params => { + const popup = getPopup(); + if (!popup) { + return; + } + popup.setAttribute('role', params.toast ? 'alert' : 'dialog'); + popup.setAttribute('aria-live', params.toast ? 'polite' : 'assertive'); + if (!params.toast) { + popup.setAttribute('aria-modal', 'true'); + } +}; + +/** + * @param {HTMLElement} targetElement + */ +const setupRTL = targetElement => { + if (window.getComputedStyle(targetElement).direction === 'rtl') { + addClass(getContainer(), swalClasses.rtl); + globalState.isRTL = true; + } +}; + +/** + * Add modal + backdrop to DOM + * + * @param {SweetAlertOptions} params + */ +const init = params => { + // Clean up the old popup container if it exists + const oldContainerExisted = resetOldContainer(); + if (isNodeEnv()) { + error('SweetAlert2 requires document to initialize'); + return; + } + const container = document.createElement('div'); + container.className = swalClasses.container; + if (oldContainerExisted) { + addClass(container, swalClasses['no-transition']); + } + setInnerHtml(container, sweetHTML); + container.dataset['swal2Theme'] = params.theme; + const targetElement = getTarget(params.target || 'body'); + targetElement.appendChild(container); + if (params.topLayer) { + container.setAttribute('popover', ''); + container.showPopover(); + } + setupAccessibility(params); + setupRTL(targetElement); + addInputChangeListeners(); +}; + +/** + * @param {HTMLElement | object | string} param + * @param {HTMLElement} target + */ +const parseHtmlToContainer = (param, target) => { + // DOM element + if (param instanceof HTMLElement) { + target.appendChild(param); + } + + // Object + else if (typeof param === 'object') { + handleObject(param, target); + } + + // Plain string + else if (param) { + setInnerHtml(target, param); + } +}; + +/** + * @param {object} param + * @param {HTMLElement} target + */ +const handleObject = (param, target) => { + // JQuery element(s) + if ('jquery' in param) { + handleJqueryElem(target, param); + } + + // For other objects use their string representation + else { + setInnerHtml(target, param.toString()); + } +}; + +/** + * @param {HTMLElement} target + * @param {any} elem + */ +const handleJqueryElem = (target, elem) => { + target.textContent = ''; + if (0 in elem) { + for (let i = 0; i in elem; i++) { + target.appendChild(elem[i].cloneNode(true)); + } + } else { + target.appendChild(elem.cloneNode(true)); + } +}; + +/** + * @param {SweetAlert} instance + * @param {SweetAlertOptions} params + */ +const renderActions = (instance, params) => { + const actions = getActions(); + const loader = getLoader(); + if (!actions || !loader) { + return; + } + + // Actions (buttons) wrapper + if (!params.showConfirmButton && !params.showDenyButton && !params.showCancelButton) { + hide(actions); + } else { + show(actions); + } + + // Custom class + applyCustomClass(actions, params, 'actions'); + + // Render all the buttons + renderButtons(actions, loader, params); + + // Loader + setInnerHtml(loader, params.loaderHtml || ''); + applyCustomClass(loader, params, 'loader'); +}; + +/** + * @param {HTMLElement} actions + * @param {HTMLElement} loader + * @param {SweetAlertOptions} params + */ +function renderButtons(actions, loader, params) { + const confirmButton = getConfirmButton(); + const denyButton = getDenyButton(); + const cancelButton = getCancelButton(); + if (!confirmButton || !denyButton || !cancelButton) { + return; + } + + // Render buttons + renderButton(confirmButton, 'confirm', params); + renderButton(denyButton, 'deny', params); + renderButton(cancelButton, 'cancel', params); + handleButtonsStyling(confirmButton, denyButton, cancelButton, params); + if (params.reverseButtons) { + if (params.toast) { + actions.insertBefore(cancelButton, confirmButton); + actions.insertBefore(denyButton, confirmButton); + } else { + actions.insertBefore(cancelButton, loader); + actions.insertBefore(denyButton, loader); + actions.insertBefore(confirmButton, loader); + } + } +} + +/** + * @param {HTMLElement} confirmButton + * @param {HTMLElement} denyButton + * @param {HTMLElement} cancelButton + * @param {SweetAlertOptions} params + */ +function handleButtonsStyling(confirmButton, denyButton, cancelButton, params) { + if (!params.buttonsStyling) { + removeClass([confirmButton, denyButton, cancelButton], swalClasses.styled); + return; + } + addClass([confirmButton, denyButton, cancelButton], swalClasses.styled); + + // Apply custom background colors to action buttons + if (params.confirmButtonColor) { + confirmButton.style.setProperty('--swal2-confirm-button-background-color', params.confirmButtonColor); + } + if (params.denyButtonColor) { + denyButton.style.setProperty('--swal2-deny-button-background-color', params.denyButtonColor); + } + if (params.cancelButtonColor) { + cancelButton.style.setProperty('--swal2-cancel-button-background-color', params.cancelButtonColor); + } + + // Apply the outline color to action buttons + applyOutlineColor(confirmButton); + applyOutlineColor(denyButton); + applyOutlineColor(cancelButton); +} + +/** + * @param {HTMLElement} button + */ +function applyOutlineColor(button) { + const buttonStyle = window.getComputedStyle(button); + if (buttonStyle.getPropertyValue('--swal2-action-button-focus-box-shadow')) { + // If the button already has a custom outline color, no need to change it + return; + } + const outlineColor = buttonStyle.backgroundColor.replace(/rgba?\((\d+), (\d+), (\d+).*/, 'rgba($1, $2, $3, 0.5)'); + button.style.setProperty('--swal2-action-button-focus-box-shadow', buttonStyle.getPropertyValue('--swal2-outline').replace(/ rgba\(.*/, ` ${outlineColor}`)); +} + +/** + * @param {HTMLElement} button + * @param {'confirm' | 'deny' | 'cancel'} buttonType + * @param {SweetAlertOptions} params + */ +function renderButton(button, buttonType, params) { + const buttonName = /** @type {'Confirm' | 'Deny' | 'Cancel'} */capitalizeFirstLetter(buttonType); + toggle(button, params[`show${buttonName}Button`], 'inline-block'); + setInnerHtml(button, params[`${buttonType}ButtonText`] || ''); // Set caption text + button.setAttribute('aria-label', params[`${buttonType}ButtonAriaLabel`] || ''); // ARIA label + + // Add buttons custom classes + button.className = swalClasses[buttonType]; + applyCustomClass(button, params, `${buttonType}Button`); +} + +/** + * @param {SweetAlert} instance + * @param {SweetAlertOptions} params + */ +const renderCloseButton = (instance, params) => { + const closeButton = getCloseButton(); + if (!closeButton) { + return; + } + setInnerHtml(closeButton, params.closeButtonHtml || ''); + + // Custom class + applyCustomClass(closeButton, params, 'closeButton'); + toggle(closeButton, params.showCloseButton); + closeButton.setAttribute('aria-label', params.closeButtonAriaLabel || ''); +}; + +/** + * @param {SweetAlert} instance + * @param {SweetAlertOptions} params + */ +const renderContainer = (instance, params) => { + const container = getContainer(); + if (!container) { + return; + } + handleBackdropParam(container, params.backdrop); + handlePositionParam(container, params.position); + handleGrowParam(container, params.grow); + + // Custom class + applyCustomClass(container, params, 'container'); +}; + +/** + * @param {HTMLElement} container + * @param {SweetAlertOptions['backdrop']} backdrop + */ +function handleBackdropParam(container, backdrop) { + if (typeof backdrop === 'string') { + container.style.background = backdrop; + } else if (!backdrop) { + addClass([document.documentElement, document.body], swalClasses['no-backdrop']); + } +} + +/** + * @param {HTMLElement} container + * @param {SweetAlertOptions['position']} position + */ +function handlePositionParam(container, position) { + if (!position) { + return; + } + if (position in swalClasses) { + addClass(container, swalClasses[position]); + } else { + warn('The "position" parameter is not valid, defaulting to "center"'); + addClass(container, swalClasses.center); + } +} + +/** + * @param {HTMLElement} container + * @param {SweetAlertOptions['grow']} grow + */ +function handleGrowParam(container, grow) { + if (!grow) { + return; + } + addClass(container, swalClasses[`grow-${grow}`]); +} + +/** + * This module contains `WeakMap`s for each effectively-"private property" that a `Swal` has. + * For example, to set the private property "foo" of `this` to "bar", you can `privateProps.foo.set(this, 'bar')` + * This is the approach that Babel will probably take to implement private methods/fields + * https://github.com/tc39/proposal-private-methods + * https://github.com/babel/babel/pull/7555 + * Once we have the changes from that PR in Babel, and our core class fits reasonable in *one module* + * then we can use that language feature. + */ + +var privateProps = { + innerParams: new WeakMap(), + domCache: new WeakMap() +}; + +/// + + +/** @type {InputClass[]} */ +const inputClasses = ['input', 'file', 'range', 'select', 'radio', 'checkbox', 'textarea']; + +/** + * @param {SweetAlert} instance + * @param {SweetAlertOptions} params + */ +const renderInput = (instance, params) => { + const popup = getPopup(); + if (!popup) { + return; + } + const innerParams = privateProps.innerParams.get(instance); + const rerender = !innerParams || params.input !== innerParams.input; + inputClasses.forEach(inputClass => { + const inputContainer = getDirectChildByClass(popup, swalClasses[inputClass]); + if (!inputContainer) { + return; + } + + // set attributes + setAttributes(inputClass, params.inputAttributes); + + // set class + inputContainer.className = swalClasses[inputClass]; + if (rerender) { + hide(inputContainer); + } + }); + if (params.input) { + if (rerender) { + showInput(params); + } + // set custom class + setCustomClass(params); + } +}; + +/** + * @param {SweetAlertOptions} params + */ +const showInput = params => { + if (!params.input) { + return; + } + if (!renderInputType[params.input]) { + error(`Unexpected type of input! Expected ${Object.keys(renderInputType).join(' | ')}, got "${params.input}"`); + return; + } + const inputContainer = getInputContainer(params.input); + if (!inputContainer) { + return; + } + const input = renderInputType[params.input](inputContainer, params); + show(inputContainer); + + // input autofocus + if (params.inputAutoFocus) { + setTimeout(() => { + focusInput(input); + }); + } +}; + +/** + * @param {HTMLInputElement} input + */ +const removeAttributes = input => { + for (let i = 0; i < input.attributes.length; i++) { + const attrName = input.attributes[i].name; + if (!['id', 'type', 'value', 'style'].includes(attrName)) { + input.removeAttribute(attrName); + } + } +}; + +/** + * @param {InputClass} inputClass + * @param {SweetAlertOptions['inputAttributes']} inputAttributes + */ +const setAttributes = (inputClass, inputAttributes) => { + const popup = getPopup(); + if (!popup) { + return; + } + const input = getInput$1(popup, inputClass); + if (!input) { + return; + } + removeAttributes(input); + for (const attr in inputAttributes) { + input.setAttribute(attr, inputAttributes[attr]); + } +}; + +/** + * @param {SweetAlertOptions} params + */ +const setCustomClass = params => { + if (!params.input) { + return; + } + const inputContainer = getInputContainer(params.input); + if (inputContainer) { + applyCustomClass(inputContainer, params, 'input'); + } +}; + +/** + * @param {HTMLInputElement | HTMLTextAreaElement} input + * @param {SweetAlertOptions} params + */ +const setInputPlaceholder = (input, params) => { + if (!input.placeholder && params.inputPlaceholder) { + input.placeholder = params.inputPlaceholder; + } +}; + +/** + * @param {Input} input + * @param {Input} prependTo + * @param {SweetAlertOptions} params + */ +const setInputLabel = (input, prependTo, params) => { + if (params.inputLabel) { + const label = document.createElement('label'); + const labelClass = swalClasses['input-label']; + label.setAttribute('for', input.id); + label.className = labelClass; + if (typeof params.customClass === 'object') { + addClass(label, params.customClass.inputLabel); + } + label.innerText = params.inputLabel; + prependTo.insertAdjacentElement('beforebegin', label); + } +}; + +/** + * @param {SweetAlertInput} inputType + * @returns {HTMLElement | undefined} + */ +const getInputContainer = inputType => { + const popup = getPopup(); + if (!popup) { + return; + } + return getDirectChildByClass(popup, swalClasses[(/** @type {SwalClass} */inputType)] || swalClasses.input); +}; + +/** + * @param {HTMLInputElement | HTMLOutputElement | HTMLTextAreaElement} input + * @param {SweetAlertOptions['inputValue']} inputValue + */ +const checkAndSetInputValue = (input, inputValue) => { + if (['string', 'number'].includes(typeof inputValue)) { + input.value = `${inputValue}`; + } else if (!isPromise(inputValue)) { + warn(`Unexpected type of inputValue! Expected "string", "number" or "Promise", got "${typeof inputValue}"`); + } +}; + +/** @type {Record Input>} */ +const renderInputType = {}; + +/** + * @param {Input | HTMLElement} input + * @param {SweetAlertOptions} params + * @returns {Input} + */ +renderInputType.text = renderInputType.email = renderInputType.password = renderInputType.number = renderInputType.tel = renderInputType.url = renderInputType.search = renderInputType.date = renderInputType['datetime-local'] = renderInputType.time = renderInputType.week = renderInputType.month = /** @type {(input: Input | HTMLElement, params: SweetAlertOptions) => Input} */ +(input, params) => { + const inputElement = /** @type {HTMLInputElement} */input; + checkAndSetInputValue(inputElement, params.inputValue); + setInputLabel(inputElement, inputElement, params); + setInputPlaceholder(inputElement, params); + inputElement.type = /** @type {string} */params.input; + return inputElement; +}; + +/** + * @param {Input | HTMLElement} input + * @param {SweetAlertOptions} params + * @returns {Input} + */ +renderInputType.file = (input, params) => { + const inputElement = /** @type {HTMLInputElement} */input; + setInputLabel(inputElement, inputElement, params); + setInputPlaceholder(inputElement, params); + return inputElement; +}; + +/** + * @param {Input | HTMLElement} range + * @param {SweetAlertOptions} params + * @returns {Input} + */ +renderInputType.range = (range, params) => { + const rangeContainer = /** @type {HTMLElement} */range; + const rangeInput = rangeContainer.querySelector('input'); + const rangeOutput = rangeContainer.querySelector('output'); + if (rangeInput) { + checkAndSetInputValue(rangeInput, params.inputValue); + rangeInput.type = /** @type {string} */params.input; + setInputLabel(rangeInput, /** @type {Input} */range, params); + } + if (rangeOutput) { + checkAndSetInputValue(rangeOutput, params.inputValue); + } + return /** @type {Input} */range; +}; + +/** + * @param {Input | HTMLElement} select + * @param {SweetAlertOptions} params + * @returns {Input} + */ +renderInputType.select = (select, params) => { + const selectElement = /** @type {HTMLSelectElement} */select; + selectElement.textContent = ''; + if (params.inputPlaceholder) { + const placeholder = document.createElement('option'); + setInnerHtml(placeholder, params.inputPlaceholder); + placeholder.value = ''; + placeholder.disabled = true; + placeholder.selected = true; + selectElement.appendChild(placeholder); + } + setInputLabel(selectElement, selectElement, params); + return selectElement; +}; + +/** + * @param {Input | HTMLElement} radio + * @returns {Input} + */ +renderInputType.radio = radio => { + const radioElement = /** @type {HTMLElement} */radio; + radioElement.textContent = ''; + return /** @type {Input} */radio; +}; + +/** + * @param {Input | HTMLElement} checkboxContainer + * @param {SweetAlertOptions} params + * @returns {Input} + */ +renderInputType.checkbox = (checkboxContainer, params) => { + const popup = getPopup(); + if (!popup) { + throw new Error('Popup not found'); + } + const checkbox = getInput$1(popup, 'checkbox'); + if (!checkbox) { + throw new Error('Checkbox input not found'); + } + checkbox.value = '1'; + checkbox.checked = Boolean(params.inputValue); + const containerElement = /** @type {HTMLElement} */checkboxContainer; + const label = containerElement.querySelector('span'); + if (label) { + const placeholderOrLabel = params.inputPlaceholder || params.inputLabel; + if (placeholderOrLabel) { + setInnerHtml(label, placeholderOrLabel); + } + } + return checkbox; +}; + +/** + * @param {Input | HTMLElement} textarea + * @param {SweetAlertOptions} params + * @returns {Input} + */ +renderInputType.textarea = (textarea, params) => { + const textareaElement = /** @type {HTMLTextAreaElement} */textarea; + checkAndSetInputValue(textareaElement, params.inputValue); + setInputPlaceholder(textareaElement, params); + setInputLabel(textareaElement, textareaElement, params); + + /** + * @param {HTMLElement} el + * @returns {number} + */ + const getMargin = el => parseInt(window.getComputedStyle(el).marginLeft) + parseInt(window.getComputedStyle(el).marginRight); + + // https://github.com/sweetalert2/sweetalert2/issues/2291 + setTimeout(() => { + // https://github.com/sweetalert2/sweetalert2/issues/1699 + if ('MutationObserver' in window) { + const popup = getPopup(); + if (!popup) { + return; + } + const initialPopupWidth = parseInt(window.getComputedStyle(popup).width); + const textareaResizeHandler = () => { + // check if texarea is still in document (i.e. popup wasn't closed in the meantime) + if (!document.body.contains(textareaElement)) { + return; + } + const textareaWidth = textareaElement.offsetWidth + getMargin(textareaElement); + const popupElement = getPopup(); + if (popupElement) { + if (textareaWidth > initialPopupWidth) { + popupElement.style.width = `${textareaWidth}px`; + } else { + applyNumericalStyle(popupElement, 'width', params.width); + } + } + }; + new MutationObserver(textareaResizeHandler).observe(textareaElement, { + attributes: true, + attributeFilter: ['style'] + }); + } + }); + return textareaElement; +}; + +/** + * @param {SweetAlert} instance + * @param {SweetAlertOptions} params + */ +const renderContent = (instance, params) => { + const htmlContainer = getHtmlContainer(); + if (!htmlContainer) { + return; + } + showWhenInnerHtmlPresent(htmlContainer); + applyCustomClass(htmlContainer, params, 'htmlContainer'); + + // Content as HTML + if (params.html) { + parseHtmlToContainer(params.html, htmlContainer); + show(htmlContainer, 'block'); + } + + // Content as plain text + else if (params.text) { + htmlContainer.textContent = params.text; + show(htmlContainer, 'block'); + } + + // No content + else { + hide(htmlContainer); + } + renderInput(instance, params); +}; + +/** + * @param {SweetAlert} instance + * @param {SweetAlertOptions} params + */ +const renderFooter = (instance, params) => { + const footer = getFooter(); + if (!footer) { + return; + } + showWhenInnerHtmlPresent(footer); + toggle(footer, Boolean(params.footer), 'block'); + if (params.footer) { + parseHtmlToContainer(params.footer, footer); + } + + // Custom class + applyCustomClass(footer, params, 'footer'); +}; + +/** + * @param {SweetAlert} instance + * @param {SweetAlertOptions} params + */ +const renderIcon = (instance, params) => { + const innerParams = privateProps.innerParams.get(instance); + const icon = getIcon(); + if (!icon) { + return; + } + + // if the given icon already rendered, apply the styling without re-rendering the icon + if (innerParams && params.icon === innerParams.icon) { + // Custom or default content + setContent(icon, params); + applyStyles(icon, params); + return; + } + if (!params.icon && !params.iconHtml) { + hide(icon); + return; + } + if (params.icon && Object.keys(iconTypes).indexOf(params.icon) === -1) { + error(`Unknown icon! Expected "success", "error", "warning", "info" or "question", got "${params.icon}"`); + hide(icon); + return; + } + show(icon); + + // Custom or default content + setContent(icon, params); + applyStyles(icon, params); + + // Animate icon + addClass(icon, params.showClass && params.showClass.icon); + + // Re-adjust the success icon on system theme change + const colorSchemeQueryList = window.matchMedia('(prefers-color-scheme: dark)'); + colorSchemeQueryList.addEventListener('change', adjustSuccessIconBackgroundColor); +}; + +/** + * @param {HTMLElement} icon + * @param {SweetAlertOptions} params + */ +const applyStyles = (icon, params) => { + for (const [iconType, iconClassName] of Object.entries(iconTypes)) { + if (params.icon !== iconType) { + removeClass(icon, iconClassName); + } + } + addClass(icon, params.icon && iconTypes[params.icon]); + + // Icon color + setColor(icon, params); + + // Success icon background color + adjustSuccessIconBackgroundColor(); + + // Custom class + applyCustomClass(icon, params, 'icon'); +}; + +// Adjust success icon background color to match the popup background color +const adjustSuccessIconBackgroundColor = () => { + const popup = getPopup(); + if (!popup) { + return; + } + const popupBackgroundColor = window.getComputedStyle(popup).getPropertyValue('background-color'); + /** @type {NodeListOf} */ + const successIconParts = popup.querySelectorAll('[class^=swal2-success-circular-line], .swal2-success-fix'); + for (let i = 0; i < successIconParts.length; i++) { + successIconParts[i].style.backgroundColor = popupBackgroundColor; + } +}; + +/** + * + * @param {SweetAlertOptions} params + * @returns {string} + */ +const successIconHtml = params => ` + ${params.animation ? '
          ' : ''} + +
          + ${params.animation ? '
          ' : ''} + ${params.animation ? '
          ' : ''} +`; +const errorIconHtml = ` + + + + +`; + +/** + * @param {HTMLElement} icon + * @param {SweetAlertOptions} params + */ +const setContent = (icon, params) => { + if (!params.icon && !params.iconHtml) { + return; + } + let oldContent = icon.innerHTML; + let newContent = ''; + if (params.iconHtml) { + newContent = iconContent(params.iconHtml); + } else if (params.icon === 'success') { + newContent = successIconHtml(params); + oldContent = oldContent.replace(/ style=".*?"/g, ''); // undo adjustSuccessIconBackgroundColor() + } else if (params.icon === 'error') { + newContent = errorIconHtml; + } else if (params.icon) { + const defaultIconHtml = { + question: '?', + warning: '!', + info: 'i' + }; + newContent = iconContent(defaultIconHtml[params.icon]); + } + if (oldContent.trim() !== newContent.trim()) { + setInnerHtml(icon, newContent); + } +}; + +/** + * @param {HTMLElement} icon + * @param {SweetAlertOptions} params + */ +const setColor = (icon, params) => { + if (!params.iconColor) { + return; + } + icon.style.color = params.iconColor; + icon.style.borderColor = params.iconColor; + for (const sel of ['.swal2-success-line-tip', '.swal2-success-line-long', '.swal2-x-mark-line-left', '.swal2-x-mark-line-right']) { + setStyle(icon, sel, 'background-color', params.iconColor); + } + setStyle(icon, '.swal2-success-ring', 'border-color', params.iconColor); +}; + +/** + * @param {string} content + * @returns {string} + */ +const iconContent = content => `
          ${content}
          `; + +/** + * @param {SweetAlert} instance + * @param {SweetAlertOptions} params + */ +const renderImage = (instance, params) => { + const image = getImage(); + if (!image) { + return; + } + if (!params.imageUrl) { + hide(image); + return; + } + show(image, ''); + + // Src, alt + image.setAttribute('src', params.imageUrl); + image.setAttribute('alt', params.imageAlt || ''); + + // Width, height + applyNumericalStyle(image, 'width', params.imageWidth); + applyNumericalStyle(image, 'height', params.imageHeight); + + // Class + image.className = swalClasses.image; + applyCustomClass(image, params, 'image'); +}; + +let dragging = false; +let mousedownX = 0; +let mousedownY = 0; +let initialX = 0; +let initialY = 0; + +/** + * @param {HTMLElement} popup + */ +const addDraggableListeners = popup => { + popup.addEventListener('mousedown', down); + document.body.addEventListener('mousemove', move); + popup.addEventListener('mouseup', up); + popup.addEventListener('touchstart', down); + document.body.addEventListener('touchmove', move); + popup.addEventListener('touchend', up); +}; + +/** + * @param {HTMLElement} popup + */ +const removeDraggableListeners = popup => { + popup.removeEventListener('mousedown', down); + document.body.removeEventListener('mousemove', move); + popup.removeEventListener('mouseup', up); + popup.removeEventListener('touchstart', down); + document.body.removeEventListener('touchmove', move); + popup.removeEventListener('touchend', up); +}; + +/** + * @param {MouseEvent | TouchEvent} event + */ +const down = event => { + const popup = getPopup(); + if (!popup) { + return; + } + const icon = getIcon(); + if (event.target === popup || icon && icon.contains(/** @type {HTMLElement} */event.target)) { + dragging = true; + const clientXY = getClientXY(event); + mousedownX = clientXY.clientX; + mousedownY = clientXY.clientY; + initialX = parseInt(popup.style.insetInlineStart) || 0; + initialY = parseInt(popup.style.insetBlockStart) || 0; + addClass(popup, 'swal2-dragging'); + } +}; + +/** + * @param {MouseEvent | TouchEvent} event + */ +const move = event => { + const popup = getPopup(); + if (!popup) { + return; + } + if (dragging) { + let { + clientX, + clientY + } = getClientXY(event); + const deltaX = clientX - mousedownX; + // In RTL mode, negate the horizontal delta since insetInlineStart refers to the right edge + popup.style.insetInlineStart = `${initialX + (globalState.isRTL ? -deltaX : deltaX)}px`; + popup.style.insetBlockStart = `${initialY + (clientY - mousedownY)}px`; + } +}; +const up = () => { + const popup = getPopup(); + dragging = false; + removeClass(popup, 'swal2-dragging'); +}; + +/** + * @param {MouseEvent | TouchEvent} event + * @returns {{ clientX: number, clientY: number }} + */ +const getClientXY = event => { + let clientX = 0, + clientY = 0; + if (event.type.startsWith('mouse')) { + clientX = /** @type {MouseEvent} */event.clientX; + clientY = /** @type {MouseEvent} */event.clientY; + } else if (event.type.startsWith('touch')) { + clientX = /** @type {TouchEvent} */event.touches[0].clientX; + clientY = /** @type {TouchEvent} */event.touches[0].clientY; + } + return { + clientX, + clientY + }; +}; + +/** + * @param {SweetAlert} instance + * @param {SweetAlertOptions} params + */ +const renderPopup = (instance, params) => { + const container = getContainer(); + const popup = getPopup(); + if (!container || !popup) { + return; + } + + // Width + // https://github.com/sweetalert2/sweetalert2/issues/2170 + if (params.toast) { + applyNumericalStyle(container, 'width', params.width); + popup.style.width = '100%'; + const loader = getLoader(); + if (loader) { + popup.insertBefore(loader, getIcon()); + } + } else { + applyNumericalStyle(popup, 'width', params.width); + } + + // Padding + applyNumericalStyle(popup, 'padding', params.padding); + + // Color + if (params.color) { + popup.style.color = params.color; + } + + // Background + if (params.background) { + popup.style.background = params.background; + } + hide(getValidationMessage()); + + // Classes + addClasses$1(popup, params); + if (params.draggable && !params.toast) { + addClass(popup, swalClasses.draggable); + addDraggableListeners(popup); + } else { + removeClass(popup, swalClasses.draggable); + removeDraggableListeners(popup); + } +}; + +/** + * @param {HTMLElement} popup + * @param {SweetAlertOptions} params + */ +const addClasses$1 = (popup, params) => { + const showClass = params.showClass || {}; + // Default Class + showClass when updating Swal.update({}) + popup.className = `${swalClasses.popup} ${isVisible$1(popup) ? showClass.popup : ''}`; + if (params.toast) { + addClass([document.documentElement, document.body], swalClasses['toast-shown']); + addClass(popup, swalClasses.toast); + } else { + addClass(popup, swalClasses.modal); + } + + // Custom class + applyCustomClass(popup, params, 'popup'); + // TODO: remove in the next major + if (typeof params.customClass === 'string') { + addClass(popup, params.customClass); + } + + // Icon class (#1842) + if (params.icon) { + addClass(popup, swalClasses[`icon-${params.icon}`]); + } +}; + +/** + * @param {SweetAlert} instance + * @param {SweetAlertOptions} params + */ +const renderProgressSteps = (instance, params) => { + const progressStepsContainer = getProgressSteps(); + if (!progressStepsContainer) { + return; + } + const { + progressSteps, + currentProgressStep + } = params; + if (!progressSteps || progressSteps.length === 0 || currentProgressStep === undefined) { + hide(progressStepsContainer); + return; + } + show(progressStepsContainer); + progressStepsContainer.textContent = ''; + if (currentProgressStep >= progressSteps.length) { + warn('Invalid currentProgressStep parameter, it should be less than progressSteps.length ' + '(currentProgressStep like JS arrays starts from 0)'); + } + progressSteps.forEach((step, index) => { + const stepEl = createStepElement(step); + progressStepsContainer.appendChild(stepEl); + if (index === currentProgressStep) { + addClass(stepEl, swalClasses['active-progress-step']); + } + if (index !== progressSteps.length - 1) { + const lineEl = createLineElement(params); + progressStepsContainer.appendChild(lineEl); + } + }); +}; + +/** + * @param {string} step + * @returns {HTMLLIElement} + */ +const createStepElement = step => { + const stepEl = document.createElement('li'); + addClass(stepEl, swalClasses['progress-step']); + setInnerHtml(stepEl, step); + return stepEl; +}; + +/** + * @param {SweetAlertOptions} params + * @returns {HTMLLIElement} + */ +const createLineElement = params => { + const lineEl = document.createElement('li'); + addClass(lineEl, swalClasses['progress-step-line']); + if (params.progressStepsDistance) { + applyNumericalStyle(lineEl, 'width', params.progressStepsDistance); + } + return lineEl; +}; + +/** + * @param {SweetAlert} instance + * @param {SweetAlertOptions} params + */ +const renderTitle = (instance, params) => { + const title = getTitle(); + if (!title) { + return; + } + showWhenInnerHtmlPresent(title); + toggle(title, Boolean(params.title || params.titleText), 'block'); + if (params.title) { + parseHtmlToContainer(params.title, title); + } + if (params.titleText) { + title.innerText = params.titleText; + } + + // Custom class + applyCustomClass(title, params, 'title'); +}; + +/** + * @param {SweetAlert} instance + * @param {SweetAlertOptions} params + */ +const render = (instance, params) => { + var _globalState$eventEmi; + renderPopup(instance, params); + renderContainer(instance, params); + renderProgressSteps(instance, params); + renderIcon(instance, params); + renderImage(instance, params); + renderTitle(instance, params); + renderCloseButton(instance, params); + renderContent(instance, params); + renderActions(instance, params); + renderFooter(instance, params); + const popup = getPopup(); + if (typeof params.didRender === 'function' && popup) { + params.didRender(popup); + } + (_globalState$eventEmi = globalState.eventEmitter) === null || _globalState$eventEmi === void 0 || _globalState$eventEmi.emit('didRender', popup); +}; + +/* + * Global function to determine if SweetAlert2 popup is shown + */ +const isVisible = () => { + return isVisible$1(getPopup()); +}; + +/* + * Global function to click 'Confirm' button + */ +const clickConfirm = () => { + var _dom$getConfirmButton; + return (_dom$getConfirmButton = getConfirmButton()) === null || _dom$getConfirmButton === void 0 ? void 0 : _dom$getConfirmButton.click(); +}; + +/* + * Global function to click 'Deny' button + */ +const clickDeny = () => { + var _dom$getDenyButton; + return (_dom$getDenyButton = getDenyButton()) === null || _dom$getDenyButton === void 0 ? void 0 : _dom$getDenyButton.click(); +}; + +/* + * Global function to click 'Cancel' button + */ +const clickCancel = () => { + var _dom$getCancelButton; + return (_dom$getCancelButton = getCancelButton()) === null || _dom$getCancelButton === void 0 ? void 0 : _dom$getCancelButton.click(); +}; + +/** @type {Record} */ +const DismissReason = Object.freeze({ + cancel: 'cancel', + backdrop: 'backdrop', + close: 'close', + esc: 'esc', + timer: 'timer' +}); + +/** + * @param {GlobalState} globalState + */ +const removeKeydownHandler = globalState => { + if (globalState.keydownTarget && globalState.keydownHandlerAdded && globalState.keydownHandler) { + const handler = /** @type {EventListenerOrEventListenerObject} */ /** @type {unknown} */globalState.keydownHandler; + globalState.keydownTarget.removeEventListener('keydown', handler, { + capture: globalState.keydownListenerCapture + }); + globalState.keydownHandlerAdded = false; + } +}; + +/** + * @param {GlobalState} globalState + * @param {SweetAlertOptions} innerParams + * @param {(dismiss: DismissReason) => void} dismissWith + */ +const addKeydownHandler = (globalState, innerParams, dismissWith) => { + removeKeydownHandler(globalState); + if (!innerParams.toast) { + /** @type {(this: HTMLElement, event: KeyboardEvent) => void} */ + const handler = e => keydownHandler(innerParams, e, dismissWith); + globalState.keydownHandler = handler; + const target = innerParams.keydownListenerCapture ? window : getPopup(); + if (target) { + globalState.keydownTarget = target; + globalState.keydownListenerCapture = innerParams.keydownListenerCapture; + const eventHandler = /** @type {EventListenerOrEventListenerObject} */ /** @type {unknown} */handler; + globalState.keydownTarget.addEventListener('keydown', eventHandler, { + capture: globalState.keydownListenerCapture + }); + globalState.keydownHandlerAdded = true; + } + } +}; + +/** + * @param {number} index + * @param {number} increment + */ +const setFocus = (index, increment) => { + var _dom$getPopup; + const focusableElements = getFocusableElements(); + // search for visible elements and select the next possible match + if (focusableElements.length) { + index = index + increment; + + // shift + tab when .swal2-popup is focused + if (index === -2) { + index = focusableElements.length - 1; + } + + // rollover to first item + if (index === focusableElements.length) { + index = 0; + + // go to last item + } else if (index === -1) { + index = focusableElements.length - 1; + } + focusableElements[index].focus(); + return; + } + // no visible focusable elements, focus the popup + (_dom$getPopup = getPopup()) === null || _dom$getPopup === void 0 || _dom$getPopup.focus(); +}; +const arrowKeysNextButton = ['ArrowRight', 'ArrowDown']; +const arrowKeysPreviousButton = ['ArrowLeft', 'ArrowUp']; + +/** + * @param {SweetAlertOptions} innerParams + * @param {KeyboardEvent} event + * @param {(dismiss: DismissReason) => void} dismissWith + */ +const keydownHandler = (innerParams, event, dismissWith) => { + if (!innerParams) { + return; // This instance has already been destroyed + } + + // Ignore keydown during IME composition + // https://developer.mozilla.org/en-US/docs/Web/API/Document/keydown_event#ignoring_keydown_during_ime_composition + // https://github.com/sweetalert2/sweetalert2/issues/720 + // https://github.com/sweetalert2/sweetalert2/issues/2406 + if (event.isComposing || event.keyCode === 229) { + return; + } + if (innerParams.stopKeydownPropagation) { + event.stopPropagation(); + } + + // ENTER + if (event.key === 'Enter') { + handleEnter(event, innerParams); + } + + // TAB + else if (event.key === 'Tab') { + handleTab(event); + } + + // ARROWS - switch focus between buttons + else if ([...arrowKeysNextButton, ...arrowKeysPreviousButton].includes(event.key)) { + handleArrows(event.key); + } + + // ESC + else if (event.key === 'Escape') { + handleEsc(event, innerParams, dismissWith); + } +}; + +/** + * @param {KeyboardEvent} event + * @param {SweetAlertOptions} innerParams + */ +const handleEnter = (event, innerParams) => { + // https://github.com/sweetalert2/sweetalert2/issues/2386 + if (!callIfFunction(innerParams.allowEnterKey)) { + return; + } + const popup = getPopup(); + if (!popup || !innerParams.input) { + return; + } + const input = getInput$1(popup, innerParams.input); + if (event.target && input && event.target instanceof HTMLElement && event.target.outerHTML === input.outerHTML) { + if (['textarea', 'file'].includes(innerParams.input)) { + return; // do not submit + } + clickConfirm(); + event.preventDefault(); + } +}; + +/** + * @param {KeyboardEvent} event + */ +const handleTab = event => { + const targetElement = event.target; + const focusableElements = getFocusableElements(); + let btnIndex = -1; + for (let i = 0; i < focusableElements.length; i++) { + if (targetElement === focusableElements[i]) { + btnIndex = i; + break; + } + } + + // Cycle to the next button + if (!event.shiftKey) { + setFocus(btnIndex, 1); + } + + // Cycle to the prev button + else { + setFocus(btnIndex, -1); + } + event.stopPropagation(); + event.preventDefault(); +}; + +/** + * @param {string} key + */ +const handleArrows = key => { + const actions = getActions(); + const confirmButton = getConfirmButton(); + const denyButton = getDenyButton(); + const cancelButton = getCancelButton(); + if (!actions || !confirmButton || !denyButton || !cancelButton) { + return; + } + /** @type HTMLElement[] */ + const buttons = [confirmButton, denyButton, cancelButton]; + if (document.activeElement instanceof HTMLElement && !buttons.includes(document.activeElement)) { + return; + } + const sibling = arrowKeysNextButton.includes(key) ? 'nextElementSibling' : 'previousElementSibling'; + let buttonToFocus = document.activeElement; + if (!buttonToFocus) { + return; + } + for (let i = 0; i < actions.children.length; i++) { + buttonToFocus = buttonToFocus[sibling]; + if (!buttonToFocus) { + return; + } + if (buttonToFocus instanceof HTMLButtonElement && isVisible$1(buttonToFocus)) { + break; + } + } + if (buttonToFocus instanceof HTMLButtonElement) { + buttonToFocus.focus(); + } +}; + +/** + * @param {KeyboardEvent} event + * @param {SweetAlertOptions} innerParams + * @param {(dismiss: DismissReason) => void} dismissWith + */ +const handleEsc = (event, innerParams, dismissWith) => { + event.preventDefault(); + if (callIfFunction(innerParams.allowEscapeKey)) { + dismissWith(DismissReason.esc); + } +}; + +/** + * This module contains `WeakMap`s for each effectively-"private property" that a `Swal` has. + * For example, to set the private property "foo" of `this` to "bar", you can `privateProps.foo.set(this, 'bar')` + * This is the approach that Babel will probably take to implement private methods/fields + * https://github.com/tc39/proposal-private-methods + * https://github.com/babel/babel/pull/7555 + * Once we have the changes from that PR in Babel, and our core class fits reasonable in *one module* + * then we can use that language feature. + */ + +var privateMethods = { + swalPromiseResolve: new WeakMap(), + swalPromiseReject: new WeakMap() +}; + +// From https://developer.paciellogroup.com/blog/2018/06/the-current-state-of-modal-dialog-accessibility/ +// Adding aria-hidden="true" to elements outside of the active modal dialog ensures that +// elements not within the active modal dialog will not be surfaced if a user opens a screen +// reader’s list of elements (headings, form controls, landmarks, etc.) in the document. + +const setAriaHidden = () => { + const container = getContainer(); + const bodyChildren = Array.from(document.body.children); + bodyChildren.forEach(el => { + if (el.contains(container)) { + return; + } + if (el.hasAttribute('aria-hidden')) { + el.setAttribute('data-previous-aria-hidden', el.getAttribute('aria-hidden') || ''); + } + el.setAttribute('aria-hidden', 'true'); + }); +}; +const unsetAriaHidden = () => { + const bodyChildren = Array.from(document.body.children); + bodyChildren.forEach(el => { + if (el.hasAttribute('data-previous-aria-hidden')) { + el.setAttribute('aria-hidden', el.getAttribute('data-previous-aria-hidden') || ''); + el.removeAttribute('data-previous-aria-hidden'); + } else { + el.removeAttribute('aria-hidden'); + } + }); +}; + +// @ts-ignore +const isSafariOrIOS = typeof window !== 'undefined' && Boolean(window.GestureEvent); // true for Safari desktop + all iOS browsers https://stackoverflow.com/a/70585394 + +/** + * Fix iOS scrolling + * http://stackoverflow.com/q/39626302 + */ +const iOSfix = () => { + if (isSafariOrIOS && !hasClass(document.body, swalClasses.iosfix)) { + const offset = document.body.scrollTop; + document.body.style.top = `${offset * -1}px`; + addClass(document.body, swalClasses.iosfix); + lockBodyScroll(); + } +}; + +/** + * https://github.com/sweetalert2/sweetalert2/issues/1246 + */ +const lockBodyScroll = () => { + const container = getContainer(); + if (!container) { + return; + } + /** @type {boolean} */ + let preventTouchMove; + /** + * @param {TouchEvent} event + */ + container.ontouchstart = event => { + preventTouchMove = shouldPreventTouchMove(event); + }; + /** + * @param {TouchEvent} event + */ + container.ontouchmove = event => { + if (preventTouchMove) { + event.preventDefault(); + event.stopPropagation(); + } + }; +}; + +/** + * @param {TouchEvent} event + * @returns {boolean} + */ +const shouldPreventTouchMove = event => { + const target = event.target; + const container = getContainer(); + const htmlContainer = getHtmlContainer(); + if (!container || !htmlContainer) { + return false; + } + if (isStylus(event) || isZoom(event)) { + return false; + } + if (target === container) { + return true; + } + if (!isScrollable(container) && target instanceof HTMLElement && !selfOrParentIsScrollable(target, htmlContainer) && + // #2823 + target.tagName !== 'INPUT' && + // #1603 + target.tagName !== 'TEXTAREA' && + // #2266 + !(isScrollable(htmlContainer) && + // #1944 + htmlContainer.contains(target))) { + return true; + } + return false; +}; + +/** + * https://github.com/sweetalert2/sweetalert2/issues/1786 + * + * @param {TouchEvent} event + * @returns {boolean} + */ +const isStylus = event => { + return Boolean(event.touches && event.touches.length && + // @ts-ignore - touchType is not a standard property + event.touches[0].touchType === 'stylus'); +}; + +/** + * https://github.com/sweetalert2/sweetalert2/issues/1891 + * + * @param {TouchEvent} event + * @returns {boolean} + */ +const isZoom = event => { + return event.touches && event.touches.length > 1; +}; +const undoIOSfix = () => { + if (hasClass(document.body, swalClasses.iosfix)) { + const offset = parseInt(document.body.style.top, 10); + removeClass(document.body, swalClasses.iosfix); + document.body.style.top = ''; + document.body.scrollTop = offset * -1; + } +}; + +/** + * Measure scrollbar width for padding body during modal show/hide + * https://github.com/twbs/bootstrap/blob/master/js/src/modal.js + * + * @returns {number} + */ +const measureScrollbar = () => { + const scrollDiv = document.createElement('div'); + scrollDiv.className = swalClasses['scrollbar-measure']; + document.body.appendChild(scrollDiv); + const scrollbarWidth = scrollDiv.getBoundingClientRect().width - scrollDiv.clientWidth; + document.body.removeChild(scrollDiv); + return scrollbarWidth; +}; + +/** + * Remember state in cases where opening and handling a modal will fiddle with it. + * @type {number | null} + */ +let previousBodyPadding = null; + +/** + * @param {string} initialBodyOverflow + */ +const replaceScrollbarWithPadding = initialBodyOverflow => { + // for queues, do not do this more than once + if (previousBodyPadding !== null) { + return; + } + // if the body has overflow + if (document.body.scrollHeight > window.innerHeight || initialBodyOverflow === 'scroll' // https://github.com/sweetalert2/sweetalert2/issues/2663 + ) { + // add padding so the content doesn't shift after removal of scrollbar + previousBodyPadding = parseInt(window.getComputedStyle(document.body).getPropertyValue('padding-right')); + document.body.style.paddingRight = `${previousBodyPadding + measureScrollbar()}px`; + } +}; +const undoReplaceScrollbarWithPadding = () => { + if (previousBodyPadding !== null) { + document.body.style.paddingRight = `${previousBodyPadding}px`; + previousBodyPadding = null; + } +}; + +/** + * @param {SweetAlert} instance + * @param {HTMLElement} container + * @param {boolean} returnFocus + * @param {(() => void) | undefined} didClose + */ +function removePopupAndResetState(instance, container, returnFocus, didClose) { + if (isToast()) { + triggerDidCloseAndDispose(instance, didClose); + } else { + restoreActiveElement(returnFocus).then(() => triggerDidCloseAndDispose(instance, didClose)); + removeKeydownHandler(globalState); + } + + // workaround for https://github.com/sweetalert2/sweetalert2/issues/2088 + // for some reason removing the container in Safari will scroll the document to bottom + if (isSafariOrIOS) { + container.setAttribute('style', 'display:none !important'); + container.removeAttribute('class'); + container.innerHTML = ''; + } else { + container.remove(); + } + if (isModal()) { + undoReplaceScrollbarWithPadding(); + undoIOSfix(); + unsetAriaHidden(); + } + removeBodyClasses(); +} + +/** + * Remove SweetAlert2 classes from body + */ +function removeBodyClasses() { + removeClass([document.documentElement, document.body], [swalClasses.shown, swalClasses['height-auto'], swalClasses['no-backdrop'], swalClasses['toast-shown']]); +} + +/** + * Instance method to close sweetAlert + * + * @param {SweetAlertResult | undefined} resolveValue + * @this {SweetAlert} + */ +function close(resolveValue) { + resolveValue = prepareResolveValue(resolveValue); + const swalPromiseResolve = privateMethods.swalPromiseResolve.get(this); + const didClose = triggerClosePopup(this); + if (this.isAwaitingPromise) { + // A swal awaiting for a promise (after a click on Confirm or Deny) cannot be dismissed anymore #2335 + if (!resolveValue.isDismissed) { + handleAwaitingPromise(this); + swalPromiseResolve(resolveValue); + } + } else if (didClose) { + // Resolve Swal promise + swalPromiseResolve(resolveValue); + } +} + +/** + * @param {SweetAlert} instance + * @returns {boolean} + */ +const triggerClosePopup = instance => { + const popup = getPopup(); + if (!popup) { + return false; + } + const innerParams = privateProps.innerParams.get(instance); + if (!innerParams || hasClass(popup, innerParams.hideClass.popup)) { + return false; + } + removeClass(popup, innerParams.showClass.popup); + addClass(popup, innerParams.hideClass.popup); + const backdrop = getContainer(); + removeClass(backdrop, innerParams.showClass.backdrop); + addClass(backdrop, innerParams.hideClass.backdrop); + handlePopupAnimation(instance, popup, innerParams); + return true; +}; + +/** + * @param {Error | string} error + * @this {SweetAlert} + */ +function rejectPromise(error) { + const rejectPromise = privateMethods.swalPromiseReject.get(this); + handleAwaitingPromise(this); + if (rejectPromise) { + // Reject Swal promise + rejectPromise(error); + } +} + +/** + * @param {SweetAlert} instance + */ +const handleAwaitingPromise = instance => { + if (instance.isAwaitingPromise) { + // @ts-ignore + delete instance.isAwaitingPromise; + // The instance might have been previously partly destroyed, we must resume the destroy process in this case #2335 + if (!privateProps.innerParams.get(instance)) { + instance._destroy(); + } + } +}; + +/** + * @param {SweetAlertResult | undefined} resolveValue + * @returns {SweetAlertResult} + */ +const prepareResolveValue = resolveValue => { + // When user calls Swal.close() + if (typeof resolveValue === 'undefined') { + return { + isConfirmed: false, + isDenied: false, + isDismissed: true + }; + } + return Object.assign({ + isConfirmed: false, + isDenied: false, + isDismissed: false + }, resolveValue); +}; + +/** + * @param {SweetAlert} instance + * @param {HTMLElement} popup + * @param {SweetAlertOptions} innerParams + */ +const handlePopupAnimation = (instance, popup, innerParams) => { + var _globalState$eventEmi; + const container = getContainer(); + // If animation is supported, animate + const animationIsSupported = hasCssAnimation(popup); + if (typeof innerParams.willClose === 'function') { + innerParams.willClose(popup); + } + (_globalState$eventEmi = globalState.eventEmitter) === null || _globalState$eventEmi === void 0 || _globalState$eventEmi.emit('willClose', popup); + if (animationIsSupported && container) { + animatePopup(instance, popup, container, Boolean(innerParams.returnFocus), innerParams.didClose); + } else if (container) { + // Otherwise, remove immediately + removePopupAndResetState(instance, container, Boolean(innerParams.returnFocus), innerParams.didClose); + } +}; + +/** + * @param {SweetAlert} instance + * @param {HTMLElement} popup + * @param {HTMLElement} container + * @param {boolean} returnFocus + * @param {(() => void) | undefined} didClose + */ +const animatePopup = (instance, popup, container, returnFocus, didClose) => { + globalState.swalCloseEventFinishedCallback = removePopupAndResetState.bind(null, instance, container, returnFocus, didClose); + /** + * @param {AnimationEvent | TransitionEvent} e + */ + const swalCloseAnimationFinished = function (e) { + if (e.target === popup) { + var _globalState$swalClos; + (_globalState$swalClos = globalState.swalCloseEventFinishedCallback) === null || _globalState$swalClos === void 0 || _globalState$swalClos.call(globalState); + delete globalState.swalCloseEventFinishedCallback; + popup.removeEventListener('animationend', swalCloseAnimationFinished); + popup.removeEventListener('transitionend', swalCloseAnimationFinished); + } + }; + popup.addEventListener('animationend', swalCloseAnimationFinished); + popup.addEventListener('transitionend', swalCloseAnimationFinished); +}; + +/** + * @param {SweetAlert} instance + * @param {(() => void) | undefined} didClose + */ +const triggerDidCloseAndDispose = (instance, didClose) => { + setTimeout(() => { + var _globalState$eventEmi2; + if (typeof didClose === 'function') { + didClose.bind(instance.params)(); + } + (_globalState$eventEmi2 = globalState.eventEmitter) === null || _globalState$eventEmi2 === void 0 || _globalState$eventEmi2.emit('didClose'); + // instance might have been destroyed already + if (instance._destroy) { + instance._destroy(); + } + }); +}; + +/** + * Shows loader (spinner), this is useful with AJAX requests. + * By default the loader be shown instead of the "Confirm" button. + * + * @param {HTMLButtonElement | null} [buttonToReplace] + */ +const showLoading = buttonToReplace => { + let popup = getPopup(); + if (!popup) { + new Swal(); + } + popup = getPopup(); + if (!popup) { + return; + } + const loader = getLoader(); + if (isToast()) { + hide(getIcon()); + } else { + replaceButton(popup, buttonToReplace); + } + show(loader); + popup.setAttribute('data-loading', 'true'); + popup.setAttribute('aria-busy', 'true'); + popup.focus(); +}; + +/** + * @param {HTMLElement} popup + * @param {HTMLButtonElement | null} [buttonToReplace] + */ +const replaceButton = (popup, buttonToReplace) => { + const actions = getActions(); + const loader = getLoader(); + if (!actions || !loader) { + return; + } + if (!buttonToReplace && isVisible$1(getConfirmButton())) { + buttonToReplace = getConfirmButton(); + } + show(actions); + if (buttonToReplace) { + hide(buttonToReplace); + loader.setAttribute('data-button-to-replace', buttonToReplace.className); + actions.insertBefore(loader, buttonToReplace); + } + addClass([popup, actions], swalClasses.loading); +}; + +/** + * @param {SweetAlert} instance + * @param {SweetAlertOptions} params + */ +const handleInputOptionsAndValue = (instance, params) => { + if (params.input === 'select' || params.input === 'radio') { + handleInputOptions(instance, params); + } else if (['text', 'email', 'number', 'tel', 'textarea'].some(i => i === params.input) && (hasToPromiseFn(params.inputValue) || isPromise(params.inputValue))) { + showLoading(getConfirmButton()); + handleInputValue(instance, params); + } +}; + +/** + * @param {SweetAlert} instance + * @param {SweetAlertOptions} innerParams + * @returns {SweetAlertInputValue} + */ +const getInputValue = (instance, innerParams) => { + const input = instance.getInput(); + if (!input) { + return null; + } + switch (innerParams.input) { + case 'checkbox': + return getCheckboxValue(input); + case 'radio': + return getRadioValue(input); + case 'file': + return getFileValue(input); + default: + return innerParams.inputAutoTrim ? input.value.trim() : input.value; + } +}; + +/** + * @param {HTMLInputElement} input + * @returns {number} + */ +const getCheckboxValue = input => input.checked ? 1 : 0; + +/** + * @param {HTMLInputElement} input + * @returns {string | null} + */ +const getRadioValue = input => input.checked ? input.value : null; + +/** + * @param {HTMLInputElement} input + * @returns {FileList | File | null} + */ +const getFileValue = input => input.files && input.files.length ? input.getAttribute('multiple') !== null ? input.files : input.files[0] : null; + +/** + * @param {SweetAlert} instance + * @param {SweetAlertOptions} params + */ +const handleInputOptions = (instance, params) => { + const popup = getPopup(); + if (!popup) { + return; + } + /** + * @param {*} inputOptions + */ + const processInputOptions = inputOptions => { + if (params.input === 'select') { + populateSelectOptions(popup, formatInputOptions(inputOptions), params); + } else if (params.input === 'radio') { + populateRadioOptions(popup, formatInputOptions(inputOptions), params); + } + }; + if (hasToPromiseFn(params.inputOptions) || isPromise(params.inputOptions)) { + showLoading(getConfirmButton()); + asPromise(params.inputOptions).then(inputOptions => { + instance.hideLoading(); + processInputOptions(inputOptions); + }); + } else if (typeof params.inputOptions === 'object') { + processInputOptions(params.inputOptions); + } else { + error(`Unexpected type of inputOptions! Expected object, Map or Promise, got ${typeof params.inputOptions}`); + } +}; + +/** + * @param {SweetAlert} instance + * @param {SweetAlertOptions} params + */ +const handleInputValue = (instance, params) => { + const input = instance.getInput(); + if (!input) { + return; + } + hide(input); + asPromise(params.inputValue).then(inputValue => { + input.value = params.input === 'number' ? `${parseFloat(inputValue) || 0}` : `${inputValue}`; + show(input); + input.focus(); + instance.hideLoading(); + }).catch(err => { + error(`Error in inputValue promise: ${err}`); + input.value = ''; + show(input); + input.focus(); + instance.hideLoading(); + }); +}; + +/** + * @param {HTMLElement} popup + * @param {InputOptionFlattened[]} inputOptions + * @param {SweetAlertOptions} params + */ +function populateSelectOptions(popup, inputOptions, params) { + const select = getDirectChildByClass(popup, swalClasses.select); + if (!select) { + return; + } + /** + * @param {HTMLElement} parent + * @param {string} optionLabel + * @param {string} optionValue + */ + const renderOption = (parent, optionLabel, optionValue) => { + const option = document.createElement('option'); + option.value = optionValue; + setInnerHtml(option, optionLabel); + option.selected = isSelected(optionValue, params.inputValue); + parent.appendChild(option); + }; + inputOptions.forEach(inputOption => { + const optionValue = inputOption[0]; + const optionLabel = inputOption[1]; + // spec: + // https://www.w3.org/TR/html401/interact/forms.html#h-17.6 + // "...all OPTGROUP elements must be specified directly within a SELECT element (i.e., groups may not be nested)..." + // check whether this is a + if (Array.isArray(optionLabel)) { + // if it is an array, then it is an + const optgroup = document.createElement('optgroup'); + optgroup.label = optionValue; + optgroup.disabled = false; // not configurable for now + select.appendChild(optgroup); + optionLabel.forEach(o => renderOption(optgroup, o[1], o[0])); + } else { + // case of + valueFormatted = formatInputOptions(valueFormatted); + } + result.push([key, valueFormatted]); + }); + } else { + Object.keys(inputOptions).forEach(key => { + let valueFormatted = inputOptions[key]; + if (typeof valueFormatted === 'object') { + // case of + valueFormatted = formatInputOptions(valueFormatted); + } + result.push([key, valueFormatted]); + }); + } + return result; +}; + +/** + * @param {string} optionValue + * @param {SweetAlertInputValue} inputValue + * @returns {boolean} + */ +const isSelected = (optionValue, inputValue) => { + return Boolean(inputValue) && inputValue !== null && inputValue !== undefined && inputValue.toString() === optionValue.toString(); +}; + +/** + * @param {SweetAlert} instance + */ +const handleConfirmButtonClick = instance => { + const innerParams = privateProps.innerParams.get(instance); + instance.disableButtons(); + if (innerParams.input) { + handleConfirmOrDenyWithInput(instance, 'confirm'); + } else { + confirm(instance, true); + } +}; + +/** + * @param {SweetAlert} instance + */ +const handleDenyButtonClick = instance => { + const innerParams = privateProps.innerParams.get(instance); + instance.disableButtons(); + if (innerParams.returnInputValueOnDeny) { + handleConfirmOrDenyWithInput(instance, 'deny'); + } else { + deny(instance, false); + } +}; + +/** + * @param {SweetAlert} instance + * @param {(dismiss: DismissReason) => void} dismissWith + */ +const handleCancelButtonClick = (instance, dismissWith) => { + instance.disableButtons(); + dismissWith(DismissReason.cancel); +}; + +/** + * @param {SweetAlert} instance + * @param {'confirm' | 'deny'} type + */ +const handleConfirmOrDenyWithInput = (instance, type) => { + const innerParams = privateProps.innerParams.get(instance); + if (!innerParams.input) { + error(`The "input" parameter is needed to be set when using returnInputValueOn${capitalizeFirstLetter(type)}`); + return; + } + const input = instance.getInput(); + const inputValue = getInputValue(instance, innerParams); + if (innerParams.inputValidator) { + handleInputValidator(instance, inputValue, type); + } else if (input && !input.checkValidity()) { + instance.enableButtons(); + instance.showValidationMessage(innerParams.validationMessage || input.validationMessage); + } else if (type === 'deny') { + deny(instance, inputValue); + } else { + confirm(instance, inputValue); + } +}; + +/** + * @param {SweetAlert} instance + * @param {SweetAlertInputValue} inputValue + * @param {'confirm' | 'deny'} type + */ +const handleInputValidator = (instance, inputValue, type) => { + const innerParams = privateProps.innerParams.get(instance); + instance.disableInput(); + const validationPromise = Promise.resolve().then(() => asPromise(innerParams.inputValidator(inputValue, innerParams.validationMessage))); + validationPromise.then(validationMessage => { + instance.enableButtons(); + instance.enableInput(); + if (validationMessage) { + instance.showValidationMessage(validationMessage); + } else if (type === 'deny') { + deny(instance, inputValue); + } else { + confirm(instance, inputValue); + } + }); +}; + +/** + * @param {SweetAlert} instance + * @param {*} value + */ +const deny = (instance, value) => { + const innerParams = privateProps.innerParams.get(instance); + if (innerParams.showLoaderOnDeny) { + showLoading(getDenyButton()); + } + if (innerParams.preDeny) { + instance.isAwaitingPromise = true; // Flagging the instance as awaiting a promise so it's own promise's reject/resolve methods doesn't get destroyed until the result from this preDeny's promise is received + const preDenyPromise = Promise.resolve().then(() => asPromise(innerParams.preDeny(value, innerParams.validationMessage))); + preDenyPromise.then(preDenyValue => { + if (preDenyValue === false) { + instance.hideLoading(); + handleAwaitingPromise(instance); + } else { + instance.close(/** @type SweetAlertResult */{ + isDenied: true, + value: typeof preDenyValue === 'undefined' ? value : preDenyValue + }); + } + }).catch(error => rejectWith(instance, error)); + } else { + instance.close(/** @type SweetAlertResult */{ + isDenied: true, + value + }); + } +}; + +/** + * @param {SweetAlert} instance + * @param {*} value + */ +const succeedWith = (instance, value) => { + instance.close(/** @type SweetAlertResult */{ + isConfirmed: true, + value + }); +}; + +/** + * + * @param {SweetAlert} instance + * @param {string} error + */ +const rejectWith = (instance, error) => { + instance.rejectPromise(error); +}; + +/** + * + * @param {SweetAlert} instance + * @param {*} value + */ +const confirm = (instance, value) => { + const innerParams = privateProps.innerParams.get(instance); + if (innerParams.showLoaderOnConfirm) { + showLoading(); + } + if (innerParams.preConfirm) { + instance.resetValidationMessage(); + instance.isAwaitingPromise = true; // Flagging the instance as awaiting a promise so it's own promise's reject/resolve methods doesn't get destroyed until the result from this preConfirm's promise is received + const preConfirmPromise = Promise.resolve().then(() => asPromise(innerParams.preConfirm(value, innerParams.validationMessage))); + preConfirmPromise.then(preConfirmValue => { + if (isVisible$1(getValidationMessage()) || preConfirmValue === false) { + instance.hideLoading(); + handleAwaitingPromise(instance); + } else { + succeedWith(instance, typeof preConfirmValue === 'undefined' ? value : preConfirmValue); + } + }).catch(error => rejectWith(instance, error)); + } else { + succeedWith(instance, value); + } +}; + +/** + * Hides loader and shows back the button which was hidden by .showLoading() + * @this {SweetAlert} + */ +function hideLoading() { + // do nothing if popup is closed + const innerParams = privateProps.innerParams.get(this); + if (!innerParams) { + return; + } + const domCache = privateProps.domCache.get(this); + hide(domCache.loader); + if (isToast()) { + if (innerParams.icon) { + show(getIcon()); + } + } else { + showRelatedButton(domCache); + } + removeClass([domCache.popup, domCache.actions], swalClasses.loading); + domCache.popup.removeAttribute('aria-busy'); + domCache.popup.removeAttribute('data-loading'); + domCache.confirmButton.disabled = false; + domCache.denyButton.disabled = false; + domCache.cancelButton.disabled = false; +} + +/** + * @param {DomCache} domCache + */ +const showRelatedButton = domCache => { + const dataButtonToReplace = domCache.loader.getAttribute('data-button-to-replace'); + const buttonToReplace = dataButtonToReplace ? domCache.popup.getElementsByClassName(dataButtonToReplace) : []; + if (buttonToReplace.length) { + show(/** @type {HTMLElement} */buttonToReplace[0], 'inline-block'); + } else if (allButtonsAreHidden()) { + hide(domCache.actions); + } +}; + +/** + * Gets the input DOM node, this method works with input parameter. + * + * @returns {HTMLInputElement | null} + * @this {SweetAlert} + */ +function getInput() { + const innerParams = privateProps.innerParams.get(this); + const domCache = privateProps.domCache.get(this); + if (!domCache) { + return null; + } + return getInput$1(domCache.popup, innerParams.input); +} + +/** + * @param {SweetAlert} instance + * @param {string[]} buttons + * @param {boolean} disabled + */ +function setButtonsDisabled(instance, buttons, disabled) { + const domCache = privateProps.domCache.get(instance); + buttons.forEach(button => { + domCache[button].disabled = disabled; + }); +} + +/** + * @param {HTMLInputElement | null} input + * @param {boolean} disabled + */ +function setInputDisabled(input, disabled) { + const popup = getPopup(); + if (!popup || !input) { + return; + } + if (input.type === 'radio') { + /** @type {NodeListOf} */ + const radios = popup.querySelectorAll(`[name="${swalClasses.radio}"]`); + for (let i = 0; i < radios.length; i++) { + radios[i].disabled = disabled; + } + } else { + input.disabled = disabled; + } +} + +/** + * Enable all the buttons + * @this {SweetAlert} + */ +function enableButtons() { + setButtonsDisabled(this, ['confirmButton', 'denyButton', 'cancelButton'], false); +} + +/** + * Disable all the buttons + * @this {SweetAlert} + */ +function disableButtons() { + setButtonsDisabled(this, ['confirmButton', 'denyButton', 'cancelButton'], true); +} + +/** + * Enable the input field + * @this {SweetAlert} + */ +function enableInput() { + setInputDisabled(this.getInput(), false); +} + +/** + * Disable the input field + * @this {SweetAlert} + */ +function disableInput() { + setInputDisabled(this.getInput(), true); +} + +/** + * Show block with validation message + * + * @param {string} error + * @this {SweetAlert} + */ +function showValidationMessage(error) { + const domCache = privateProps.domCache.get(this); + const params = privateProps.innerParams.get(this); + setInnerHtml(domCache.validationMessage, error); + domCache.validationMessage.className = swalClasses['validation-message']; + if (params.customClass && params.customClass.validationMessage) { + addClass(domCache.validationMessage, params.customClass.validationMessage); + } + show(domCache.validationMessage); + const input = this.getInput(); + if (input) { + input.setAttribute('aria-invalid', 'true'); + input.setAttribute('aria-describedby', swalClasses['validation-message']); + focusInput(input); + addClass(input, swalClasses.inputerror); + } +} + +/** + * Hide block with validation message + * + * @this {SweetAlert} + */ +function resetValidationMessage() { + const domCache = privateProps.domCache.get(this); + if (domCache.validationMessage) { + hide(domCache.validationMessage); + } + const input = this.getInput(); + if (input) { + input.removeAttribute('aria-invalid'); + input.removeAttribute('aria-describedby'); + removeClass(input, swalClasses.inputerror); + } +} + +const defaultParams = { + title: '', + titleText: '', + text: '', + html: '', + footer: '', + icon: undefined, + iconColor: undefined, + iconHtml: undefined, + template: undefined, + toast: false, + draggable: false, + animation: true, + theme: 'light', + showClass: { + popup: 'swal2-show', + backdrop: 'swal2-backdrop-show', + icon: 'swal2-icon-show' + }, + hideClass: { + popup: 'swal2-hide', + backdrop: 'swal2-backdrop-hide', + icon: 'swal2-icon-hide' + }, + customClass: {}, + target: 'body', + color: undefined, + backdrop: true, + heightAuto: true, + allowOutsideClick: true, + allowEscapeKey: true, + allowEnterKey: true, + stopKeydownPropagation: true, + keydownListenerCapture: false, + showConfirmButton: true, + showDenyButton: false, + showCancelButton: false, + preConfirm: undefined, + preDeny: undefined, + confirmButtonText: 'OK', + confirmButtonAriaLabel: '', + confirmButtonColor: undefined, + denyButtonText: 'No', + denyButtonAriaLabel: '', + denyButtonColor: undefined, + cancelButtonText: 'Cancel', + cancelButtonAriaLabel: '', + cancelButtonColor: undefined, + buttonsStyling: true, + reverseButtons: false, + focusConfirm: true, + focusDeny: false, + focusCancel: false, + returnFocus: true, + showCloseButton: false, + closeButtonHtml: '×', + closeButtonAriaLabel: 'Close this dialog', + loaderHtml: '', + showLoaderOnConfirm: false, + showLoaderOnDeny: false, + imageUrl: undefined, + imageWidth: undefined, + imageHeight: undefined, + imageAlt: '', + timer: undefined, + timerProgressBar: false, + width: undefined, + padding: undefined, + background: undefined, + input: undefined, + inputPlaceholder: '', + inputLabel: '', + inputValue: '', + inputOptions: {}, + inputAutoFocus: true, + inputAutoTrim: true, + inputAttributes: {}, + inputValidator: undefined, + returnInputValueOnDeny: false, + validationMessage: undefined, + grow: false, + position: 'center', + progressSteps: [], + currentProgressStep: undefined, + progressStepsDistance: undefined, + willOpen: undefined, + didOpen: undefined, + didRender: undefined, + willClose: undefined, + didClose: undefined, + didDestroy: undefined, + scrollbarPadding: true, + topLayer: false +}; +const updatableParams = ['allowEscapeKey', 'allowOutsideClick', 'background', 'buttonsStyling', 'cancelButtonAriaLabel', 'cancelButtonColor', 'cancelButtonText', 'closeButtonAriaLabel', 'closeButtonHtml', 'color', 'confirmButtonAriaLabel', 'confirmButtonColor', 'confirmButtonText', 'currentProgressStep', 'customClass', 'denyButtonAriaLabel', 'denyButtonColor', 'denyButtonText', 'didClose', 'didDestroy', 'draggable', 'footer', 'hideClass', 'html', 'icon', 'iconColor', 'iconHtml', 'imageAlt', 'imageHeight', 'imageUrl', 'imageWidth', 'preConfirm', 'preDeny', 'progressSteps', 'returnFocus', 'reverseButtons', 'showCancelButton', 'showCloseButton', 'showConfirmButton', 'showDenyButton', 'text', 'title', 'titleText', 'theme', 'willClose']; + +/** @type {Record} */ +const deprecatedParams = { + allowEnterKey: undefined +}; +const toastIncompatibleParams = ['allowOutsideClick', 'allowEnterKey', 'backdrop', 'draggable', 'focusConfirm', 'focusDeny', 'focusCancel', 'returnFocus', 'heightAuto', 'keydownListenerCapture']; + +/** + * Is valid parameter + * + * @param {string} paramName + * @returns {boolean} + */ +const isValidParameter = paramName => { + return Object.prototype.hasOwnProperty.call(defaultParams, paramName); +}; + +/** + * Is valid parameter for Swal.update() method + * + * @param {string} paramName + * @returns {boolean} + */ +const isUpdatableParameter = paramName => { + return updatableParams.indexOf(paramName) !== -1; +}; + +/** + * Is deprecated parameter + * + * @param {string} paramName + * @returns {string | undefined} + */ +const isDeprecatedParameter = paramName => { + return deprecatedParams[paramName]; +}; + +/** + * @param {string} param + */ +const checkIfParamIsValid = param => { + if (!isValidParameter(param)) { + warn(`Unknown parameter "${param}"`); + } +}; + +/** + * @param {string} param + */ +const checkIfToastParamIsValid = param => { + if (toastIncompatibleParams.includes(param)) { + warn(`The parameter "${param}" is incompatible with toasts`); + } +}; + +/** + * @param {string} param + */ +const checkIfParamIsDeprecated = param => { + const isDeprecated = isDeprecatedParameter(param); + if (isDeprecated) { + warnAboutDeprecation(param, isDeprecated); + } +}; + +/** + * Show relevant warnings for given params + * + * @param {SweetAlertOptions} params + */ +const showWarningsForParams = params => { + if (params.backdrop === false && params.allowOutsideClick) { + warn('"allowOutsideClick" parameter requires `backdrop` parameter to be set to `true`'); + } + if (params.theme && !['light', 'dark', 'auto', 'minimal', 'borderless', 'bootstrap-4', 'bootstrap-4-light', 'bootstrap-4-dark', 'bootstrap-5', 'bootstrap-5-light', 'bootstrap-5-dark', 'material-ui', 'material-ui-light', 'material-ui-dark', 'embed-iframe', 'bulma', 'bulma-light', 'bulma-dark'].includes(params.theme)) { + warn(`Invalid theme "${params.theme}"`); + } + for (const param in params) { + checkIfParamIsValid(param); + if (params.toast) { + checkIfToastParamIsValid(param); + } + checkIfParamIsDeprecated(param); + } +}; + +/** + * Updates popup parameters. + * + * @this {any} + * @param {SweetAlertOptions} params + */ +function update(params) { + const container = getContainer(); + const popup = getPopup(); + const innerParams = privateProps.innerParams.get(this); + if (!popup || hasClass(popup, innerParams.hideClass.popup)) { + warn(`You're trying to update the closed or closing popup, that won't work. Use the update() method in preConfirm parameter or show a new popup.`); + return; + } + const validUpdatableParams = filterValidParams(params); + const updatedParams = Object.assign({}, innerParams, validUpdatableParams); + showWarningsForParams(updatedParams); + if (container) { + container.dataset['swal2Theme'] = updatedParams.theme; + } + render(this, updatedParams); + privateProps.innerParams.set(this, updatedParams); + Object.defineProperties(this, { + params: { + value: Object.assign({}, this.params, params), + writable: false, + enumerable: true + } + }); +} + +/** + * @param {SweetAlertOptions} params + * @returns {SweetAlertOptions} + */ +const filterValidParams = params => { + /** @type {Record} */ + const validUpdatableParams = {}; + Object.keys(params).forEach(param => { + if (isUpdatableParameter(param)) { + const typedParams = /** @type {Record} */params; + validUpdatableParams[param] = typedParams[param]; + } else { + warn(`Invalid parameter to update: ${param}`); + } + }); + return validUpdatableParams; +}; + +/** + * Dispose the current SweetAlert2 instance + * @this {SweetAlert} + */ +function _destroy() { + var _globalState$eventEmi; + const domCache = privateProps.domCache.get(this); + const innerParams = privateProps.innerParams.get(this); + if (!innerParams) { + disposeWeakMaps(this); // The WeakMaps might have been partly destroyed, we must recall it to dispose any remaining WeakMaps #2335 + return; // This instance has already been destroyed + } + + // Check if there is another Swal closing + if (domCache.popup && globalState.swalCloseEventFinishedCallback) { + globalState.swalCloseEventFinishedCallback(); + delete globalState.swalCloseEventFinishedCallback; + } + if (typeof innerParams.didDestroy === 'function') { + innerParams.didDestroy(); + } + (_globalState$eventEmi = globalState.eventEmitter) === null || _globalState$eventEmi === void 0 || _globalState$eventEmi.emit('didDestroy'); + disposeSwal(this); +} + +/** + * @param {SweetAlert} instance + */ +const disposeSwal = instance => { + disposeWeakMaps(instance); + // Unset this.params so GC will dispose it (#1569) + // @ts-ignore + delete instance.params; + // Unset globalState props so GC will dispose globalState (#1569) + delete globalState.keydownHandler; + delete globalState.keydownTarget; + // Unset currentInstance + delete globalState.currentInstance; +}; + +/** + * @param {SweetAlert} instance + */ +const disposeWeakMaps = instance => { + // If the current instance is awaiting a promise result, we keep the privateMethods to call them once the promise result is retrieved #2335 + if (instance.isAwaitingPromise) { + unsetWeakMaps(privateProps, instance); + instance.isAwaitingPromise = true; + } else { + unsetWeakMaps(privateMethods, instance); + unsetWeakMaps(privateProps, instance); + + // @ts-ignore + delete instance.isAwaitingPromise; + // Unset instance methods + // @ts-ignore + delete instance.disableButtons; + // @ts-ignore + delete instance.enableButtons; + // @ts-ignore + delete instance.getInput; + // @ts-ignore + delete instance.disableInput; + // @ts-ignore + delete instance.enableInput; + // @ts-ignore + delete instance.hideLoading; + // @ts-ignore + delete instance.disableLoading; + // @ts-ignore + delete instance.showValidationMessage; + // @ts-ignore + delete instance.resetValidationMessage; + // @ts-ignore + delete instance.close; + // @ts-ignore + delete instance.closePopup; + // @ts-ignore + delete instance.closeModal; + // @ts-ignore + delete instance.closeToast; + // @ts-ignore + delete instance.rejectPromise; + // @ts-ignore + delete instance.update; + // @ts-ignore + delete instance._destroy; + } +}; + +/** + * @param {Record>} obj + * @param {SweetAlert} instance + */ +const unsetWeakMaps = (obj, instance) => { + for (const i in obj) { + obj[i].delete(instance); + } +}; + +var instanceMethods = /*#__PURE__*/Object.freeze({ + __proto__: null, + _destroy: _destroy, + close: close, + closeModal: close, + closePopup: close, + closeToast: close, + disableButtons: disableButtons, + disableInput: disableInput, + disableLoading: hideLoading, + enableButtons: enableButtons, + enableInput: enableInput, + getInput: getInput, + handleAwaitingPromise: handleAwaitingPromise, + hideLoading: hideLoading, + rejectPromise: rejectPromise, + resetValidationMessage: resetValidationMessage, + showValidationMessage: showValidationMessage, + update: update +}); + +/** + * @param {SweetAlertOptions} innerParams + * @param {DomCache} domCache + * @param {(dismiss: DismissReason) => void} dismissWith + */ +const handlePopupClick = (innerParams, domCache, dismissWith) => { + if (innerParams.toast) { + handleToastClick(innerParams, domCache, dismissWith); + } else { + // Ignore click events that had mousedown on the popup but mouseup on the container + // This can happen when the user drags a slider + handleModalMousedown(domCache); + + // Ignore click events that had mousedown on the container but mouseup on the popup + handleContainerMousedown(domCache); + handleModalClick(innerParams, domCache, dismissWith); + } +}; + +/** + * @param {SweetAlertOptions} innerParams + * @param {DomCache} domCache + * @param {(dismiss: DismissReason) => void} dismissWith + */ +const handleToastClick = (innerParams, domCache, dismissWith) => { + // Closing toast by internal click + domCache.popup.onclick = () => { + if (innerParams && (isAnyButtonShown(innerParams) || innerParams.timer || innerParams.input)) { + return; + } + dismissWith(DismissReason.close); + }; +}; + +/** + * @param {SweetAlertOptions} innerParams + * @returns {boolean} + */ +const isAnyButtonShown = innerParams => { + return Boolean(innerParams.showConfirmButton || innerParams.showDenyButton || innerParams.showCancelButton || innerParams.showCloseButton); +}; +let ignoreOutsideClick = false; + +/** + * @param {DomCache} domCache + */ +const handleModalMousedown = domCache => { + domCache.popup.onmousedown = () => { + domCache.container.onmouseup = function (e) { + domCache.container.onmouseup = () => {}; + // We only check if the mouseup target is the container because usually it doesn't + // have any other direct children aside of the popup + if (e.target === domCache.container) { + ignoreOutsideClick = true; + } + }; + }; +}; + +/** + * @param {DomCache} domCache + */ +const handleContainerMousedown = domCache => { + domCache.container.onmousedown = e => { + // prevent the modal text from being selected on double click on the container (allowOutsideClick: false) + if (e.target === domCache.container) { + e.preventDefault(); + } + domCache.popup.onmouseup = function (e) { + domCache.popup.onmouseup = () => {}; + // We also need to check if the mouseup target is a child of the popup + if (e.target === domCache.popup || e.target instanceof HTMLElement && domCache.popup.contains(e.target)) { + ignoreOutsideClick = true; + } + }; + }; +}; + +/** + * @param {SweetAlertOptions} innerParams + * @param {DomCache} domCache + * @param {(dismiss: DismissReason) => void} dismissWith + */ +const handleModalClick = (innerParams, domCache, dismissWith) => { + domCache.container.onclick = e => { + if (ignoreOutsideClick) { + ignoreOutsideClick = false; + return; + } + if (e.target === domCache.container && callIfFunction(innerParams.allowOutsideClick)) { + dismissWith(DismissReason.backdrop); + } + }; +}; + +/** + * @param {unknown} elem + * @returns {boolean} + */ +const isJqueryElement = elem => typeof elem === 'object' && elem !== null && 'jquery' in elem; + +/** + * @param {unknown} elem + * @returns {boolean} + */ +const isElement = elem => elem instanceof Element || isJqueryElement(elem); + +/** + * @param {ReadonlyArray} args + * @returns {SweetAlertOptions} + */ +const argsToParams = args => { + /** @type {Record} */ + const params = {}; + if (typeof args[0] === 'object' && !isElement(args[0])) { + Object.assign(params, args[0]); + } else { + ['title', 'html', 'icon'].forEach((name, index) => { + const arg = args[index]; + if (typeof arg === 'string' || isElement(arg)) { + params[name] = arg; + } else if (arg !== undefined) { + error(`Unexpected type of ${name}! Expected "string" or "Element", got ${typeof arg}`); + } + }); + } + return /** @type {SweetAlertOptions} */params; +}; + +/** + * Main method to create a new SweetAlert2 popup + * + * @this {new (...args: any[]) => any} + * @param {...SweetAlertOptions} args + * @returns {Promise} + */ +function fire(...args) { + return new this(...args); +} + +/** + * Returns an extended version of `Swal` containing `params` as defaults. + * Useful for reusing Swal configuration. + * + * For example: + * + * Before: + * const textPromptOptions = { input: 'text', showCancelButton: true } + * const {value: firstName} = await Swal.fire({ ...textPromptOptions, title: 'What is your first name?' }) + * const {value: lastName} = await Swal.fire({ ...textPromptOptions, title: 'What is your last name?' }) + * + * After: + * const TextPrompt = Swal.mixin({ input: 'text', showCancelButton: true }) + * const {value: firstName} = await TextPrompt('What is your first name?') + * const {value: lastName} = await TextPrompt('What is your last name?') + * + * @param {SweetAlertOptions} mixinParams + * @returns {SweetAlert} + * @this {typeof import('../SweetAlert.js').SweetAlert} + */ +function mixin(mixinParams) { + // @ts-ignore: 'this' refers to the SweetAlert constructor + class MixinSwal extends this { + /** + * @param {any} params + * @param {any} priorityMixinParams + */ + _main(params, priorityMixinParams) { + return super._main(params, Object.assign({}, mixinParams, priorityMixinParams)); + } + } + // @ts-ignore + return MixinSwal; +} + +/** + * If `timer` parameter is set, returns number of milliseconds of timer remained. + * Otherwise, returns undefined. + * + * @returns {number | undefined} + */ +const getTimerLeft = () => { + return globalState.timeout && globalState.timeout.getTimerLeft(); +}; + +/** + * Stop timer. Returns number of milliseconds of timer remained. + * If `timer` parameter isn't set, returns undefined. + * + * @returns {number | undefined} + */ +const stopTimer = () => { + if (globalState.timeout) { + stopTimerProgressBar(); + return globalState.timeout.stop(); + } +}; + +/** + * Resume timer. Returns number of milliseconds of timer remained. + * If `timer` parameter isn't set, returns undefined. + * + * @returns {number | undefined} + */ +const resumeTimer = () => { + if (globalState.timeout) { + const remaining = globalState.timeout.start(); + animateTimerProgressBar(remaining); + return remaining; + } +}; + +/** + * Resume timer. Returns number of milliseconds of timer remained. + * If `timer` parameter isn't set, returns undefined. + * + * @returns {number | undefined} + */ +const toggleTimer = () => { + const timer = globalState.timeout; + return timer && (timer.running ? stopTimer() : resumeTimer()); +}; + +/** + * Increase timer. Returns number of milliseconds of an updated timer. + * If `timer` parameter isn't set, returns undefined. + * + * @param {number} ms + * @returns {number | undefined} + */ +const increaseTimer = ms => { + if (globalState.timeout) { + const remaining = globalState.timeout.increase(ms); + animateTimerProgressBar(remaining, true); + return remaining; + } +}; + +/** + * Check if timer is running. Returns true if timer is running + * or false if timer is paused or stopped. + * If `timer` parameter isn't set, returns undefined + * + * @returns {boolean} + */ +const isTimerRunning = () => { + return Boolean(globalState.timeout && globalState.timeout.isRunning()); +}; + +let bodyClickListenerAdded = false; +/** @type {Record} */ +const clickHandlers = {}; + +/** + * @this {any} + * @param {string} attr + */ +function bindClickHandler(attr = 'data-swal-template') { + clickHandlers[attr] = this; + if (!bodyClickListenerAdded) { + document.body.addEventListener('click', bodyClickListener); + bodyClickListenerAdded = true; + } +} + +/** + * @param {MouseEvent} event + */ +const bodyClickListener = event => { + for (let el = /** @type {any} */event.target; el && el !== document; el = el.parentNode) { + for (const attr in clickHandlers) { + const template = el.getAttribute && el.getAttribute(attr); + if (template) { + clickHandlers[attr].fire({ + template + }); + return; + } + } + } +}; + +// Source: https://gist.github.com/mudge/5830382?permalink_comment_id=2691957#gistcomment-2691957 + +class EventEmitter { + constructor() { + /** @type {Events} */ + this.events = {}; + } + + /** + * @param {string} eventName + * @returns {EventHandlers} + */ + _getHandlersByEventName(eventName) { + if (typeof this.events[eventName] === 'undefined') { + // not Set because we need to keep the FIFO order + // https://github.com/sweetalert2/sweetalert2/pull/2763#discussion_r1748990334 + this.events[eventName] = []; + } + return this.events[eventName]; + } + + /** + * @param {string} eventName + * @param {EventHandler} eventHandler + */ + on(eventName, eventHandler) { + const currentHandlers = this._getHandlersByEventName(eventName); + if (!currentHandlers.includes(eventHandler)) { + currentHandlers.push(eventHandler); + } + } + + /** + * @param {string} eventName + * @param {EventHandler} eventHandler + */ + once(eventName, eventHandler) { + /** + * @param {...any} args + */ + const onceFn = (...args) => { + this.removeListener(eventName, onceFn); + // @ts-ignore + eventHandler.apply(this, args); + }; + this.on(eventName, onceFn); + } + + /** + * @param {string} eventName + * @param {...any} args + */ + emit(eventName, ...args) { + this._getHandlersByEventName(eventName).forEach( + /** + * @param {EventHandler} eventHandler + */ + eventHandler => { + try { + // @ts-ignore + eventHandler.apply(this, args); + } catch (error) { + console.error(error); + } + }); + } + + /** + * @param {string} eventName + * @param {EventHandler} eventHandler + */ + removeListener(eventName, eventHandler) { + const currentHandlers = this._getHandlersByEventName(eventName); + const index = currentHandlers.indexOf(eventHandler); + if (index > -1) { + currentHandlers.splice(index, 1); + } + } + + /** + * @param {string} eventName + */ + removeAllListeners(eventName) { + if (this.events[eventName] !== undefined) { + // https://github.com/sweetalert2/sweetalert2/pull/2763#discussion_r1749239222 + this.events[eventName].length = 0; + } + } + reset() { + this.events = {}; + } +} + +globalState.eventEmitter = new EventEmitter(); + +/** + * @param {string} eventName + * @param {EventHandler} eventHandler + */ +const on = (eventName, eventHandler) => { + if (globalState.eventEmitter) { + globalState.eventEmitter.on(eventName, eventHandler); + } +}; + +/** + * @param {string} eventName + * @param {EventHandler} eventHandler + */ +const once = (eventName, eventHandler) => { + if (globalState.eventEmitter) { + globalState.eventEmitter.once(eventName, eventHandler); + } +}; + +/** + * @param {string} [eventName] + * @param {EventHandler} [eventHandler] + */ +const off = (eventName, eventHandler) => { + if (!globalState.eventEmitter) { + return; + } + + // Remove all handlers for all events + if (!eventName) { + globalState.eventEmitter.reset(); + return; + } + if (eventHandler) { + // Remove a specific handler + globalState.eventEmitter.removeListener(eventName, eventHandler); + } else { + // Remove all handlers for a specific event + globalState.eventEmitter.removeAllListeners(eventName); + } +}; + +var staticMethods = /*#__PURE__*/Object.freeze({ + __proto__: null, + argsToParams: argsToParams, + bindClickHandler: bindClickHandler, + clickCancel: clickCancel, + clickConfirm: clickConfirm, + clickDeny: clickDeny, + enableLoading: showLoading, + fire: fire, + getActions: getActions, + getCancelButton: getCancelButton, + getCloseButton: getCloseButton, + getConfirmButton: getConfirmButton, + getContainer: getContainer, + getDenyButton: getDenyButton, + getFocusableElements: getFocusableElements, + getFooter: getFooter, + getHtmlContainer: getHtmlContainer, + getIcon: getIcon, + getIconContent: getIconContent, + getImage: getImage, + getInputLabel: getInputLabel, + getLoader: getLoader, + getPopup: getPopup, + getProgressSteps: getProgressSteps, + getTimerLeft: getTimerLeft, + getTimerProgressBar: getTimerProgressBar, + getTitle: getTitle, + getValidationMessage: getValidationMessage, + increaseTimer: increaseTimer, + isDeprecatedParameter: isDeprecatedParameter, + isLoading: isLoading, + isTimerRunning: isTimerRunning, + isUpdatableParameter: isUpdatableParameter, + isValidParameter: isValidParameter, + isVisible: isVisible, + mixin: mixin, + off: off, + on: on, + once: once, + resumeTimer: resumeTimer, + showLoading: showLoading, + stopTimer: stopTimer, + toggleTimer: toggleTimer +}); + +class Timer { + /** + * @param {() => void} callback + * @param {number} delay + */ + constructor(callback, delay) { + this.callback = callback; + this.remaining = delay; + this.running = false; + this.start(); + } + + /** + * @returns {number} + */ + start() { + if (!this.running) { + this.running = true; + this.started = new Date(); + this.id = setTimeout(this.callback, this.remaining); + } + return this.remaining; + } + + /** + * @returns {number} + */ + stop() { + if (this.started && this.running) { + this.running = false; + clearTimeout(this.id); + this.remaining -= new Date().getTime() - this.started.getTime(); + } + return this.remaining; + } + + /** + * @param {number} n + * @returns {number} + */ + increase(n) { + const running = this.running; + if (running) { + this.stop(); + } + this.remaining += n; + if (running) { + this.start(); + } + return this.remaining; + } + + /** + * @returns {number} + */ + getTimerLeft() { + if (this.running) { + this.stop(); + this.start(); + } + return this.remaining; + } + + /** + * @returns {boolean} + */ + isRunning() { + return this.running; + } +} + +const swalStringParams = ['swal-title', 'swal-html', 'swal-footer']; + +/** + * @param {SweetAlertOptions} params + * @returns {SweetAlertOptions} + */ +const getTemplateParams = params => { + const template = typeof params.template === 'string' ? (/** @type {HTMLTemplateElement} */document.querySelector(params.template)) : params.template; + if (!template) { + return {}; + } + /** @type {DocumentFragment} */ + const templateContent = template.content; + showWarningsForElements(templateContent); + const result = Object.assign(getSwalParams(templateContent), getSwalFunctionParams(templateContent), getSwalButtons(templateContent), getSwalImage(templateContent), getSwalIcon(templateContent), getSwalInput(templateContent), getSwalStringParams(templateContent, swalStringParams)); + return result; +}; + +/** + * @param {DocumentFragment} templateContent + * @returns {Record} + */ +const getSwalParams = templateContent => { + /** @type {Record} */ + const result = {}; + /** @type {HTMLElement[]} */ + const swalParams = Array.from(templateContent.querySelectorAll('swal-param')); + swalParams.forEach(param => { + showWarningsForAttributes(param, ['name', 'value']); + const paramName = /** @type {keyof SweetAlertOptions} */param.getAttribute('name'); + const value = param.getAttribute('value'); + if (!paramName || !value) { + return; + } + if (paramName in defaultParams && typeof defaultParams[(/** @type {keyof typeof defaultParams} */paramName)] === 'boolean') { + result[paramName] = value !== 'false'; + } else if (paramName in defaultParams && typeof defaultParams[(/** @type {keyof typeof defaultParams} */paramName)] === 'object') { + result[paramName] = JSON.parse(value); + } else { + result[paramName] = value; + } + }); + return result; +}; + +/** + * @param {DocumentFragment} templateContent + * @returns {Record void>} + */ +const getSwalFunctionParams = templateContent => { + /** @type {Record void>} */ + const result = {}; + /** @type {HTMLElement[]} */ + const swalFunctions = Array.from(templateContent.querySelectorAll('swal-function-param')); + swalFunctions.forEach(param => { + const paramName = /** @type {keyof SweetAlertOptions} */param.getAttribute('name'); + const value = param.getAttribute('value'); + if (!paramName || !value) { + return; + } + result[paramName] = new Function(`return ${value}`)(); + }); + return result; +}; + +/** + * @param {DocumentFragment} templateContent + * @returns {Record} + */ +const getSwalButtons = templateContent => { + /** @type {Record} */ + const result = {}; + /** @type {HTMLElement[]} */ + const swalButtons = Array.from(templateContent.querySelectorAll('swal-button')); + swalButtons.forEach(button => { + showWarningsForAttributes(button, ['type', 'color', 'aria-label']); + const type = button.getAttribute('type'); + if (!type || !['confirm', 'cancel', 'deny'].includes(type)) { + return; + } + result[`${type}ButtonText`] = button.innerHTML; + result[`show${capitalizeFirstLetter(type)}Button`] = true; + if (button.hasAttribute('color')) { + const color = button.getAttribute('color'); + if (color !== null) { + result[`${type}ButtonColor`] = color; + } + } + if (button.hasAttribute('aria-label')) { + const ariaLabel = button.getAttribute('aria-label'); + if (ariaLabel !== null) { + result[`${type}ButtonAriaLabel`] = ariaLabel; + } + } + }); + return result; +}; + +/** + * @param {DocumentFragment} templateContent + * @returns {Pick} + */ +const getSwalImage = templateContent => { + const result = {}; + /** @type {HTMLElement | null} */ + const image = templateContent.querySelector('swal-image'); + if (image) { + showWarningsForAttributes(image, ['src', 'width', 'height', 'alt']); + if (image.hasAttribute('src')) { + result.imageUrl = image.getAttribute('src') || undefined; + } + if (image.hasAttribute('width')) { + result.imageWidth = image.getAttribute('width') || undefined; + } + if (image.hasAttribute('height')) { + result.imageHeight = image.getAttribute('height') || undefined; + } + if (image.hasAttribute('alt')) { + result.imageAlt = image.getAttribute('alt') || undefined; + } + } + return result; +}; + +/** + * @param {DocumentFragment} templateContent + * @returns {object} + */ +const getSwalIcon = templateContent => { + const result = {}; + /** @type {HTMLElement | null} */ + const icon = templateContent.querySelector('swal-icon'); + if (icon) { + showWarningsForAttributes(icon, ['type', 'color']); + if (icon.hasAttribute('type')) { + result.icon = icon.getAttribute('type'); + } + if (icon.hasAttribute('color')) { + result.iconColor = icon.getAttribute('color'); + } + result.iconHtml = icon.innerHTML; + } + return result; +}; + +/** + * @param {DocumentFragment} templateContent + * @returns {object} + */ +const getSwalInput = templateContent => { + /** @type {Record} */ + const result = {}; + /** @type {HTMLElement | null} */ + const input = templateContent.querySelector('swal-input'); + if (input) { + showWarningsForAttributes(input, ['type', 'label', 'placeholder', 'value']); + result.input = input.getAttribute('type') || 'text'; + if (input.hasAttribute('label')) { + result.inputLabel = input.getAttribute('label'); + } + if (input.hasAttribute('placeholder')) { + result.inputPlaceholder = input.getAttribute('placeholder'); + } + if (input.hasAttribute('value')) { + result.inputValue = input.getAttribute('value'); + } + } + /** @type {HTMLElement[]} */ + const inputOptions = Array.from(templateContent.querySelectorAll('swal-input-option')); + if (inputOptions.length) { + result.inputOptions = {}; + inputOptions.forEach(option => { + showWarningsForAttributes(option, ['value']); + const optionValue = option.getAttribute('value'); + if (!optionValue) { + return; + } + const optionName = option.innerHTML; + result.inputOptions[optionValue] = optionName; + }); + } + return result; +}; + +/** + * @param {DocumentFragment} templateContent + * @param {string[]} paramNames + * @returns {Record} + */ +const getSwalStringParams = (templateContent, paramNames) => { + /** @type {Record} */ + const result = {}; + for (const i in paramNames) { + const paramName = paramNames[i]; + /** @type {HTMLElement | null} */ + const tag = templateContent.querySelector(paramName); + if (tag) { + showWarningsForAttributes(tag, []); + result[paramName.replace(/^swal-/, '')] = tag.innerHTML.trim(); + } + } + return result; +}; + +/** + * @param {DocumentFragment} templateContent + */ +const showWarningsForElements = templateContent => { + const allowedElements = swalStringParams.concat(['swal-param', 'swal-function-param', 'swal-button', 'swal-image', 'swal-icon', 'swal-input', 'swal-input-option']); + Array.from(templateContent.children).forEach(el => { + const tagName = el.tagName.toLowerCase(); + if (!allowedElements.includes(tagName)) { + warn(`Unrecognized element <${tagName}>`); + } + }); +}; + +/** + * @param {HTMLElement} el + * @param {string[]} allowedAttributes + */ +const showWarningsForAttributes = (el, allowedAttributes) => { + Array.from(el.attributes).forEach(attribute => { + if (allowedAttributes.indexOf(attribute.name) === -1) { + warn([`Unrecognized attribute "${attribute.name}" on <${el.tagName.toLowerCase()}>.`, `${allowedAttributes.length ? `Allowed attributes are: ${allowedAttributes.join(', ')}` : 'To set the value, use HTML within the element.'}`]); + } + }); +}; + +const SHOW_CLASS_TIMEOUT = 10; + +/** + * Open popup, add necessary classes and styles, fix scrollbar + * + * @param {SweetAlertOptions} params + */ +const openPopup = params => { + var _globalState$eventEmi, _globalState$eventEmi2; + const container = getContainer(); + const popup = getPopup(); + if (!container || !popup) { + return; + } + if (typeof params.willOpen === 'function') { + params.willOpen(popup); + } + (_globalState$eventEmi = globalState.eventEmitter) === null || _globalState$eventEmi === void 0 || _globalState$eventEmi.emit('willOpen', popup); + const bodyStyles = window.getComputedStyle(document.body); + const initialBodyOverflow = bodyStyles.overflowY; + addClasses(container, popup, params); + + // scrolling is 'hidden' until animation is done, after that 'auto' + setTimeout(() => { + setScrollingVisibility(container, popup); + }, SHOW_CLASS_TIMEOUT); + if (isModal()) { + // Using ternary instead of ?? operator for Webpack 4 compatibility + fixScrollContainer(container, params.scrollbarPadding !== undefined ? params.scrollbarPadding : false, initialBodyOverflow); + setAriaHidden(); + } + if (!isToast() && !globalState.previousActiveElement) { + globalState.previousActiveElement = document.activeElement; + } + if (typeof params.didOpen === 'function') { + const didOpen = params.didOpen; + setTimeout(() => didOpen(popup)); + } + (_globalState$eventEmi2 = globalState.eventEmitter) === null || _globalState$eventEmi2 === void 0 || _globalState$eventEmi2.emit('didOpen', popup); +}; + +/** + * @param {Event} event + */ +const swalOpenAnimationFinished = event => { + const popup = getPopup(); + if (!popup || event.target !== popup) { + return; + } + const container = getContainer(); + if (!container) { + return; + } + popup.removeEventListener('animationend', swalOpenAnimationFinished); + popup.removeEventListener('transitionend', swalOpenAnimationFinished); + container.style.overflowY = 'auto'; + + // no-transition is added in init() in case one swal is opened right after another + removeClass(container, swalClasses['no-transition']); +}; + +/** + * @param {HTMLElement} container + * @param {HTMLElement} popup + */ +const setScrollingVisibility = (container, popup) => { + if (hasCssAnimation(popup)) { + container.style.overflowY = 'hidden'; + popup.addEventListener('animationend', swalOpenAnimationFinished); + popup.addEventListener('transitionend', swalOpenAnimationFinished); + } else { + container.style.overflowY = 'auto'; + } +}; + +/** + * @param {HTMLElement} container + * @param {boolean} scrollbarPadding + * @param {string} initialBodyOverflow + */ +const fixScrollContainer = (container, scrollbarPadding, initialBodyOverflow) => { + iOSfix(); + if (scrollbarPadding && initialBodyOverflow !== 'hidden') { + replaceScrollbarWithPadding(initialBodyOverflow); + } + + // sweetalert2/issues/1247 + setTimeout(() => { + container.scrollTop = 0; + }); +}; + +/** + * @param {HTMLElement} container + * @param {HTMLElement} popup + * @param {SweetAlertOptions} params + */ +const addClasses = (container, popup, params) => { + var _params$showClass; + if ((_params$showClass = params.showClass) !== null && _params$showClass !== void 0 && _params$showClass.backdrop) { + addClass(container, params.showClass.backdrop); + } + if (params.animation) { + // this workaround with opacity is needed for https://github.com/sweetalert2/sweetalert2/issues/2059 + popup.style.setProperty('opacity', '0', 'important'); + show(popup, 'grid'); + setTimeout(() => { + var _params$showClass2; + // Animate popup right after showing it + if ((_params$showClass2 = params.showClass) !== null && _params$showClass2 !== void 0 && _params$showClass2.popup) { + addClass(popup, params.showClass.popup); + } + // and remove the opacity workaround + popup.style.removeProperty('opacity'); + }, SHOW_CLASS_TIMEOUT); // 10ms in order to fix #2062 + } else { + show(popup, 'grid'); + } + addClass([document.documentElement, document.body], swalClasses.shown); + if (params.heightAuto && params.backdrop && !params.toast) { + addClass([document.documentElement, document.body], swalClasses['height-auto']); + } +}; + +var defaultInputValidators = { + /** + * @param {string} string + * @param {string} [validationMessage] + * @returns {Promise} + */ + email: (string, validationMessage) => { + return /^[a-zA-Z0-9.+_'-]+@[a-zA-Z0-9.-]+\.[a-zA-Z0-9-]+$/.test(string) ? Promise.resolve() : Promise.resolve(validationMessage || 'Invalid email address'); + }, + /** + * @param {string} string + * @param {string} [validationMessage] + * @returns {Promise} + */ + url: (string, validationMessage) => { + // taken from https://stackoverflow.com/a/3809435 with a small change from #1306 and #2013 + return /^https?:\/\/(www\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\.[a-z]{2,63}\b([-a-zA-Z0-9@:%_+.~#?&/=]*)$/.test(string) ? Promise.resolve() : Promise.resolve(validationMessage || 'Invalid URL'); + } +}; + +/** + * @param {SweetAlertOptions} params + */ +function setDefaultInputValidators(params) { + // Use default `inputValidator` for supported input types if not provided + if (params.inputValidator) { + return; + } + if (params.input === 'email') { + params.inputValidator = defaultInputValidators['email']; + } + if (params.input === 'url') { + params.inputValidator = defaultInputValidators['url']; + } +} + +/** + * @param {SweetAlertOptions} params + */ +function validateCustomTargetElement(params) { + // Determine if the custom target element is valid + if (!params.target || typeof params.target === 'string' && !document.querySelector(params.target) || typeof params.target !== 'string' && !params.target.appendChild) { + warn('Target parameter is not valid, defaulting to "body"'); + params.target = 'body'; + } +} + +/** + * Set type, text and actions on popup + * + * @param {SweetAlertOptions} params + */ +function setParameters(params) { + setDefaultInputValidators(params); + + // showLoaderOnConfirm && preConfirm + if (params.showLoaderOnConfirm && !params.preConfirm) { + warn('showLoaderOnConfirm is set to true, but preConfirm is not defined.\n' + 'showLoaderOnConfirm should be used together with preConfirm, see usage example:\n' + 'https://sweetalert2.github.io/#ajax-request'); + } + validateCustomTargetElement(params); + + // Replace newlines with
          in title + if (typeof params.title === 'string') { + params.title = params.title.split('\n').join('
          '); + } + init(params); +} + +/** @type {SweetAlert} */ +let currentInstance; +var _promise = /*#__PURE__*/new WeakMap(); +class SweetAlert { + /** + * @param {...(SweetAlertOptions | string)} args + * @this {SweetAlert} + */ + constructor(...args) { + /** + * @type {Promise} + */ + _classPrivateFieldInitSpec(this, _promise, /** @type {Promise} */Promise.resolve({ + isConfirmed: false, + isDenied: false, + isDismissed: true + })); + // Prevent run in Node env + if (typeof window === 'undefined') { + return; + } + currentInstance = this; + + // @ts-ignore + const outerParams = Object.freeze(this.constructor.argsToParams(args)); + + /** @type {Readonly} */ + this.params = outerParams; + + /** @type {boolean} */ + this.isAwaitingPromise = false; + _classPrivateFieldSet2(_promise, this, this._main(currentInstance.params)); + } + + /** + * @param {any} userParams + * @param {any} mixinParams + */ + _main(userParams, mixinParams = {}) { + showWarningsForParams(Object.assign({}, mixinParams, userParams)); + if (globalState.currentInstance) { + const swalPromiseResolve = privateMethods.swalPromiseResolve.get(globalState.currentInstance); + const { + isAwaitingPromise + } = globalState.currentInstance; + globalState.currentInstance._destroy(); + if (!isAwaitingPromise) { + swalPromiseResolve({ + isDismissed: true + }); + } + if (isModal()) { + unsetAriaHidden(); + } + } + globalState.currentInstance = currentInstance; + const innerParams = prepareParams(userParams, mixinParams); + setParameters(innerParams); + Object.freeze(innerParams); + + // clear the previous timer + if (globalState.timeout) { + globalState.timeout.stop(); + delete globalState.timeout; + } + + // clear the restore focus timeout + clearTimeout(globalState.restoreFocusTimeout); + const domCache = populateDomCache(currentInstance); + render(currentInstance, innerParams); + privateProps.innerParams.set(currentInstance, innerParams); + return swalPromise(currentInstance, domCache, innerParams); + } + + // `catch` cannot be the name of a module export, so we define our thenable methods here instead + /** + * @param {any} onFulfilled + */ + then(onFulfilled) { + return _classPrivateFieldGet2(_promise, this).then(onFulfilled); + } + + /** + * @param {any} onFinally + */ + finally(onFinally) { + return _classPrivateFieldGet2(_promise, this).finally(onFinally); + } +} + +/** + * @param {SweetAlert} instance + * @param {DomCache} domCache + * @param {SweetAlertOptions} innerParams + * @returns {Promise} + */ +const swalPromise = (instance, domCache, innerParams) => { + return new Promise((resolve, reject) => { + // functions to handle all closings/dismissals + /** + * @param {DismissReason} dismiss + */ + const dismissWith = dismiss => { + instance.close({ + isDismissed: true, + dismiss, + isConfirmed: false, + isDenied: false + }); + }; + privateMethods.swalPromiseResolve.set(instance, resolve); + privateMethods.swalPromiseReject.set(instance, reject); + domCache.confirmButton.onclick = () => { + handleConfirmButtonClick(instance); + }; + domCache.denyButton.onclick = () => { + handleDenyButtonClick(instance); + }; + domCache.cancelButton.onclick = () => { + handleCancelButtonClick(instance, dismissWith); + }; + domCache.closeButton.onclick = () => { + dismissWith(DismissReason.close); + }; + handlePopupClick(innerParams, domCache, dismissWith); + addKeydownHandler(globalState, innerParams, dismissWith); + handleInputOptionsAndValue(instance, innerParams); + openPopup(innerParams); + setupTimer(globalState, innerParams, dismissWith); + initFocus(domCache, innerParams); + + // Scroll container to top on open (#1247, #1946) + setTimeout(() => { + domCache.container.scrollTop = 0; + }); + }); +}; + +/** + * @param {SweetAlertOptions} userParams + * @param {SweetAlertOptions} mixinParams + * @returns {SweetAlertOptions} + */ +const prepareParams = (userParams, mixinParams) => { + const templateParams = getTemplateParams(userParams); + const params = Object.assign({}, defaultParams, mixinParams, templateParams, userParams); // precedence is described in #2131 + params.showClass = Object.assign({}, defaultParams.showClass, params.showClass); + params.hideClass = Object.assign({}, defaultParams.hideClass, params.hideClass); + if (params.animation === false) { + params.showClass = { + backdrop: 'swal2-noanimation' + }; + params.hideClass = {}; + } + return params; +}; + +/** + * @param {SweetAlert} instance + * @returns {DomCache} + */ +const populateDomCache = instance => { + const domCache = /** @type {DomCache} */{ + popup: (/** @type {HTMLElement} */getPopup()), + container: (/** @type {HTMLElement} */getContainer()), + actions: (/** @type {HTMLElement} */getActions()), + confirmButton: (/** @type {HTMLElement} */getConfirmButton()), + denyButton: (/** @type {HTMLElement} */getDenyButton()), + cancelButton: (/** @type {HTMLElement} */getCancelButton()), + loader: (/** @type {HTMLElement} */getLoader()), + closeButton: (/** @type {HTMLElement} */getCloseButton()), + validationMessage: (/** @type {HTMLElement} */getValidationMessage()), + progressSteps: (/** @type {HTMLElement} */getProgressSteps()) + }; + privateProps.domCache.set(instance, domCache); + return domCache; +}; + +/** + * @param {GlobalState} globalState + * @param {SweetAlertOptions} innerParams + * @param {(dismiss: DismissReason) => void} dismissWith + */ +const setupTimer = (globalState, innerParams, dismissWith) => { + const timerProgressBar = getTimerProgressBar(); + hide(timerProgressBar); + if (innerParams.timer) { + globalState.timeout = new Timer(() => { + dismissWith('timer'); + delete globalState.timeout; + }, innerParams.timer); + if (innerParams.timerProgressBar && timerProgressBar) { + show(timerProgressBar); + applyCustomClass(timerProgressBar, innerParams, 'timerProgressBar'); + setTimeout(() => { + if (globalState.timeout && globalState.timeout.running) { + // timer can be already stopped or unset at this point + animateTimerProgressBar(/** @type {number} */innerParams.timer); + } + }); + } + } +}; + +/** + * Initialize focus in the popup: + * + * 1. If `toast` is `true`, don't steal focus from the document. + * 2. Else if there is an [autofocus] element, focus it. + * 3. Else if `focusConfirm` is `true` and confirm button is visible, focus it. + * 4. Else if `focusDeny` is `true` and deny button is visible, focus it. + * 5. Else if `focusCancel` is `true` and cancel button is visible, focus it. + * 6. Else focus the first focusable element in a popup (if any). + * + * @param {DomCache} domCache + * @param {SweetAlertOptions} innerParams + */ +const initFocus = (domCache, innerParams) => { + if (innerParams.toast) { + return; + } + // TODO: this is dumb, remove `allowEnterKey` param in the next major version + if (!callIfFunction(innerParams.allowEnterKey)) { + warnAboutDeprecation('allowEnterKey'); + blurActiveElement(); + return; + } + if (focusAutofocus(domCache)) { + return; + } + if (focusButton(domCache, innerParams)) { + return; + } + setFocus(-1, 1); +}; + +/** + * @param {DomCache} domCache + * @returns {boolean} + */ +const focusAutofocus = domCache => { + const autofocusElements = Array.from(domCache.popup.querySelectorAll('[autofocus]')); + for (const autofocusElement of autofocusElements) { + if (autofocusElement instanceof HTMLElement && isVisible$1(autofocusElement)) { + autofocusElement.focus(); + return true; + } + } + return false; +}; + +/** + * @param {DomCache} domCache + * @param {SweetAlertOptions} innerParams + * @returns {boolean} + */ +const focusButton = (domCache, innerParams) => { + if (innerParams.focusDeny && isVisible$1(domCache.denyButton)) { + domCache.denyButton.focus(); + return true; + } + if (innerParams.focusCancel && isVisible$1(domCache.cancelButton)) { + domCache.cancelButton.focus(); + return true; + } + if (innerParams.focusConfirm && isVisible$1(domCache.confirmButton)) { + domCache.confirmButton.focus(); + return true; + } + return false; +}; +const blurActiveElement = () => { + if (document.activeElement instanceof HTMLElement && typeof document.activeElement.blur === 'function') { + document.activeElement.blur(); + } +}; + +// Assign instance methods from src/instanceMethods/*.js to prototype +SweetAlert.prototype.disableButtons = disableButtons; +SweetAlert.prototype.enableButtons = enableButtons; +SweetAlert.prototype.getInput = getInput; +SweetAlert.prototype.disableInput = disableInput; +SweetAlert.prototype.enableInput = enableInput; +SweetAlert.prototype.hideLoading = hideLoading; +SweetAlert.prototype.disableLoading = hideLoading; +SweetAlert.prototype.showValidationMessage = showValidationMessage; +SweetAlert.prototype.resetValidationMessage = resetValidationMessage; +SweetAlert.prototype.close = close; +SweetAlert.prototype.closePopup = close; +SweetAlert.prototype.closeModal = close; +SweetAlert.prototype.closeToast = close; +SweetAlert.prototype.rejectPromise = rejectPromise; +SweetAlert.prototype.update = update; +SweetAlert.prototype._destroy = _destroy; + +// Assign static methods from src/staticMethods/*.js to constructor +Object.assign(SweetAlert, staticMethods); + +// Proxy to instance methods to constructor, for now, for backwards compatibility +Object.keys(instanceMethods).forEach(key => { + /** + * @param {...(SweetAlertOptions | string | undefined)} args + * @returns {SweetAlertResult | Promise | undefined} + */ + // @ts-ignore: Dynamic property assignment for backwards compatibility + SweetAlert[key] = function (...args) { + // @ts-ignore + if (currentInstance && currentInstance[key]) { + // @ts-ignore + return currentInstance[key](...args); + } + return undefined; + }; +}); +SweetAlert.DismissReason = DismissReason; +SweetAlert.version = '11.26.18'; + +const Swal = SweetAlert; +// @ts-ignore +Swal.default = Swal; + +export { Swal as default }; +"undefined"!=typeof document&&function(e,t){var n=e.createElement("style");if(e.getElementsByTagName("head")[0].appendChild(n),n.styleSheet)n.styleSheet.disabled||(n.styleSheet.cssText=t);else try{n.innerHTML=t}catch(e){n.innerText=t}}(document,":root{--swal2-outline: 0 0 0 3px rgba(100, 150, 200, 0.5);--swal2-container-padding: 0.625em;--swal2-backdrop: rgba(0, 0, 0, 0.4);--swal2-backdrop-transition: background-color 0.15s;--swal2-width: 32em;--swal2-padding: 0 0 1.25em;--swal2-border: none;--swal2-border-radius: 0.3125rem;--swal2-background: white;--swal2-color: #545454;--swal2-show-animation: swal2-show 0.3s;--swal2-hide-animation: swal2-hide 0.15s forwards;--swal2-icon-zoom: 1;--swal2-icon-animations: true;--swal2-title-padding: 0.8em 1em 0;--swal2-html-container-padding: 1em 1.6em 0.3em;--swal2-input-border: 1px solid #d9d9d9;--swal2-input-border-radius: 0.1875em;--swal2-input-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.06), 0 0 0 3px transparent;--swal2-input-background: transparent;--swal2-input-transition: border-color 0.2s, box-shadow 0.2s;--swal2-input-hover-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.06), 0 0 0 3px transparent;--swal2-input-focus-border: 1px solid #b4dbed;--swal2-input-focus-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.06), 0 0 0 3px rgba(100, 150, 200, 0.5);--swal2-progress-step-background: #add8e6;--swal2-validation-message-background: #f0f0f0;--swal2-validation-message-color: #666;--swal2-footer-border-color: #eee;--swal2-footer-background: transparent;--swal2-footer-color: inherit;--swal2-timer-progress-bar-background: rgba(0, 0, 0, 0.3);--swal2-close-button-position: initial;--swal2-close-button-inset: auto;--swal2-close-button-font-size: 2.5em;--swal2-close-button-color: #ccc;--swal2-close-button-transition: color 0.2s, box-shadow 0.2s;--swal2-close-button-outline: initial;--swal2-close-button-box-shadow: inset 0 0 0 3px transparent;--swal2-close-button-focus-box-shadow: inset var(--swal2-outline);--swal2-close-button-hover-transform: none;--swal2-actions-justify-content: center;--swal2-actions-width: auto;--swal2-actions-margin: 1.25em auto 0;--swal2-actions-padding: 0;--swal2-actions-border-radius: 0;--swal2-actions-background: transparent;--swal2-action-button-transition: background-color 0.2s, box-shadow 0.2s;--swal2-action-button-hover: black 10%;--swal2-action-button-active: black 10%;--swal2-confirm-button-box-shadow: none;--swal2-confirm-button-border-radius: 0.25em;--swal2-confirm-button-background-color: #7066e0;--swal2-confirm-button-color: #fff;--swal2-deny-button-box-shadow: none;--swal2-deny-button-border-radius: 0.25em;--swal2-deny-button-background-color: #dc3741;--swal2-deny-button-color: #fff;--swal2-cancel-button-box-shadow: none;--swal2-cancel-button-border-radius: 0.25em;--swal2-cancel-button-background-color: #6e7881;--swal2-cancel-button-color: #fff;--swal2-toast-show-animation: swal2-toast-show 0.5s;--swal2-toast-hide-animation: swal2-toast-hide 0.1s forwards;--swal2-toast-border: none;--swal2-toast-box-shadow: 0 0 1px hsl(0deg 0% 0% / 0.075), 0 1px 2px hsl(0deg 0% 0% / 0.075), 1px 2px 4px hsl(0deg 0% 0% / 0.075), 1px 3px 8px hsl(0deg 0% 0% / 0.075), 2px 4px 16px hsl(0deg 0% 0% / 0.075)}[data-swal2-theme=dark]{--swal2-dark-theme-black: #19191a;--swal2-dark-theme-white: #e1e1e1;--swal2-background: var(--swal2-dark-theme-black);--swal2-color: var(--swal2-dark-theme-white);--swal2-footer-border-color: #555;--swal2-input-background: color-mix(in srgb, var(--swal2-dark-theme-black), var(--swal2-dark-theme-white) 10%);--swal2-validation-message-background: color-mix( in srgb, var(--swal2-dark-theme-black), var(--swal2-dark-theme-white) 10% );--swal2-validation-message-color: var(--swal2-dark-theme-white);--swal2-timer-progress-bar-background: rgba(255, 255, 255, 0.7)}@media(prefers-color-scheme: dark){[data-swal2-theme=auto]{--swal2-dark-theme-black: #19191a;--swal2-dark-theme-white: #e1e1e1;--swal2-background: var(--swal2-dark-theme-black);--swal2-color: var(--swal2-dark-theme-white);--swal2-footer-border-color: #555;--swal2-input-background: color-mix(in srgb, var(--swal2-dark-theme-black), var(--swal2-dark-theme-white) 10%);--swal2-validation-message-background: color-mix( in srgb, var(--swal2-dark-theme-black), var(--swal2-dark-theme-white) 10% );--swal2-validation-message-color: var(--swal2-dark-theme-white);--swal2-timer-progress-bar-background: rgba(255, 255, 255, 0.7)}}body.swal2-shown:not(.swal2-no-backdrop,.swal2-toast-shown){overflow:hidden}body.swal2-height-auto{height:auto !important}body.swal2-no-backdrop .swal2-container{background-color:rgba(0,0,0,0) !important;pointer-events:none}body.swal2-no-backdrop .swal2-container .swal2-popup{pointer-events:all}body.swal2-no-backdrop .swal2-container .swal2-modal{box-shadow:0 0 10px var(--swal2-backdrop)}body.swal2-toast-shown .swal2-container{box-sizing:border-box;width:360px;max-width:100%;background-color:rgba(0,0,0,0);pointer-events:none}body.swal2-toast-shown .swal2-container.swal2-top{inset:0 auto auto 50%;transform:translateX(-50%)}body.swal2-toast-shown .swal2-container.swal2-top-end,body.swal2-toast-shown .swal2-container.swal2-top-right{inset:0 0 auto auto}body.swal2-toast-shown .swal2-container.swal2-top-start,body.swal2-toast-shown .swal2-container.swal2-top-left{inset:0 auto auto 0}body.swal2-toast-shown .swal2-container.swal2-center-start,body.swal2-toast-shown .swal2-container.swal2-center-left{inset:50% auto auto 0;transform:translateY(-50%)}body.swal2-toast-shown .swal2-container.swal2-center{inset:50% auto auto 50%;transform:translate(-50%, -50%)}body.swal2-toast-shown .swal2-container.swal2-center-end,body.swal2-toast-shown .swal2-container.swal2-center-right{inset:50% 0 auto auto;transform:translateY(-50%)}body.swal2-toast-shown .swal2-container.swal2-bottom-start,body.swal2-toast-shown .swal2-container.swal2-bottom-left{inset:auto auto 0 0}body.swal2-toast-shown .swal2-container.swal2-bottom{inset:auto auto 0 50%;transform:translateX(-50%)}body.swal2-toast-shown .swal2-container.swal2-bottom-end,body.swal2-toast-shown .swal2-container.swal2-bottom-right{inset:auto 0 0 auto}@media print{body.swal2-shown:not(.swal2-no-backdrop,.swal2-toast-shown){overflow-y:scroll !important}body.swal2-shown:not(.swal2-no-backdrop,.swal2-toast-shown)>[aria-hidden=true]{display:none}body.swal2-shown:not(.swal2-no-backdrop,.swal2-toast-shown) .swal2-container{position:static !important}}div:where(.swal2-container){display:grid;position:fixed;z-index:1060;inset:0;box-sizing:border-box;grid-template-areas:\"top-start top top-end\" \"center-start center center-end\" \"bottom-start bottom-center bottom-end\";grid-template-rows:minmax(min-content, auto) minmax(min-content, auto) minmax(min-content, auto);height:100%;padding:var(--swal2-container-padding);overflow-x:hidden;transition:var(--swal2-backdrop-transition);-webkit-overflow-scrolling:touch}div:where(.swal2-container).swal2-backdrop-show,div:where(.swal2-container).swal2-noanimation{background:var(--swal2-backdrop)}div:where(.swal2-container).swal2-backdrop-hide{background:rgba(0,0,0,0) !important}div:where(.swal2-container).swal2-top-start,div:where(.swal2-container).swal2-center-start,div:where(.swal2-container).swal2-bottom-start{grid-template-columns:minmax(0, 1fr) auto auto}div:where(.swal2-container).swal2-top,div:where(.swal2-container).swal2-center,div:where(.swal2-container).swal2-bottom{grid-template-columns:auto minmax(0, 1fr) auto}div:where(.swal2-container).swal2-top-end,div:where(.swal2-container).swal2-center-end,div:where(.swal2-container).swal2-bottom-end{grid-template-columns:auto auto minmax(0, 1fr)}div:where(.swal2-container).swal2-top-start>.swal2-popup{align-self:start}div:where(.swal2-container).swal2-top>.swal2-popup{grid-column:2;place-self:start center}div:where(.swal2-container).swal2-top-end>.swal2-popup,div:where(.swal2-container).swal2-top-right>.swal2-popup{grid-column:3;place-self:start end}div:where(.swal2-container).swal2-center-start>.swal2-popup,div:where(.swal2-container).swal2-center-left>.swal2-popup{grid-row:2;align-self:center}div:where(.swal2-container).swal2-center>.swal2-popup{grid-column:2;grid-row:2;place-self:center center}div:where(.swal2-container).swal2-center-end>.swal2-popup,div:where(.swal2-container).swal2-center-right>.swal2-popup{grid-column:3;grid-row:2;place-self:center end}div:where(.swal2-container).swal2-bottom-start>.swal2-popup,div:where(.swal2-container).swal2-bottom-left>.swal2-popup{grid-column:1;grid-row:3;align-self:end}div:where(.swal2-container).swal2-bottom>.swal2-popup{grid-column:2;grid-row:3;place-self:end center}div:where(.swal2-container).swal2-bottom-end>.swal2-popup,div:where(.swal2-container).swal2-bottom-right>.swal2-popup{grid-column:3;grid-row:3;place-self:end end}div:where(.swal2-container).swal2-grow-row>.swal2-popup,div:where(.swal2-container).swal2-grow-fullscreen>.swal2-popup{grid-column:1/4;width:100%}div:where(.swal2-container).swal2-grow-column>.swal2-popup,div:where(.swal2-container).swal2-grow-fullscreen>.swal2-popup{grid-row:1/4;align-self:stretch}div:where(.swal2-container).swal2-no-transition{transition:none !important}div:where(.swal2-container)[popover]{width:auto;border:0}div:where(.swal2-container) div:where(.swal2-popup){display:none;position:relative;box-sizing:border-box;grid-template-columns:minmax(0, 100%);width:var(--swal2-width);max-width:100%;padding:var(--swal2-padding);border:var(--swal2-border);border-radius:var(--swal2-border-radius);background:var(--swal2-background);color:var(--swal2-color);font-family:inherit;font-size:1rem;container-name:swal2-popup}div:where(.swal2-container) div:where(.swal2-popup):focus{outline:none}div:where(.swal2-container) div:where(.swal2-popup).swal2-loading{overflow-y:hidden}div:where(.swal2-container) div:where(.swal2-popup).swal2-draggable{cursor:grab}div:where(.swal2-container) div:where(.swal2-popup).swal2-draggable div:where(.swal2-icon){cursor:grab}div:where(.swal2-container) div:where(.swal2-popup).swal2-dragging{cursor:grabbing}div:where(.swal2-container) div:where(.swal2-popup).swal2-dragging div:where(.swal2-icon){cursor:grabbing}div:where(.swal2-container) h2:where(.swal2-title){position:relative;max-width:100%;margin:0;padding:var(--swal2-title-padding);color:inherit;font-size:1.875em;font-weight:600;text-align:center;text-transform:none;overflow-wrap:break-word;cursor:initial}div:where(.swal2-container) div:where(.swal2-actions){display:flex;z-index:1;box-sizing:border-box;flex-wrap:wrap;align-items:center;justify-content:var(--swal2-actions-justify-content);width:var(--swal2-actions-width);margin:var(--swal2-actions-margin);padding:var(--swal2-actions-padding);border-radius:var(--swal2-actions-border-radius);background:var(--swal2-actions-background)}div:where(.swal2-container) div:where(.swal2-loader){display:none;align-items:center;justify-content:center;width:2.2em;height:2.2em;margin:0 1.875em;animation:swal2-rotate-loading 1.5s linear 0s infinite normal;border-width:.25em;border-style:solid;border-radius:100%;border-color:#2778c4 rgba(0,0,0,0) #2778c4 rgba(0,0,0,0)}div:where(.swal2-container) button:where(.swal2-styled){margin:.3125em;padding:.625em 1.1em;transition:var(--swal2-action-button-transition);border:none;box-shadow:0 0 0 3px rgba(0,0,0,0);font-weight:500}div:where(.swal2-container) button:where(.swal2-styled):not([disabled]){cursor:pointer}div:where(.swal2-container) button:where(.swal2-styled):where(.swal2-confirm){border-radius:var(--swal2-confirm-button-border-radius);background:initial;background-color:var(--swal2-confirm-button-background-color);box-shadow:var(--swal2-confirm-button-box-shadow);color:var(--swal2-confirm-button-color);font-size:1em}div:where(.swal2-container) button:where(.swal2-styled):where(.swal2-confirm):hover{background-color:color-mix(in srgb, var(--swal2-confirm-button-background-color), var(--swal2-action-button-hover))}div:where(.swal2-container) button:where(.swal2-styled):where(.swal2-confirm):active{background-color:color-mix(in srgb, var(--swal2-confirm-button-background-color), var(--swal2-action-button-active))}div:where(.swal2-container) button:where(.swal2-styled):where(.swal2-deny){border-radius:var(--swal2-deny-button-border-radius);background:initial;background-color:var(--swal2-deny-button-background-color);box-shadow:var(--swal2-deny-button-box-shadow);color:var(--swal2-deny-button-color);font-size:1em}div:where(.swal2-container) button:where(.swal2-styled):where(.swal2-deny):hover{background-color:color-mix(in srgb, var(--swal2-deny-button-background-color), var(--swal2-action-button-hover))}div:where(.swal2-container) button:where(.swal2-styled):where(.swal2-deny):active{background-color:color-mix(in srgb, var(--swal2-deny-button-background-color), var(--swal2-action-button-active))}div:where(.swal2-container) button:where(.swal2-styled):where(.swal2-cancel){border-radius:var(--swal2-cancel-button-border-radius);background:initial;background-color:var(--swal2-cancel-button-background-color);box-shadow:var(--swal2-cancel-button-box-shadow);color:var(--swal2-cancel-button-color);font-size:1em}div:where(.swal2-container) button:where(.swal2-styled):where(.swal2-cancel):hover{background-color:color-mix(in srgb, var(--swal2-cancel-button-background-color), var(--swal2-action-button-hover))}div:where(.swal2-container) button:where(.swal2-styled):where(.swal2-cancel):active{background-color:color-mix(in srgb, var(--swal2-cancel-button-background-color), var(--swal2-action-button-active))}div:where(.swal2-container) button:where(.swal2-styled):focus-visible{outline:none;box-shadow:var(--swal2-action-button-focus-box-shadow)}div:where(.swal2-container) button:where(.swal2-styled)[disabled]:not(.swal2-loading){opacity:.4}div:where(.swal2-container) button:where(.swal2-styled)::-moz-focus-inner{border:0}div:where(.swal2-container) div:where(.swal2-footer){margin:1em 0 0;padding:1em 1em 0;border-top:1px solid var(--swal2-footer-border-color);background:var(--swal2-footer-background);color:var(--swal2-footer-color);font-size:1em;text-align:center;cursor:initial}div:where(.swal2-container) .swal2-timer-progress-bar-container{position:absolute;right:0;bottom:0;left:0;grid-column:auto !important;overflow:hidden;border-bottom-right-radius:var(--swal2-border-radius);border-bottom-left-radius:var(--swal2-border-radius)}div:where(.swal2-container) div:where(.swal2-timer-progress-bar){width:100%;height:.25em;background:var(--swal2-timer-progress-bar-background)}div:where(.swal2-container) img:where(.swal2-image){max-width:100%;margin:2em auto 1em;cursor:initial}div:where(.swal2-container) button:where(.swal2-close){position:var(--swal2-close-button-position);inset:var(--swal2-close-button-inset);z-index:2;align-items:center;justify-content:center;width:1.2em;height:1.2em;margin-top:0;margin-right:0;margin-bottom:-1.2em;padding:0;overflow:hidden;transition:var(--swal2-close-button-transition);border:none;border-radius:var(--swal2-border-radius);outline:var(--swal2-close-button-outline);background:rgba(0,0,0,0);color:var(--swal2-close-button-color);font-family:monospace;font-size:var(--swal2-close-button-font-size);cursor:pointer;justify-self:end}div:where(.swal2-container) button:where(.swal2-close):hover{transform:var(--swal2-close-button-hover-transform);background:rgba(0,0,0,0);color:#f27474}div:where(.swal2-container) button:where(.swal2-close):focus-visible{outline:none;box-shadow:var(--swal2-close-button-focus-box-shadow)}div:where(.swal2-container) button:where(.swal2-close)::-moz-focus-inner{border:0}div:where(.swal2-container) div:where(.swal2-html-container){z-index:1;justify-content:center;margin:0;padding:var(--swal2-html-container-padding);overflow:auto;color:inherit;font-size:1.125em;font-weight:normal;line-height:normal;text-align:center;overflow-wrap:break-word;word-break:break-word;cursor:initial}div:where(.swal2-container) input:where(.swal2-input),div:where(.swal2-container) input:where(.swal2-file),div:where(.swal2-container) textarea:where(.swal2-textarea),div:where(.swal2-container) select:where(.swal2-select),div:where(.swal2-container) div:where(.swal2-radio),div:where(.swal2-container) label:where(.swal2-checkbox){margin:1em 2em 3px}div:where(.swal2-container) input:where(.swal2-input),div:where(.swal2-container) input:where(.swal2-file),div:where(.swal2-container) textarea:where(.swal2-textarea){box-sizing:border-box;width:auto;transition:var(--swal2-input-transition);border:var(--swal2-input-border);border-radius:var(--swal2-input-border-radius);background:var(--swal2-input-background);box-shadow:var(--swal2-input-box-shadow);color:inherit;font-size:1.125em}div:where(.swal2-container) input:where(.swal2-input).swal2-inputerror,div:where(.swal2-container) input:where(.swal2-file).swal2-inputerror,div:where(.swal2-container) textarea:where(.swal2-textarea).swal2-inputerror{border-color:#f27474 !important;box-shadow:0 0 2px #f27474 !important}div:where(.swal2-container) input:where(.swal2-input):hover,div:where(.swal2-container) input:where(.swal2-file):hover,div:where(.swal2-container) textarea:where(.swal2-textarea):hover{box-shadow:var(--swal2-input-hover-box-shadow)}div:where(.swal2-container) input:where(.swal2-input):focus,div:where(.swal2-container) input:where(.swal2-file):focus,div:where(.swal2-container) textarea:where(.swal2-textarea):focus{border:var(--swal2-input-focus-border);outline:none;box-shadow:var(--swal2-input-focus-box-shadow)}div:where(.swal2-container) input:where(.swal2-input)::placeholder,div:where(.swal2-container) input:where(.swal2-file)::placeholder,div:where(.swal2-container) textarea:where(.swal2-textarea)::placeholder{color:#ccc}div:where(.swal2-container) .swal2-range{margin:1em 2em 3px;background:var(--swal2-background)}div:where(.swal2-container) .swal2-range input{width:80%}div:where(.swal2-container) .swal2-range output{width:20%;color:inherit;font-weight:600;text-align:center}div:where(.swal2-container) .swal2-range input,div:where(.swal2-container) .swal2-range output{height:2.625em;padding:0;font-size:1.125em;line-height:2.625em}div:where(.swal2-container) .swal2-input{height:2.625em;padding:0 .75em}div:where(.swal2-container) .swal2-file{width:75%;margin-right:auto;margin-left:auto;background:var(--swal2-input-background);font-size:1.125em}div:where(.swal2-container) .swal2-textarea{height:6.75em;padding:.75em}div:where(.swal2-container) .swal2-select{min-width:50%;max-width:100%;padding:.375em .625em;background:var(--swal2-input-background);color:inherit;font-size:1.125em}div:where(.swal2-container) .swal2-radio,div:where(.swal2-container) .swal2-checkbox{align-items:center;justify-content:center;background:var(--swal2-background);color:inherit}div:where(.swal2-container) .swal2-radio label,div:where(.swal2-container) .swal2-checkbox label{margin:0 .6em;font-size:1.125em}div:where(.swal2-container) .swal2-radio input,div:where(.swal2-container) .swal2-checkbox input{flex-shrink:0;margin:0 .4em}div:where(.swal2-container) label:where(.swal2-input-label){display:flex;justify-content:center;margin:1em auto 0}div:where(.swal2-container) div:where(.swal2-validation-message){align-items:center;justify-content:center;margin:1em 0 0;padding:.625em;overflow:hidden;background:var(--swal2-validation-message-background);color:var(--swal2-validation-message-color);font-size:1em;font-weight:300}div:where(.swal2-container) div:where(.swal2-validation-message)::before{content:\"!\";display:inline-block;width:1.5em;min-width:1.5em;height:1.5em;margin:0 .625em;border-radius:50%;background-color:#f27474;color:#fff;font-weight:600;line-height:1.5em;text-align:center}div:where(.swal2-container) .swal2-progress-steps{flex-wrap:wrap;align-items:center;max-width:100%;margin:1.25em auto;padding:0;background:rgba(0,0,0,0);font-weight:600}div:where(.swal2-container) .swal2-progress-steps li{display:inline-block;position:relative}div:where(.swal2-container) .swal2-progress-steps .swal2-progress-step{z-index:20;flex-shrink:0;width:2em;height:2em;border-radius:2em;background:#2778c4;color:#fff;line-height:2em;text-align:center}div:where(.swal2-container) .swal2-progress-steps .swal2-progress-step.swal2-active-progress-step{background:#2778c4}div:where(.swal2-container) .swal2-progress-steps .swal2-progress-step.swal2-active-progress-step~.swal2-progress-step{background:var(--swal2-progress-step-background);color:#fff}div:where(.swal2-container) .swal2-progress-steps .swal2-progress-step.swal2-active-progress-step~.swal2-progress-step-line{background:var(--swal2-progress-step-background)}div:where(.swal2-container) .swal2-progress-steps .swal2-progress-step-line{z-index:10;flex-shrink:0;width:2.5em;height:.4em;margin:0 -1px;background:#2778c4}div:where(.swal2-icon){position:relative;box-sizing:content-box;justify-content:center;width:5em;height:5em;margin:2.5em auto .6em;zoom:var(--swal2-icon-zoom);border:.25em solid rgba(0,0,0,0);border-radius:50%;border-color:#000;font-family:inherit;line-height:5em;cursor:default;user-select:none}div:where(.swal2-icon) .swal2-icon-content{display:flex;align-items:center;font-size:3.75em}div:where(.swal2-icon).swal2-error{border-color:#f27474;color:#f27474}div:where(.swal2-icon).swal2-error .swal2-x-mark{position:relative;flex-grow:1}div:where(.swal2-icon).swal2-error [class^=swal2-x-mark-line]{display:block;position:absolute;top:2.3125em;width:2.9375em;height:.3125em;border-radius:.125em;background-color:#f27474}div:where(.swal2-icon).swal2-error [class^=swal2-x-mark-line][class$=left]{left:1.0625em;transform:rotate(45deg)}div:where(.swal2-icon).swal2-error [class^=swal2-x-mark-line][class$=right]{right:1em;transform:rotate(-45deg)}@container swal2-popup style(--swal2-icon-animations:true){div:where(.swal2-icon).swal2-error.swal2-icon-show{animation:swal2-animate-error-icon .5s}div:where(.swal2-icon).swal2-error.swal2-icon-show .swal2-x-mark{animation:swal2-animate-error-x-mark .5s}}div:where(.swal2-icon).swal2-warning{border-color:#f8bb86;color:#f8bb86}@container swal2-popup style(--swal2-icon-animations:true){div:where(.swal2-icon).swal2-warning.swal2-icon-show{animation:swal2-animate-error-icon .5s}div:where(.swal2-icon).swal2-warning.swal2-icon-show .swal2-icon-content{animation:swal2-animate-i-mark .5s}}div:where(.swal2-icon).swal2-info{border-color:#3fc3ee;color:#3fc3ee}@container swal2-popup style(--swal2-icon-animations:true){div:where(.swal2-icon).swal2-info.swal2-icon-show{animation:swal2-animate-error-icon .5s}div:where(.swal2-icon).swal2-info.swal2-icon-show .swal2-icon-content{animation:swal2-animate-i-mark .8s}}div:where(.swal2-icon).swal2-question{border-color:#87adbd;color:#87adbd}@container swal2-popup style(--swal2-icon-animations:true){div:where(.swal2-icon).swal2-question.swal2-icon-show{animation:swal2-animate-error-icon .5s}div:where(.swal2-icon).swal2-question.swal2-icon-show .swal2-icon-content{animation:swal2-animate-question-mark .8s}}div:where(.swal2-icon).swal2-success{border-color:#a5dc86;color:#a5dc86}div:where(.swal2-icon).swal2-success [class^=swal2-success-circular-line]{position:absolute;width:3.75em;height:7.5em;border-radius:50%}div:where(.swal2-icon).swal2-success [class^=swal2-success-circular-line][class$=left]{top:-0.4375em;left:-2.0635em;transform:rotate(-45deg);transform-origin:3.75em 3.75em;border-radius:7.5em 0 0 7.5em}div:where(.swal2-icon).swal2-success [class^=swal2-success-circular-line][class$=right]{top:-0.6875em;left:1.875em;transform:rotate(-45deg);transform-origin:0 3.75em;border-radius:0 7.5em 7.5em 0}div:where(.swal2-icon).swal2-success .swal2-success-ring{position:absolute;z-index:2;top:-0.25em;left:-0.25em;box-sizing:content-box;width:100%;height:100%;border:.25em solid rgba(165,220,134,.3);border-radius:50%}div:where(.swal2-icon).swal2-success .swal2-success-fix{position:absolute;z-index:1;top:.5em;left:1.625em;width:.4375em;height:5.625em;transform:rotate(-45deg)}div:where(.swal2-icon).swal2-success [class^=swal2-success-line]{display:block;position:absolute;z-index:2;height:.3125em;border-radius:.125em;background-color:#a5dc86}div:where(.swal2-icon).swal2-success [class^=swal2-success-line][class$=tip]{top:2.875em;left:.8125em;width:1.5625em;transform:rotate(45deg)}div:where(.swal2-icon).swal2-success [class^=swal2-success-line][class$=long]{top:2.375em;right:.5em;width:2.9375em;transform:rotate(-45deg)}@container swal2-popup style(--swal2-icon-animations:true){div:where(.swal2-icon).swal2-success.swal2-icon-show .swal2-success-line-tip{animation:swal2-animate-success-line-tip .75s}div:where(.swal2-icon).swal2-success.swal2-icon-show .swal2-success-line-long{animation:swal2-animate-success-line-long .75s}div:where(.swal2-icon).swal2-success.swal2-icon-show .swal2-success-circular-line-right{animation:swal2-rotate-success-circular-line 4.25s ease-in}}[class^=swal2]{-webkit-tap-highlight-color:rgba(0,0,0,0)}.swal2-show{animation:var(--swal2-show-animation)}.swal2-hide{animation:var(--swal2-hide-animation)}.swal2-noanimation{transition:none}.swal2-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}.swal2-rtl .swal2-close{margin-right:initial;margin-left:0}.swal2-rtl .swal2-timer-progress-bar{right:0;left:auto}.swal2-toast{box-sizing:border-box;grid-column:1/4 !important;grid-row:1/4 !important;grid-template-columns:min-content auto min-content;padding:1em;overflow-y:hidden;border:var(--swal2-toast-border);background:var(--swal2-background);box-shadow:var(--swal2-toast-box-shadow);pointer-events:all}.swal2-toast>*{grid-column:2}.swal2-toast h2:where(.swal2-title){margin:.5em 1em;padding:0;font-size:1em;text-align:initial}.swal2-toast .swal2-loading{justify-content:center}.swal2-toast input:where(.swal2-input){height:2em;margin:.5em;font-size:1em}.swal2-toast .swal2-validation-message{font-size:1em}.swal2-toast div:where(.swal2-footer){margin:.5em 0 0;padding:.5em 0 0;font-size:.8em}.swal2-toast button:where(.swal2-close){grid-column:3/3;grid-row:1/99;align-self:center;width:.8em;height:.8em;margin:0;font-size:2em}.swal2-toast div:where(.swal2-html-container){margin:.5em 1em;padding:0;overflow:initial;font-size:1em;text-align:initial}.swal2-toast div:where(.swal2-html-container):empty{padding:0}.swal2-toast .swal2-loader{grid-column:1;grid-row:1/99;align-self:center;width:2em;height:2em;margin:.25em}.swal2-toast .swal2-icon{grid-column:1;grid-row:1/99;align-self:center;width:2em;min-width:2em;height:2em;margin:0 .5em 0 0}.swal2-toast .swal2-icon .swal2-icon-content{display:flex;align-items:center;font-size:1.8em;font-weight:bold}.swal2-toast .swal2-icon.swal2-success .swal2-success-ring{width:2em;height:2em}.swal2-toast .swal2-icon.swal2-error [class^=swal2-x-mark-line]{top:.875em;width:1.375em}.swal2-toast .swal2-icon.swal2-error [class^=swal2-x-mark-line][class$=left]{left:.3125em}.swal2-toast .swal2-icon.swal2-error [class^=swal2-x-mark-line][class$=right]{right:.3125em}.swal2-toast div:where(.swal2-actions){justify-content:flex-start;height:auto;margin:0;margin-top:.5em;padding:0 .5em}.swal2-toast button:where(.swal2-styled){margin:.25em .5em;padding:.4em .6em;font-size:1em}.swal2-toast .swal2-success{border-color:#a5dc86}.swal2-toast .swal2-success [class^=swal2-success-circular-line]{position:absolute;width:1.6em;height:3em;border-radius:50%}.swal2-toast .swal2-success [class^=swal2-success-circular-line][class$=left]{top:-0.8em;left:-0.5em;transform:rotate(-45deg);transform-origin:2em 2em;border-radius:4em 0 0 4em}.swal2-toast .swal2-success [class^=swal2-success-circular-line][class$=right]{top:-0.25em;left:.9375em;transform-origin:0 1.5em;border-radius:0 4em 4em 0}.swal2-toast .swal2-success .swal2-success-ring{width:2em;height:2em}.swal2-toast .swal2-success .swal2-success-fix{top:0;left:.4375em;width:.4375em;height:2.6875em}.swal2-toast .swal2-success [class^=swal2-success-line]{height:.3125em}.swal2-toast .swal2-success [class^=swal2-success-line][class$=tip]{top:1.125em;left:.1875em;width:.75em}.swal2-toast .swal2-success [class^=swal2-success-line][class$=long]{top:.9375em;right:.1875em;width:1.375em}@container swal2-popup style(--swal2-icon-animations:true){.swal2-toast .swal2-success.swal2-icon-show .swal2-success-line-tip{animation:swal2-toast-animate-success-line-tip .75s}.swal2-toast .swal2-success.swal2-icon-show .swal2-success-line-long{animation:swal2-toast-animate-success-line-long .75s}}.swal2-toast.swal2-show{animation:var(--swal2-toast-show-animation)}.swal2-toast.swal2-hide{animation:var(--swal2-toast-hide-animation)}@keyframes swal2-show{0%{transform:translate3d(0, -50px, 0) scale(0.9);opacity:0}100%{transform:translate3d(0, 0, 0) scale(1);opacity:1}}@keyframes swal2-hide{0%{transform:translate3d(0, 0, 0) scale(1);opacity:1}100%{transform:translate3d(0, -50px, 0) scale(0.9);opacity:0}}@keyframes swal2-animate-success-line-tip{0%{top:1.1875em;left:.0625em;width:0}54%{top:1.0625em;left:.125em;width:0}70%{top:2.1875em;left:-0.375em;width:3.125em}84%{top:3em;left:1.3125em;width:1.0625em}100%{top:2.8125em;left:.8125em;width:1.5625em}}@keyframes swal2-animate-success-line-long{0%{top:3.375em;right:2.875em;width:0}65%{top:3.375em;right:2.875em;width:0}84%{top:2.1875em;right:0;width:3.4375em}100%{top:2.375em;right:.5em;width:2.9375em}}@keyframes swal2-rotate-success-circular-line{0%{transform:rotate(-45deg)}5%{transform:rotate(-45deg)}12%{transform:rotate(-405deg)}100%{transform:rotate(-405deg)}}@keyframes swal2-animate-error-x-mark{0%{margin-top:1.625em;transform:scale(0.4);opacity:0}50%{margin-top:1.625em;transform:scale(0.4);opacity:0}80%{margin-top:-0.375em;transform:scale(1.15)}100%{margin-top:0;transform:scale(1);opacity:1}}@keyframes swal2-animate-error-icon{0%{transform:rotateX(100deg);opacity:0}100%{transform:rotateX(0deg);opacity:1}}@keyframes swal2-rotate-loading{0%{transform:rotate(0deg)}100%{transform:rotate(360deg)}}@keyframes swal2-animate-question-mark{0%{transform:rotateY(-360deg)}100%{transform:rotateY(0)}}@keyframes swal2-animate-i-mark{0%{transform:rotateZ(45deg);opacity:0}25%{transform:rotateZ(-25deg);opacity:.4}50%{transform:rotateZ(15deg);opacity:.8}75%{transform:rotateZ(-5deg);opacity:1}100%{transform:rotateX(0);opacity:1}}@keyframes swal2-toast-show{0%{transform:translateY(-0.625em) rotateZ(2deg)}33%{transform:translateY(0) rotateZ(-2deg)}66%{transform:translateY(0.3125em) rotateZ(2deg)}100%{transform:translateY(0) rotateZ(0deg)}}@keyframes swal2-toast-hide{100%{transform:rotateZ(1deg);opacity:0}}@keyframes swal2-toast-animate-success-line-tip{0%{top:.5625em;left:.0625em;width:0}54%{top:.125em;left:.125em;width:0}70%{top:.625em;left:-0.25em;width:1.625em}84%{top:1.0625em;left:.75em;width:.5em}100%{top:1.125em;left:.1875em;width:.75em}}@keyframes swal2-toast-animate-success-line-long{0%{top:1.625em;right:1.375em;width:0}65%{top:1.25em;right:.9375em;width:0}84%{top:.9375em;right:0;width:1.125em}100%{top:.9375em;right:.1875em;width:1.375em}}"); \ No newline at end of file diff --git a/public/assets/sweetalert2/dist/sweetalert2.esm.all.min.js b/public/assets/sweetalert2/dist/sweetalert2.esm.all.min.js new file mode 100644 index 0000000..0afda18 --- /dev/null +++ b/public/assets/sweetalert2/dist/sweetalert2.esm.all.min.js @@ -0,0 +1,6 @@ +/*! +* sweetalert2 v11.26.18 +* Released under the MIT License. +*/ +function e(e,t,n){if("function"==typeof e?e===t:e.has(t))return arguments.length<3?t:n;throw new TypeError("Private element is not present on this object")}function t(t,n){return t.get(e(t,n))}function n(e,t,n){(function(e,t){if(t.has(e))throw new TypeError("Cannot initialize the same private elements twice on an object")})(e,t),t.set(e,n)}const o={},i=e=>new Promise(t=>{if(!e)return t();const n=window.scrollX,i=window.scrollY;o.restoreFocusTimeout=setTimeout(()=>{o.previousActiveElement instanceof HTMLElement?(o.previousActiveElement.focus(),o.previousActiveElement=null):document.body&&document.body.focus(),t()},100),window.scrollTo(n,i)}),r="swal2-",s=["container","shown","height-auto","iosfix","popup","modal","no-backdrop","no-transition","toast","toast-shown","show","hide","close","title","html-container","actions","confirm","deny","cancel","footer","icon","icon-content","image","input","file","range","select","radio","checkbox","label","textarea","inputerror","input-label","validation-message","progress-steps","active-progress-step","progress-step","progress-step-line","loader","loading","styled","top","top-start","top-end","top-left","top-right","center","center-start","center-end","center-left","center-right","bottom","bottom-start","bottom-end","bottom-left","bottom-right","grow-row","grow-column","grow-fullscreen","rtl","timer-progress-bar","timer-progress-bar-container","scrollbar-measure","icon-success","icon-warning","icon-info","icon-question","icon-error","draggable","dragging"].reduce((e,t)=>(e[t]=r+t,e),{}),a=["success","warning","info","question","error"].reduce((e,t)=>(e[t]=r+t,e),{}),l="SweetAlert2:",c=e=>e.charAt(0).toUpperCase()+e.slice(1),u=e=>{console.warn(`${l} ${"object"==typeof e?e.join(" "):e}`)},d=e=>{console.error(`${l} ${e}`)},p=[],m=(e,t=null)=>{var n;n=`"${e}" is deprecated and will be removed in the next major release.${t?` Use "${t}" instead.`:""}`,p.includes(n)||(p.push(n),u(n))},h=e=>"function"==typeof e?e():e,g=e=>e&&"function"==typeof e.toPromise,f=e=>g(e)?e.toPromise():Promise.resolve(e),b=e=>e&&Promise.resolve(e)===e,y=()=>document.body.querySelector(`.${s.container}`),v=e=>{const t=y();return t?t.querySelector(e):null},w=e=>v(`.${e}`),C=()=>w(s.popup),A=()=>w(s.icon),E=()=>w(s.title),k=()=>w(s["html-container"]),B=()=>w(s.image),$=()=>w(s["progress-steps"]),L=()=>w(s["validation-message"]),P=()=>v(`.${s.actions} .${s.confirm}`),x=()=>v(`.${s.actions} .${s.cancel}`),T=()=>v(`.${s.actions} .${s.deny}`),S=()=>v(`.${s.loader}`),O=()=>w(s.actions),M=()=>w(s.footer),j=()=>w(s["timer-progress-bar"]),H=()=>w(s.close),I=()=>{const e=C();if(!e)return[];const t=e.querySelectorAll('[tabindex]:not([tabindex="-1"]):not([tabindex="0"])'),n=Array.from(t).sort((e,t)=>{const n=parseInt(e.getAttribute("tabindex")||"0"),o=parseInt(t.getAttribute("tabindex")||"0");return n>o?1:n"-1"!==e.getAttribute("tabindex"));return[...new Set(n.concat(i))].filter(e=>ee(e))},D=()=>N(document.body,s.shown)&&!N(document.body,s["toast-shown"])&&!N(document.body,s["no-backdrop"]),V=()=>{const e=C();return!!e&&N(e,s.toast)},q=(e,t)=>{if(e.textContent="",t){const n=(new DOMParser).parseFromString(t,"text/html"),o=n.querySelector("head");o&&Array.from(o.childNodes).forEach(t=>{e.appendChild(t)});const i=n.querySelector("body");i&&Array.from(i.childNodes).forEach(t=>{t instanceof HTMLVideoElement||t instanceof HTMLAudioElement?e.appendChild(t.cloneNode(!0)):e.appendChild(t)})}},N=(e,t)=>{if(!t)return!1;const n=t.split(/\s+/);for(let t=0;t{if(((e,t)=>{Array.from(e.classList).forEach(n=>{Object.values(s).includes(n)||Object.values(a).includes(n)||Object.values(t.showClass||{}).includes(n)||e.classList.remove(n)})})(e,t),!t.customClass)return;const o=t.customClass[n];o&&("string"==typeof o||o.forEach?z(e,o):u(`Invalid type of customClass.${n}! Expected string or iterable object, got "${typeof o}"`))},R=(e,t)=>{if(!t)return null;switch(t){case"select":case"textarea":case"file":return e.querySelector(`.${s.popup} > .${s[t]}`);case"checkbox":return e.querySelector(`.${s.popup} > .${s.checkbox} input`);case"radio":return e.querySelector(`.${s.popup} > .${s.radio} input:checked`)||e.querySelector(`.${s.popup} > .${s.radio} input:first-child`);case"range":return e.querySelector(`.${s.popup} > .${s.range} input`);default:return e.querySelector(`.${s.popup} > .${s.input}`)}},F=e=>{if(e.focus(),"file"!==e.type){const t=e.value;e.value="",e.value=t}},U=(e,t,n)=>{e&&t&&("string"==typeof t&&(t=t.split(/\s+/).filter(Boolean)),t.forEach(t=>{Array.isArray(e)?e.forEach(e=>{n?e.classList.add(t):e.classList.remove(t)}):n?e.classList.add(t):e.classList.remove(t)}))},z=(e,t)=>{U(e,t,!0)},W=(e,t)=>{U(e,t,!1)},K=(e,t)=>{const n=Array.from(e.children);for(let e=0;e{n===`${parseInt(`${n}`)}`&&(n=parseInt(n)),n||0===parseInt(`${n}`)?e.style.setProperty(t,"number"==typeof n?`${n}px`:n):e.style.removeProperty(t)},X=(e,t="flex")=>{e&&(e.style.display=t)},Z=e=>{e&&(e.style.display="none")},J=(e,t="block")=>{e&&new MutationObserver(()=>{Q(e,e.innerHTML,t)}).observe(e,{childList:!0,subtree:!0})},G=(e,t,n,o)=>{const i=e.querySelector(t);i&&i.style.setProperty(n,o)},Q=(e,t,n="flex")=>{t?X(e,n):Z(e)},ee=e=>Boolean(e&&(e.offsetWidth||e.offsetHeight||e.getClientRects().length)),te=e=>Boolean(e.scrollHeight>e.clientHeight),ne=e=>{const t=window.getComputedStyle(e),n=parseFloat(t.getPropertyValue("animation-duration")||"0"),o=parseFloat(t.getPropertyValue("transition-duration")||"0");return n>0||o>0},oe=(e,t=!1)=>{const n=j();n&&ee(n)&&(t&&(n.style.transition="none",n.style.width="100%"),setTimeout(()=>{n.style.transition=`width ${e/1e3}s linear`,n.style.width="0%"},10))},ie=`\n
          \n \n
            \n
            \n \n

            \n
            \n \n \n
            \n \n \n
            \n \n
            \n \n \n
            \n
            \n
            \n \n \n \n
            \n
            \n
            \n
            \n
            \n
            \n`.replace(/(^|\n)\s*/g,""),re=()=>{o.currentInstance&&o.currentInstance.resetValidationMessage()},se=e=>{const t=(()=>{const e=y();return!!e&&(e.remove(),W([document.documentElement,document.body],[s["no-backdrop"],s["toast-shown"],s["has-column"]]),!0)})();if("undefined"==typeof window||"undefined"==typeof document)return void d("SweetAlert2 requires document to initialize");const n=document.createElement("div");n.className=s.container,t&&z(n,s["no-transition"]),q(n,ie),n.dataset.swal2Theme=e.theme;const i=(e=>{if("string"==typeof e){const t=document.querySelector(e);if(!t)throw new Error(`Target element "${e}" not found`);return t}return e})(e.target||"body");i.appendChild(n),e.topLayer&&(n.setAttribute("popover",""),n.showPopover()),(e=>{const t=C();t&&(t.setAttribute("role",e.toast?"alert":"dialog"),t.setAttribute("aria-live",e.toast?"polite":"assertive"),e.toast||t.setAttribute("aria-modal","true"))})(e),(e=>{"rtl"===window.getComputedStyle(e).direction&&(z(y(),s.rtl),o.isRTL=!0)})(i),(()=>{const e=C();if(!e)return;const t=K(e,s.input),n=K(e,s.file),o=e.querySelector(`.${s.range} input`),i=e.querySelector(`.${s.range} output`),r=K(e,s.select),a=e.querySelector(`.${s.checkbox} input`),l=K(e,s.textarea);t&&(t.oninput=re),n&&(n.onchange=re),r&&(r.onchange=re),a&&(a.onchange=re),l&&(l.oninput=re),o&&i&&(o.oninput=()=>{re(),i.value=o.value},o.onchange=()=>{re(),i.value=o.value})})()},ae=(e,t)=>{e instanceof HTMLElement?t.appendChild(e):"object"==typeof e?le(e,t):e&&q(t,e)},le=(e,t)=>{"jquery"in e?ce(t,e):q(t,e.toString())},ce=(e,t)=>{if(e.textContent="",0 in t)for(let n=0;n in t;n++)e.appendChild(t[n].cloneNode(!0));else e.appendChild(t.cloneNode(!0))},ue=(e,t)=>{const n=O(),o=S();n&&o&&(t.showConfirmButton||t.showDenyButton||t.showCancelButton?X(n):Z(n),_(n,t,"actions"),function(e,t,n){const o=P(),i=T(),r=x();if(!o||!i||!r)return;pe(o,"confirm",n),pe(i,"deny",n),pe(r,"cancel",n),function(e,t,n,o){if(!o.buttonsStyling)return void W([e,t,n],s.styled);z([e,t,n],s.styled),o.confirmButtonColor&&e.style.setProperty("--swal2-confirm-button-background-color",o.confirmButtonColor);o.denyButtonColor&&t.style.setProperty("--swal2-deny-button-background-color",o.denyButtonColor);o.cancelButtonColor&&n.style.setProperty("--swal2-cancel-button-background-color",o.cancelButtonColor);de(e),de(t),de(n)}(o,i,r,n),n.reverseButtons&&(n.toast?(e.insertBefore(r,o),e.insertBefore(i,o)):(e.insertBefore(r,t),e.insertBefore(i,t),e.insertBefore(o,t)))}(n,o,t),q(o,t.loaderHtml||""),_(o,t,"loader"))};function de(e){const t=window.getComputedStyle(e);if(t.getPropertyValue("--swal2-action-button-focus-box-shadow"))return;const n=t.backgroundColor.replace(/rgba?\((\d+), (\d+), (\d+).*/,"rgba($1, $2, $3, 0.5)");e.style.setProperty("--swal2-action-button-focus-box-shadow",t.getPropertyValue("--swal2-outline").replace(/ rgba\(.*/,` ${n}`))}function pe(e,t,n){const o=c(t);Q(e,n[`show${o}Button`],"inline-block"),q(e,n[`${t}ButtonText`]||""),e.setAttribute("aria-label",n[`${t}ButtonAriaLabel`]||""),e.className=s[t],_(e,n,`${t}Button`)}const me=(e,t)=>{const n=y();n&&(!function(e,t){"string"==typeof t?e.style.background=t:t||z([document.documentElement,document.body],s["no-backdrop"])}(n,t.backdrop),function(e,t){if(!t)return;t in s?z(e,s[t]):(u('The "position" parameter is not valid, defaulting to "center"'),z(e,s.center))}(n,t.position),function(e,t){if(!t)return;z(e,s[`grow-${t}`])}(n,t.grow),_(n,t,"container"))};var he={innerParams:new WeakMap,domCache:new WeakMap};const ge=["input","file","range","select","radio","checkbox","textarea"],fe=e=>{if(!e.input)return;if(!Ee[e.input])return void d(`Unexpected type of input! Expected ${Object.keys(Ee).join(" | ")}, got "${e.input}"`);const t=Ce(e.input);if(!t)return;const n=Ee[e.input](t,e);X(t),e.inputAutoFocus&&setTimeout(()=>{F(n)})},be=(e,t)=>{const n=C();if(!n)return;const o=R(n,e);if(o){(e=>{for(let t=0;t{if(!e.input)return;const t=Ce(e.input);t&&_(t,e,"input")},ve=(e,t)=>{!e.placeholder&&t.inputPlaceholder&&(e.placeholder=t.inputPlaceholder)},we=(e,t,n)=>{if(n.inputLabel){const o=document.createElement("label"),i=s["input-label"];o.setAttribute("for",e.id),o.className=i,"object"==typeof n.customClass&&z(o,n.customClass.inputLabel),o.innerText=n.inputLabel,t.insertAdjacentElement("beforebegin",o)}},Ce=e=>{const t=C();if(t)return K(t,s[e]||s.input)},Ae=(e,t)=>{["string","number"].includes(typeof t)?e.value=`${t}`:b(t)||u(`Unexpected type of inputValue! Expected "string", "number" or "Promise", got "${typeof t}"`)},Ee={};Ee.text=Ee.email=Ee.password=Ee.number=Ee.tel=Ee.url=Ee.search=Ee.date=Ee["datetime-local"]=Ee.time=Ee.week=Ee.month=(e,t)=>{const n=e;return Ae(n,t.inputValue),we(n,n,t),ve(n,t),n.type=t.input,n},Ee.file=(e,t)=>{const n=e;return we(n,n,t),ve(n,t),n},Ee.range=(e,t)=>{const n=e,o=n.querySelector("input"),i=n.querySelector("output");return o&&(Ae(o,t.inputValue),o.type=t.input,we(o,e,t)),i&&Ae(i,t.inputValue),e},Ee.select=(e,t)=>{const n=e;if(n.textContent="",t.inputPlaceholder){const e=document.createElement("option");q(e,t.inputPlaceholder),e.value="",e.disabled=!0,e.selected=!0,n.appendChild(e)}return we(n,n,t),n},Ee.radio=e=>(e.textContent="",e),Ee.checkbox=(e,t)=>{const n=C();if(!n)throw new Error("Popup not found");const o=R(n,"checkbox");if(!o)throw new Error("Checkbox input not found");o.value="1",o.checked=Boolean(t.inputValue);const i=e.querySelector("span");if(i){const e=t.inputPlaceholder||t.inputLabel;e&&q(i,e)}return o},Ee.textarea=(e,t)=>{const n=e;Ae(n,t.inputValue),ve(n,t),we(n,n,t);return setTimeout(()=>{if("MutationObserver"in window){const e=C();if(!e)return;const o=parseInt(window.getComputedStyle(e).width);new MutationObserver(()=>{if(!document.body.contains(n))return;const e=n.offsetWidth+(i=n,parseInt(window.getComputedStyle(i).marginLeft)+parseInt(window.getComputedStyle(i).marginRight));var i;const r=C();r&&(e>o?r.style.width=`${e}px`:Y(r,"width",t.width))}).observe(n,{attributes:!0,attributeFilter:["style"]})}}),n};const ke=(e,t)=>{const n=k();n&&(J(n),_(n,t,"htmlContainer"),t.html?(ae(t.html,n),X(n,"block")):t.text?(n.textContent=t.text,X(n,"block")):Z(n),((e,t)=>{const n=C();if(!n)return;const o=he.innerParams.get(e),i=!o||t.input!==o.input;ge.forEach(e=>{const o=K(n,s[e]);o&&(be(e,t.inputAttributes),o.className=s[e],i&&Z(o))}),t.input&&(i&&fe(t),ye(t))})(e,t))},Be=(e,t)=>{for(const[n,o]of Object.entries(a))t.icon!==n&&W(e,o);z(e,t.icon&&a[t.icon]),Pe(e,t),$e(),_(e,t,"icon")},$e=()=>{const e=C();if(!e)return;const t=window.getComputedStyle(e).getPropertyValue("background-color"),n=e.querySelectorAll("[class^=swal2-success-circular-line], .swal2-success-fix");for(let e=0;e{if(!t.icon&&!t.iconHtml)return;let n=e.innerHTML,o="";if(t.iconHtml)o=xe(t.iconHtml);else if("success"===t.icon)o=(e=>`\n ${e.animation?'
            ':""}\n \n
            \n ${e.animation?'
            ':""}\n ${e.animation?'
            ':""}\n`)(t),n=n.replace(/ style=".*?"/g,"");else if("error"===t.icon)o='\n \n \n \n \n';else if(t.icon){o=xe({question:"?",warning:"!",info:"i"}[t.icon])}n.trim()!==o.trim()&&q(e,o)},Pe=(e,t)=>{if(t.iconColor){e.style.color=t.iconColor,e.style.borderColor=t.iconColor;for(const n of[".swal2-success-line-tip",".swal2-success-line-long",".swal2-x-mark-line-left",".swal2-x-mark-line-right"])G(e,n,"background-color",t.iconColor);G(e,".swal2-success-ring","border-color",t.iconColor)}},xe=e=>`
            ${e}
            `;let Te=!1,Se=0,Oe=0,Me=0,je=0;const He=e=>{const t=C();if(!t)return;const n=A();if(e.target===t||n&&n.contains(e.target)){Te=!0;const n=Ve(e);Se=n.clientX,Oe=n.clientY,Me=parseInt(t.style.insetInlineStart)||0,je=parseInt(t.style.insetBlockStart)||0,z(t,"swal2-dragging")}},Ie=e=>{const t=C();if(t&&Te){let{clientX:n,clientY:i}=Ve(e);const r=n-Se;t.style.insetInlineStart=`${Me+(o.isRTL?-r:r)}px`,t.style.insetBlockStart=`${je+(i-Oe)}px`}},De=()=>{const e=C();Te=!1,W(e,"swal2-dragging")},Ve=e=>{let t=0,n=0;return e.type.startsWith("mouse")?(t=e.clientX,n=e.clientY):e.type.startsWith("touch")&&(t=e.touches[0].clientX,n=e.touches[0].clientY),{clientX:t,clientY:n}},qe=(e,t)=>{const n=y(),o=C();if(n&&o){if(t.toast){Y(n,"width",t.width),o.style.width="100%";const e=S();e&&o.insertBefore(e,A())}else Y(o,"width",t.width);Y(o,"padding",t.padding),t.color&&(o.style.color=t.color),t.background&&(o.style.background=t.background),Z(L()),Ne(o,t),t.draggable&&!t.toast?(z(o,s.draggable),(e=>{e.addEventListener("mousedown",He),document.body.addEventListener("mousemove",Ie),e.addEventListener("mouseup",De),e.addEventListener("touchstart",He),document.body.addEventListener("touchmove",Ie),e.addEventListener("touchend",De)})(o)):(W(o,s.draggable),(e=>{e.removeEventListener("mousedown",He),document.body.removeEventListener("mousemove",Ie),e.removeEventListener("mouseup",De),e.removeEventListener("touchstart",He),document.body.removeEventListener("touchmove",Ie),e.removeEventListener("touchend",De)})(o))}},Ne=(e,t)=>{const n=t.showClass||{};e.className=`${s.popup} ${ee(e)?n.popup:""}`,t.toast?(z([document.documentElement,document.body],s["toast-shown"]),z(e,s.toast)):z(e,s.modal),_(e,t,"popup"),"string"==typeof t.customClass&&z(e,t.customClass),t.icon&&z(e,s[`icon-${t.icon}`])},_e=e=>{const t=document.createElement("li");return z(t,s["progress-step"]),q(t,e),t},Re=e=>{const t=document.createElement("li");return z(t,s["progress-step-line"]),e.progressStepsDistance&&Y(t,"width",e.progressStepsDistance),t},Fe=(e,t)=>{var n;qe(0,t),me(0,t),((e,t)=>{const n=$();if(!n)return;const{progressSteps:o,currentProgressStep:i}=t;o&&0!==o.length&&void 0!==i?(X(n),n.textContent="",i>=o.length&&u("Invalid currentProgressStep parameter, it should be less than progressSteps.length (currentProgressStep like JS arrays starts from 0)"),o.forEach((e,r)=>{const a=_e(e);if(n.appendChild(a),r===i&&z(a,s["active-progress-step"]),r!==o.length-1){const e=Re(t);n.appendChild(e)}})):Z(n)})(0,t),((e,t)=>{const n=he.innerParams.get(e),o=A();if(!o)return;if(n&&t.icon===n.icon)return Le(o,t),void Be(o,t);if(!t.icon&&!t.iconHtml)return void Z(o);if(t.icon&&-1===Object.keys(a).indexOf(t.icon))return d(`Unknown icon! Expected "success", "error", "warning", "info" or "question", got "${t.icon}"`),void Z(o);X(o),Le(o,t),Be(o,t),z(o,t.showClass&&t.showClass.icon),window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change",$e)})(e,t),((e,t)=>{const n=B();n&&(t.imageUrl?(X(n,""),n.setAttribute("src",t.imageUrl),n.setAttribute("alt",t.imageAlt||""),Y(n,"width",t.imageWidth),Y(n,"height",t.imageHeight),n.className=s.image,_(n,t,"image")):Z(n))})(0,t),((e,t)=>{const n=E();n&&(J(n),Q(n,Boolean(t.title||t.titleText),"block"),t.title&&ae(t.title,n),t.titleText&&(n.innerText=t.titleText),_(n,t,"title"))})(0,t),((e,t)=>{const n=H();n&&(q(n,t.closeButtonHtml||""),_(n,t,"closeButton"),Q(n,t.showCloseButton),n.setAttribute("aria-label",t.closeButtonAriaLabel||""))})(0,t),ke(e,t),ue(0,t),((e,t)=>{const n=M();n&&(J(n),Q(n,Boolean(t.footer),"block"),t.footer&&ae(t.footer,n),_(n,t,"footer"))})(0,t);const i=C();"function"==typeof t.didRender&&i&&t.didRender(i),null===(n=o.eventEmitter)||void 0===n||n.emit("didRender",i)},Ue=()=>{var e;return null===(e=P())||void 0===e?void 0:e.click()},ze=Object.freeze({cancel:"cancel",backdrop:"backdrop",close:"close",esc:"esc",timer:"timer"}),We=e=>{if(e.keydownTarget&&e.keydownHandlerAdded&&e.keydownHandler){const t=e.keydownHandler;e.keydownTarget.removeEventListener("keydown",t,{capture:e.keydownListenerCapture}),e.keydownHandlerAdded=!1}},Ke=(e,t)=>{var n;const o=I();if(o.length)return-2===(e+=t)&&(e=o.length-1),e===o.length?e=0:-1===e&&(e=o.length-1),void o[e].focus();null===(n=C())||void 0===n||n.focus()},Ye=["ArrowRight","ArrowDown"],Xe=["ArrowLeft","ArrowUp"],Ze=(e,t,n)=>{e&&(t.isComposing||229===t.keyCode||(e.stopKeydownPropagation&&t.stopPropagation(),"Enter"===t.key?Je(t,e):"Tab"===t.key?Ge(t):[...Ye,...Xe].includes(t.key)?Qe(t.key):"Escape"===t.key&&et(t,e,n)))},Je=(e,t)=>{if(!h(t.allowEnterKey))return;const n=C();if(!n||!t.input)return;const o=R(n,t.input);if(e.target&&o&&e.target instanceof HTMLElement&&e.target.outerHTML===o.outerHTML){if(["textarea","file"].includes(t.input))return;Ue(),e.preventDefault()}},Ge=e=>{const t=e.target,n=I();let o=-1;for(let e=0;e{const t=O(),n=P(),o=T(),i=x();if(!(t&&n&&o&&i))return;const r=[n,o,i];if(document.activeElement instanceof HTMLElement&&!r.includes(document.activeElement))return;const s=Ye.includes(e)?"nextElementSibling":"previousElementSibling";let a=document.activeElement;if(a){for(let e=0;e{e.preventDefault(),h(t.allowEscapeKey)&&n(ze.esc)};var tt={swalPromiseResolve:new WeakMap,swalPromiseReject:new WeakMap};const nt=()=>{Array.from(document.body.children).forEach(e=>{e.hasAttribute("data-previous-aria-hidden")?(e.setAttribute("aria-hidden",e.getAttribute("data-previous-aria-hidden")||""),e.removeAttribute("data-previous-aria-hidden")):e.removeAttribute("aria-hidden")})},ot="undefined"!=typeof window&&Boolean(window.GestureEvent),it=()=>{const e=y();if(!e)return;let t;e.ontouchstart=e=>{t=rt(e)},e.ontouchmove=e=>{t&&(e.preventDefault(),e.stopPropagation())}},rt=e=>{const t=e.target,n=y(),o=k();return!(!n||!o)&&(!st(e)&&!at(e)&&(t===n||!(te(n)||!(t instanceof HTMLElement)||((e,t)=>{let n=e;for(;n&&n!==t;){if(te(n))return!0;n=n.parentElement}return!1})(t,o)||"INPUT"===t.tagName||"TEXTAREA"===t.tagName||te(o)&&o.contains(t))))},st=e=>Boolean(e.touches&&e.touches.length&&"stylus"===e.touches[0].touchType),at=e=>e.touches&&e.touches.length>1;let lt=null;const ct=e=>{null===lt&&(document.body.scrollHeight>window.innerHeight||"scroll"===e)&&(lt=parseInt(window.getComputedStyle(document.body).getPropertyValue("padding-right")),document.body.style.paddingRight=`${lt+(()=>{const e=document.createElement("div");e.className=s["scrollbar-measure"],document.body.appendChild(e);const t=e.getBoundingClientRect().width-e.clientWidth;return document.body.removeChild(e),t})()}px`)};function ut(e,t,n,r){V()?yt(e,r):(i(n).then(()=>yt(e,r)),We(o)),ot?(t.setAttribute("style","display:none !important"),t.removeAttribute("class"),t.innerHTML=""):t.remove(),D()&&(null!==lt&&(document.body.style.paddingRight=`${lt}px`,lt=null),(()=>{if(N(document.body,s.iosfix)){const e=parseInt(document.body.style.top,10);W(document.body,s.iosfix),document.body.style.top="",document.body.scrollTop=-1*e}})(),nt()),W([document.documentElement,document.body],[s.shown,s["height-auto"],s["no-backdrop"],s["toast-shown"]])}function dt(e){e=gt(e);const t=tt.swalPromiseResolve.get(this),n=pt(this);this.isAwaitingPromise?e.isDismissed||(ht(this),t(e)):n&&t(e)}const pt=e=>{const t=C();if(!t)return!1;const n=he.innerParams.get(e);if(!n||N(t,n.hideClass.popup))return!1;W(t,n.showClass.popup),z(t,n.hideClass.popup);const o=y();return W(o,n.showClass.backdrop),z(o,n.hideClass.backdrop),ft(e,t,n),!0};function mt(e){const t=tt.swalPromiseReject.get(this);ht(this),t&&t(e)}const ht=e=>{e.isAwaitingPromise&&(delete e.isAwaitingPromise,he.innerParams.get(e)||e._destroy())},gt=e=>void 0===e?{isConfirmed:!1,isDenied:!1,isDismissed:!0}:Object.assign({isConfirmed:!1,isDenied:!1,isDismissed:!1},e),ft=(e,t,n)=>{var i;const r=y(),s=ne(t);"function"==typeof n.willClose&&n.willClose(t),null===(i=o.eventEmitter)||void 0===i||i.emit("willClose",t),s&&r?bt(e,t,r,Boolean(n.returnFocus),n.didClose):r&&ut(e,r,Boolean(n.returnFocus),n.didClose)},bt=(e,t,n,i,r)=>{o.swalCloseEventFinishedCallback=ut.bind(null,e,n,i,r);const s=function(e){var n;e.target===t&&(null===(n=o.swalCloseEventFinishedCallback)||void 0===n||n.call(o),delete o.swalCloseEventFinishedCallback,t.removeEventListener("animationend",s),t.removeEventListener("transitionend",s))};t.addEventListener("animationend",s),t.addEventListener("transitionend",s)},yt=(e,t)=>{setTimeout(()=>{var n;"function"==typeof t&&t.bind(e.params)(),null===(n=o.eventEmitter)||void 0===n||n.emit("didClose"),e._destroy&&e._destroy()})},vt=e=>{let t=C();if(t||new Qn,t=C(),!t)return;const n=S();V()?Z(A()):wt(t,e),X(n),t.setAttribute("data-loading","true"),t.setAttribute("aria-busy","true"),t.focus()},wt=(e,t)=>{const n=O(),o=S();n&&o&&(!t&&ee(P())&&(t=P()),X(n),t&&(Z(t),o.setAttribute("data-button-to-replace",t.className),n.insertBefore(o,t)),z([e,n],s.loading))},Ct=e=>e.checked?1:0,At=e=>e.checked?e.value:null,Et=e=>e.files&&e.files.length?null!==e.getAttribute("multiple")?e.files:e.files[0]:null,kt=(e,t)=>{const n=C();if(!n)return;const o=e=>{"select"===t.input?function(e,t,n){const o=K(e,s.select);if(!o)return;const i=(e,t,o)=>{const i=document.createElement("option");i.value=o,q(i,t),i.selected=Lt(o,n.inputValue),e.appendChild(i)};t.forEach(e=>{const t=e[0],n=e[1];if(Array.isArray(n)){const e=document.createElement("optgroup");e.label=t,e.disabled=!1,o.appendChild(e),n.forEach(t=>i(e,t[1],t[0]))}else i(o,n,t)}),o.focus()}(n,$t(e),t):"radio"===t.input&&function(e,t,n){const o=K(e,s.radio);if(!o)return;t.forEach(e=>{const t=e[0],i=e[1],r=document.createElement("input"),a=document.createElement("label");r.type="radio",r.name=s.radio,r.value=t,Lt(t,n.inputValue)&&(r.checked=!0);const l=document.createElement("span");q(l,i),l.className=s.label,a.appendChild(r),a.appendChild(l),o.appendChild(a)});const i=o.querySelectorAll("input");i.length&&i[0].focus()}(n,$t(e),t)};g(t.inputOptions)||b(t.inputOptions)?(vt(P()),f(t.inputOptions).then(t=>{e.hideLoading(),o(t)})):"object"==typeof t.inputOptions?o(t.inputOptions):d("Unexpected type of inputOptions! Expected object, Map or Promise, got "+typeof t.inputOptions)},Bt=(e,t)=>{const n=e.getInput();n&&(Z(n),f(t.inputValue).then(o=>{n.value="number"===t.input?`${parseFloat(o)||0}`:`${o}`,X(n),n.focus(),e.hideLoading()}).catch(t=>{d(`Error in inputValue promise: ${t}`),n.value="",X(n),n.focus(),e.hideLoading()}))};const $t=e=>{const t=[];return e instanceof Map?e.forEach((e,n)=>{let o=e;"object"==typeof o&&(o=$t(o)),t.push([n,o])}):Object.keys(e).forEach(n=>{let o=e[n];"object"==typeof o&&(o=$t(o)),t.push([n,o])}),t},Lt=(e,t)=>Boolean(t)&&null!=t&&t.toString()===e.toString(),Pt=(e,t)=>{const n=he.innerParams.get(e);if(!n.input)return void d(`The "input" parameter is needed to be set when using returnInputValueOn${c(t)}`);const o=e.getInput(),i=((e,t)=>{const n=e.getInput();if(!n)return null;switch(t.input){case"checkbox":return Ct(n);case"radio":return At(n);case"file":return Et(n);default:return t.inputAutoTrim?n.value.trim():n.value}})(e,n);n.inputValidator?xt(e,i,t):o&&!o.checkValidity()?(e.enableButtons(),e.showValidationMessage(n.validationMessage||o.validationMessage)):"deny"===t?Tt(e,i):Mt(e,i)},xt=(e,t,n)=>{const o=he.innerParams.get(e);e.disableInput();Promise.resolve().then(()=>f(o.inputValidator(t,o.validationMessage))).then(o=>{e.enableButtons(),e.enableInput(),o?e.showValidationMessage(o):"deny"===n?Tt(e,t):Mt(e,t)})},Tt=(e,t)=>{const n=he.innerParams.get(e);if(n.showLoaderOnDeny&&vt(T()),n.preDeny){e.isAwaitingPromise=!0;Promise.resolve().then(()=>f(n.preDeny(t,n.validationMessage))).then(n=>{!1===n?(e.hideLoading(),ht(e)):e.close({isDenied:!0,value:void 0===n?t:n})}).catch(t=>Ot(e,t))}else e.close({isDenied:!0,value:t})},St=(e,t)=>{e.close({isConfirmed:!0,value:t})},Ot=(e,t)=>{e.rejectPromise(t)},Mt=(e,t)=>{const n=he.innerParams.get(e);if(n.showLoaderOnConfirm&&vt(),n.preConfirm){e.resetValidationMessage(),e.isAwaitingPromise=!0;Promise.resolve().then(()=>f(n.preConfirm(t,n.validationMessage))).then(n=>{ee(L())||!1===n?(e.hideLoading(),ht(e)):St(e,void 0===n?t:n)}).catch(t=>Ot(e,t))}else St(e,t)};function jt(){const e=he.innerParams.get(this);if(!e)return;const t=he.domCache.get(this);Z(t.loader),V()?e.icon&&X(A()):Ht(t),W([t.popup,t.actions],s.loading),t.popup.removeAttribute("aria-busy"),t.popup.removeAttribute("data-loading"),t.confirmButton.disabled=!1,t.denyButton.disabled=!1,t.cancelButton.disabled=!1}const Ht=e=>{const t=e.loader.getAttribute("data-button-to-replace"),n=t?e.popup.getElementsByClassName(t):[];n.length?X(n[0],"inline-block"):ee(P())||ee(T())||ee(x())||Z(e.actions)};function It(){const e=he.innerParams.get(this),t=he.domCache.get(this);return t?R(t.popup,e.input):null}function Dt(e,t,n){const o=he.domCache.get(e);t.forEach(e=>{o[e].disabled=n})}function Vt(e,t){const n=C();if(n&&e)if("radio"===e.type){const e=n.querySelectorAll(`[name="${s.radio}"]`);for(let n=0;nObject.prototype.hasOwnProperty.call(zt,e),Zt=e=>-1!==Wt.indexOf(e),Jt=e=>Kt[e],Gt=e=>{Xt(e)||u(`Unknown parameter "${e}"`)},Qt=e=>{Yt.includes(e)&&u(`The parameter "${e}" is incompatible with toasts`)},en=e=>{const t=Jt(e);t&&m(e,t)},tn=e=>{!1===e.backdrop&&e.allowOutsideClick&&u('"allowOutsideClick" parameter requires `backdrop` parameter to be set to `true`'),e.theme&&!["light","dark","auto","minimal","borderless","bootstrap-4","bootstrap-4-light","bootstrap-4-dark","bootstrap-5","bootstrap-5-light","bootstrap-5-dark","material-ui","material-ui-light","material-ui-dark","embed-iframe","bulma","bulma-light","bulma-dark"].includes(e.theme)&&u(`Invalid theme "${e.theme}"`);for(const t in e)Gt(t),e.toast&&Qt(t),en(t)};function nn(e){const t=y(),n=C(),o=he.innerParams.get(this);if(!n||N(n,o.hideClass.popup))return void u("You're trying to update the closed or closing popup, that won't work. Use the update() method in preConfirm parameter or show a new popup.");const i=on(e),r=Object.assign({},o,i);tn(r),t&&(t.dataset.swal2Theme=r.theme),Fe(this,r),he.innerParams.set(this,r),Object.defineProperties(this,{params:{value:Object.assign({},this.params,e),writable:!1,enumerable:!0}})}const on=e=>{const t={};return Object.keys(e).forEach(n=>{if(Zt(n)){const o=e;t[n]=o[n]}else u(`Invalid parameter to update: ${n}`)}),t};function rn(){var e;const t=he.domCache.get(this),n=he.innerParams.get(this);n?(t.popup&&o.swalCloseEventFinishedCallback&&(o.swalCloseEventFinishedCallback(),delete o.swalCloseEventFinishedCallback),"function"==typeof n.didDestroy&&n.didDestroy(),null===(e=o.eventEmitter)||void 0===e||e.emit("didDestroy"),sn(this)):an(this)}const sn=e=>{an(e),delete e.params,delete o.keydownHandler,delete o.keydownTarget,delete o.currentInstance},an=e=>{e.isAwaitingPromise?(ln(he,e),e.isAwaitingPromise=!0):(ln(tt,e),ln(he,e),delete e.isAwaitingPromise,delete e.disableButtons,delete e.enableButtons,delete e.getInput,delete e.disableInput,delete e.enableInput,delete e.hideLoading,delete e.disableLoading,delete e.showValidationMessage,delete e.resetValidationMessage,delete e.close,delete e.closePopup,delete e.closeModal,delete e.closeToast,delete e.rejectPromise,delete e.update,delete e._destroy)},ln=(e,t)=>{for(const n in e)e[n].delete(t)};var cn=Object.freeze({__proto__:null,_destroy:rn,close:dt,closeModal:dt,closePopup:dt,closeToast:dt,disableButtons:Nt,disableInput:Rt,disableLoading:jt,enableButtons:qt,enableInput:_t,getInput:It,handleAwaitingPromise:ht,hideLoading:jt,rejectPromise:mt,resetValidationMessage:Ut,showValidationMessage:Ft,update:nn});const un=(e,t,n)=>{t.popup.onclick=()=>{e&&(dn(e)||e.timer||e.input)||n(ze.close)}},dn=e=>Boolean(e.showConfirmButton||e.showDenyButton||e.showCancelButton||e.showCloseButton);let pn=!1;const mn=e=>{e.popup.onmousedown=()=>{e.container.onmouseup=function(t){e.container.onmouseup=()=>{},t.target===e.container&&(pn=!0)}}},hn=e=>{e.container.onmousedown=t=>{t.target===e.container&&t.preventDefault(),e.popup.onmouseup=function(t){e.popup.onmouseup=()=>{},(t.target===e.popup||t.target instanceof HTMLElement&&e.popup.contains(t.target))&&(pn=!0)}}},gn=(e,t,n)=>{t.container.onclick=o=>{pn?pn=!1:o.target===t.container&&h(e.allowOutsideClick)&&n(ze.backdrop)}},fn=e=>e instanceof Element||(e=>"object"==typeof e&&null!==e&&"jquery"in e)(e);const bn=()=>{if(o.timeout)return(()=>{const e=j();if(!e)return;const t=parseInt(window.getComputedStyle(e).width);e.style.removeProperty("transition"),e.style.width="100%";const n=t/parseInt(window.getComputedStyle(e).width)*100;e.style.width=`${n}%`})(),o.timeout.stop()},yn=()=>{if(o.timeout){const e=o.timeout.start();return oe(e),e}};let vn=!1;const wn={};const Cn=e=>{for(let t=e.target;t&&t!==document;t=t.parentNode)for(const e in wn){const n=t.getAttribute&&t.getAttribute(e);if(n)return void wn[e].fire({template:n})}};o.eventEmitter=new class{constructor(){this.events={}}_getHandlersByEventName(e){return void 0===this.events[e]&&(this.events[e]=[]),this.events[e]}on(e,t){const n=this._getHandlersByEventName(e);n.includes(t)||n.push(t)}once(e,t){const n=(...o)=>{this.removeListener(e,n),t.apply(this,o)};this.on(e,n)}emit(e,...t){this._getHandlersByEventName(e).forEach(e=>{try{e.apply(this,t)}catch(e){console.error(e)}})}removeListener(e,t){const n=this._getHandlersByEventName(e),o=n.indexOf(t);o>-1&&n.splice(o,1)}removeAllListeners(e){void 0!==this.events[e]&&(this.events[e].length=0)}reset(){this.events={}}};var An=Object.freeze({__proto__:null,argsToParams:e=>{const t={};return"object"!=typeof e[0]||fn(e[0])?["title","html","icon"].forEach((n,o)=>{const i=e[o];"string"==typeof i||fn(i)?t[n]=i:void 0!==i&&d(`Unexpected type of ${n}! Expected "string" or "Element", got ${typeof i}`)}):Object.assign(t,e[0]),t},bindClickHandler:function(e="data-swal-template"){wn[e]=this,vn||(document.body.addEventListener("click",Cn),vn=!0)},clickCancel:()=>{var e;return null===(e=x())||void 0===e?void 0:e.click()},clickConfirm:Ue,clickDeny:()=>{var e;return null===(e=T())||void 0===e?void 0:e.click()},enableLoading:vt,fire:function(...e){return new this(...e)},getActions:O,getCancelButton:x,getCloseButton:H,getConfirmButton:P,getContainer:y,getDenyButton:T,getFocusableElements:I,getFooter:M,getHtmlContainer:k,getIcon:A,getIconContent:()=>w(s["icon-content"]),getImage:B,getInputLabel:()=>w(s["input-label"]),getLoader:S,getPopup:C,getProgressSteps:$,getTimerLeft:()=>o.timeout&&o.timeout.getTimerLeft(),getTimerProgressBar:j,getTitle:E,getValidationMessage:L,increaseTimer:e=>{if(o.timeout){const t=o.timeout.increase(e);return oe(t,!0),t}},isDeprecatedParameter:Jt,isLoading:()=>{const e=C();return!!e&&e.hasAttribute("data-loading")},isTimerRunning:()=>Boolean(o.timeout&&o.timeout.isRunning()),isUpdatableParameter:Zt,isValidParameter:Xt,isVisible:()=>ee(C()),mixin:function(e){return class extends(this){_main(t,n){return super._main(t,Object.assign({},e,n))}}},off:(e,t)=>{o.eventEmitter&&(e?t?o.eventEmitter.removeListener(e,t):o.eventEmitter.removeAllListeners(e):o.eventEmitter.reset())},on:(e,t)=>{o.eventEmitter&&o.eventEmitter.on(e,t)},once:(e,t)=>{o.eventEmitter&&o.eventEmitter.once(e,t)},resumeTimer:yn,showLoading:vt,stopTimer:bn,toggleTimer:()=>{const e=o.timeout;return e&&(e.running?bn():yn())}});class En{constructor(e,t){this.callback=e,this.remaining=t,this.running=!1,this.start()}start(){return this.running||(this.running=!0,this.started=new Date,this.id=setTimeout(this.callback,this.remaining)),this.remaining}stop(){return this.started&&this.running&&(this.running=!1,clearTimeout(this.id),this.remaining-=(new Date).getTime()-this.started.getTime()),this.remaining}increase(e){const t=this.running;return t&&this.stop(),this.remaining+=e,t&&this.start(),this.remaining}getTimerLeft(){return this.running&&(this.stop(),this.start()),this.remaining}isRunning(){return this.running}}const kn=["swal-title","swal-html","swal-footer"],Bn=e=>{const t={};return Array.from(e.querySelectorAll("swal-param")).forEach(e=>{Mn(e,["name","value"]);const n=e.getAttribute("name"),o=e.getAttribute("value");n&&o&&(t[n]=n in zt&&"boolean"==typeof zt[n]?"false"!==o:n in zt&&"object"==typeof zt[n]?JSON.parse(o):o)}),t},$n=e=>{const t={};return Array.from(e.querySelectorAll("swal-function-param")).forEach(e=>{const n=e.getAttribute("name"),o=e.getAttribute("value");n&&o&&(t[n]=new Function(`return ${o}`)())}),t},Ln=e=>{const t={};return Array.from(e.querySelectorAll("swal-button")).forEach(e=>{Mn(e,["type","color","aria-label"]);const n=e.getAttribute("type");if(n&&["confirm","cancel","deny"].includes(n)){if(t[`${n}ButtonText`]=e.innerHTML,t[`show${c(n)}Button`]=!0,e.hasAttribute("color")){const o=e.getAttribute("color");null!==o&&(t[`${n}ButtonColor`]=o)}if(e.hasAttribute("aria-label")){const o=e.getAttribute("aria-label");null!==o&&(t[`${n}ButtonAriaLabel`]=o)}}}),t},Pn=e=>{const t={},n=e.querySelector("swal-image");return n&&(Mn(n,["src","width","height","alt"]),n.hasAttribute("src")&&(t.imageUrl=n.getAttribute("src")||void 0),n.hasAttribute("width")&&(t.imageWidth=n.getAttribute("width")||void 0),n.hasAttribute("height")&&(t.imageHeight=n.getAttribute("height")||void 0),n.hasAttribute("alt")&&(t.imageAlt=n.getAttribute("alt")||void 0)),t},xn=e=>{const t={},n=e.querySelector("swal-icon");return n&&(Mn(n,["type","color"]),n.hasAttribute("type")&&(t.icon=n.getAttribute("type")),n.hasAttribute("color")&&(t.iconColor=n.getAttribute("color")),t.iconHtml=n.innerHTML),t},Tn=e=>{const t={},n=e.querySelector("swal-input");n&&(Mn(n,["type","label","placeholder","value"]),t.input=n.getAttribute("type")||"text",n.hasAttribute("label")&&(t.inputLabel=n.getAttribute("label")),n.hasAttribute("placeholder")&&(t.inputPlaceholder=n.getAttribute("placeholder")),n.hasAttribute("value")&&(t.inputValue=n.getAttribute("value")));const o=Array.from(e.querySelectorAll("swal-input-option"));return o.length&&(t.inputOptions={},o.forEach(e=>{Mn(e,["value"]);const n=e.getAttribute("value");if(!n)return;const o=e.innerHTML;t.inputOptions[n]=o})),t},Sn=(e,t)=>{const n={};for(const o in t){const i=t[o],r=e.querySelector(i);r&&(Mn(r,[]),n[i.replace(/^swal-/,"")]=r.innerHTML.trim())}return n},On=e=>{const t=kn.concat(["swal-param","swal-function-param","swal-button","swal-image","swal-icon","swal-input","swal-input-option"]);Array.from(e.children).forEach(e=>{const n=e.tagName.toLowerCase();t.includes(n)||u(`Unrecognized element <${n}>`)})},Mn=(e,t)=>{Array.from(e.attributes).forEach(n=>{-1===t.indexOf(n.name)&&u([`Unrecognized attribute "${n.name}" on <${e.tagName.toLowerCase()}>.`,""+(t.length?`Allowed attributes are: ${t.join(", ")}`:"To set the value, use HTML within the element.")])})},jn=e=>{var t,n;const i=y(),r=C();if(!i||!r)return;"function"==typeof e.willOpen&&e.willOpen(r),null===(t=o.eventEmitter)||void 0===t||t.emit("willOpen",r);const s=window.getComputedStyle(document.body).overflowY;if(Vn(i,r,e),setTimeout(()=>{In(i,r)},10),D()&&(Dn(i,void 0!==e.scrollbarPadding&&e.scrollbarPadding,s),(()=>{const e=y();Array.from(document.body.children).forEach(t=>{t.contains(e)||(t.hasAttribute("aria-hidden")&&t.setAttribute("data-previous-aria-hidden",t.getAttribute("aria-hidden")||""),t.setAttribute("aria-hidden","true"))})})()),V()||o.previousActiveElement||(o.previousActiveElement=document.activeElement),"function"==typeof e.didOpen){const t=e.didOpen;setTimeout(()=>t(r))}null===(n=o.eventEmitter)||void 0===n||n.emit("didOpen",r)},Hn=e=>{const t=C();if(!t||e.target!==t)return;const n=y();n&&(t.removeEventListener("animationend",Hn),t.removeEventListener("transitionend",Hn),n.style.overflowY="auto",W(n,s["no-transition"]))},In=(e,t)=>{ne(t)?(e.style.overflowY="hidden",t.addEventListener("animationend",Hn),t.addEventListener("transitionend",Hn)):e.style.overflowY="auto"},Dn=(e,t,n)=>{(()=>{if(ot&&!N(document.body,s.iosfix)){const e=document.body.scrollTop;document.body.style.top=-1*e+"px",z(document.body,s.iosfix),it()}})(),t&&"hidden"!==n&&ct(n),setTimeout(()=>{e.scrollTop=0})},Vn=(e,t,n)=>{var o;null!==(o=n.showClass)&&void 0!==o&&o.backdrop&&z(e,n.showClass.backdrop),n.animation?(t.style.setProperty("opacity","0","important"),X(t,"grid"),setTimeout(()=>{var e;null!==(e=n.showClass)&&void 0!==e&&e.popup&&z(t,n.showClass.popup),t.style.removeProperty("opacity")},10)):X(t,"grid"),z([document.documentElement,document.body],s.shown),n.heightAuto&&n.backdrop&&!n.toast&&z([document.documentElement,document.body],s["height-auto"])};var qn=(e,t)=>/^[a-zA-Z0-9.+_'-]+@[a-zA-Z0-9.-]+\.[a-zA-Z0-9-]+$/.test(e)?Promise.resolve():Promise.resolve(t||"Invalid email address"),Nn=(e,t)=>/^https?:\/\/(www\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\.[a-z]{2,63}\b([-a-zA-Z0-9@:%_+.~#?&/=]*)$/.test(e)?Promise.resolve():Promise.resolve(t||"Invalid URL");function _n(e){!function(e){e.inputValidator||("email"===e.input&&(e.inputValidator=qn),"url"===e.input&&(e.inputValidator=Nn))}(e),e.showLoaderOnConfirm&&!e.preConfirm&&u("showLoaderOnConfirm is set to true, but preConfirm is not defined.\nshowLoaderOnConfirm should be used together with preConfirm, see usage example:\nhttps://sweetalert2.github.io/#ajax-request"),function(e){(!e.target||"string"==typeof e.target&&!document.querySelector(e.target)||"string"!=typeof e.target&&!e.target.appendChild)&&(u('Target parameter is not valid, defaulting to "body"'),e.target="body")}(e),"string"==typeof e.title&&(e.title=e.title.split("\n").join("
            ")),se(e)}let Rn;var Fn=new WeakMap;class Un{constructor(...t){if(n(this,Fn,Promise.resolve({isConfirmed:!1,isDenied:!1,isDismissed:!0})),"undefined"==typeof window)return;Rn=this;const o=Object.freeze(this.constructor.argsToParams(t));var i,r,s;this.params=o,this.isAwaitingPromise=!1,i=Fn,r=this,s=this._main(Rn.params),i.set(e(i,r),s)}_main(e,t={}){if(tn(Object.assign({},t,e)),o.currentInstance){const e=tt.swalPromiseResolve.get(o.currentInstance),{isAwaitingPromise:t}=o.currentInstance;o.currentInstance._destroy(),t||e({isDismissed:!0}),D()&&nt()}o.currentInstance=Rn;const n=Wn(e,t);_n(n),Object.freeze(n),o.timeout&&(o.timeout.stop(),delete o.timeout),clearTimeout(o.restoreFocusTimeout);const i=Kn(Rn);return Fe(Rn,n),he.innerParams.set(Rn,n),zn(Rn,i,n)}then(e){return t(Fn,this).then(e)}finally(e){return t(Fn,this).finally(e)}}const zn=(e,t,n)=>new Promise((i,r)=>{const s=t=>{e.close({isDismissed:!0,dismiss:t,isConfirmed:!1,isDenied:!1})};tt.swalPromiseResolve.set(e,i),tt.swalPromiseReject.set(e,r),t.confirmButton.onclick=()=>{(e=>{const t=he.innerParams.get(e);e.disableButtons(),t.input?Pt(e,"confirm"):Mt(e,!0)})(e)},t.denyButton.onclick=()=>{(e=>{const t=he.innerParams.get(e);e.disableButtons(),t.returnInputValueOnDeny?Pt(e,"deny"):Tt(e,!1)})(e)},t.cancelButton.onclick=()=>{((e,t)=>{e.disableButtons(),t(ze.cancel)})(e,s)},t.closeButton.onclick=()=>{s(ze.close)},((e,t,n)=>{e.toast?un(e,t,n):(mn(t),hn(t),gn(e,t,n))})(n,t,s),((e,t,n)=>{if(We(e),!t.toast){const o=e=>Ze(t,e,n);e.keydownHandler=o;const i=t.keydownListenerCapture?window:C();if(i){e.keydownTarget=i,e.keydownListenerCapture=t.keydownListenerCapture;const n=o;e.keydownTarget.addEventListener("keydown",n,{capture:e.keydownListenerCapture}),e.keydownHandlerAdded=!0}}})(o,n,s),((e,t)=>{"select"===t.input||"radio"===t.input?kt(e,t):["text","email","number","tel","textarea"].some(e=>e===t.input)&&(g(t.inputValue)||b(t.inputValue))&&(vt(P()),Bt(e,t))})(e,n),jn(n),Yn(o,n,s),Xn(t,n),setTimeout(()=>{t.container.scrollTop=0})}),Wn=(e,t)=>{const n=(e=>{const t="string"==typeof e.template?document.querySelector(e.template):e.template;if(!t)return{};const n=t.content;return On(n),Object.assign(Bn(n),$n(n),Ln(n),Pn(n),xn(n),Tn(n),Sn(n,kn))})(e),o=Object.assign({},zt,t,n,e);return o.showClass=Object.assign({},zt.showClass,o.showClass),o.hideClass=Object.assign({},zt.hideClass,o.hideClass),!1===o.animation&&(o.showClass={backdrop:"swal2-noanimation"},o.hideClass={}),o},Kn=e=>{const t={popup:C(),container:y(),actions:O(),confirmButton:P(),denyButton:T(),cancelButton:x(),loader:S(),closeButton:H(),validationMessage:L(),progressSteps:$()};return he.domCache.set(e,t),t},Yn=(e,t,n)=>{const o=j();Z(o),t.timer&&(e.timeout=new En(()=>{n("timer"),delete e.timeout},t.timer),t.timerProgressBar&&o&&(X(o),_(o,t,"timerProgressBar"),setTimeout(()=>{e.timeout&&e.timeout.running&&oe(t.timer)})))},Xn=(e,t)=>{if(!t.toast)return h(t.allowEnterKey)?void(Zn(e)||Jn(e,t)||Ke(-1,1)):(m("allowEnterKey"),void Gn())},Zn=e=>{const t=Array.from(e.popup.querySelectorAll("[autofocus]"));for(const e of t)if(e instanceof HTMLElement&&ee(e))return e.focus(),!0;return!1},Jn=(e,t)=>t.focusDeny&&ee(e.denyButton)?(e.denyButton.focus(),!0):t.focusCancel&&ee(e.cancelButton)?(e.cancelButton.focus(),!0):!(!t.focusConfirm||!ee(e.confirmButton))&&(e.confirmButton.focus(),!0),Gn=()=>{document.activeElement instanceof HTMLElement&&"function"==typeof document.activeElement.blur&&document.activeElement.blur()};Un.prototype.disableButtons=Nt,Un.prototype.enableButtons=qt,Un.prototype.getInput=It,Un.prototype.disableInput=Rt,Un.prototype.enableInput=_t,Un.prototype.hideLoading=jt,Un.prototype.disableLoading=jt,Un.prototype.showValidationMessage=Ft,Un.prototype.resetValidationMessage=Ut,Un.prototype.close=dt,Un.prototype.closePopup=dt,Un.prototype.closeModal=dt,Un.prototype.closeToast=dt,Un.prototype.rejectPromise=mt,Un.prototype.update=nn,Un.prototype._destroy=rn,Object.assign(Un,An),Object.keys(cn).forEach(e=>{Un[e]=function(...t){if(Rn&&Rn[e])return Rn[e](...t)}}),Un.DismissReason=ze,Un.version="11.26.18";const Qn=Un;Qn.default=Qn;export{Qn as default}; +"undefined"!=typeof document&&function(e,t){var n=e.createElement("style");if(e.getElementsByTagName("head")[0].appendChild(n),n.styleSheet)n.styleSheet.disabled||(n.styleSheet.cssText=t);else try{n.innerHTML=t}catch(e){n.innerText=t}}(document,":root{--swal2-outline: 0 0 0 3px rgba(100, 150, 200, 0.5);--swal2-container-padding: 0.625em;--swal2-backdrop: rgba(0, 0, 0, 0.4);--swal2-backdrop-transition: background-color 0.15s;--swal2-width: 32em;--swal2-padding: 0 0 1.25em;--swal2-border: none;--swal2-border-radius: 0.3125rem;--swal2-background: white;--swal2-color: #545454;--swal2-show-animation: swal2-show 0.3s;--swal2-hide-animation: swal2-hide 0.15s forwards;--swal2-icon-zoom: 1;--swal2-icon-animations: true;--swal2-title-padding: 0.8em 1em 0;--swal2-html-container-padding: 1em 1.6em 0.3em;--swal2-input-border: 1px solid #d9d9d9;--swal2-input-border-radius: 0.1875em;--swal2-input-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.06), 0 0 0 3px transparent;--swal2-input-background: transparent;--swal2-input-transition: border-color 0.2s, box-shadow 0.2s;--swal2-input-hover-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.06), 0 0 0 3px transparent;--swal2-input-focus-border: 1px solid #b4dbed;--swal2-input-focus-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.06), 0 0 0 3px rgba(100, 150, 200, 0.5);--swal2-progress-step-background: #add8e6;--swal2-validation-message-background: #f0f0f0;--swal2-validation-message-color: #666;--swal2-footer-border-color: #eee;--swal2-footer-background: transparent;--swal2-footer-color: inherit;--swal2-timer-progress-bar-background: rgba(0, 0, 0, 0.3);--swal2-close-button-position: initial;--swal2-close-button-inset: auto;--swal2-close-button-font-size: 2.5em;--swal2-close-button-color: #ccc;--swal2-close-button-transition: color 0.2s, box-shadow 0.2s;--swal2-close-button-outline: initial;--swal2-close-button-box-shadow: inset 0 0 0 3px transparent;--swal2-close-button-focus-box-shadow: inset var(--swal2-outline);--swal2-close-button-hover-transform: none;--swal2-actions-justify-content: center;--swal2-actions-width: auto;--swal2-actions-margin: 1.25em auto 0;--swal2-actions-padding: 0;--swal2-actions-border-radius: 0;--swal2-actions-background: transparent;--swal2-action-button-transition: background-color 0.2s, box-shadow 0.2s;--swal2-action-button-hover: black 10%;--swal2-action-button-active: black 10%;--swal2-confirm-button-box-shadow: none;--swal2-confirm-button-border-radius: 0.25em;--swal2-confirm-button-background-color: #7066e0;--swal2-confirm-button-color: #fff;--swal2-deny-button-box-shadow: none;--swal2-deny-button-border-radius: 0.25em;--swal2-deny-button-background-color: #dc3741;--swal2-deny-button-color: #fff;--swal2-cancel-button-box-shadow: none;--swal2-cancel-button-border-radius: 0.25em;--swal2-cancel-button-background-color: #6e7881;--swal2-cancel-button-color: #fff;--swal2-toast-show-animation: swal2-toast-show 0.5s;--swal2-toast-hide-animation: swal2-toast-hide 0.1s forwards;--swal2-toast-border: none;--swal2-toast-box-shadow: 0 0 1px hsl(0deg 0% 0% / 0.075), 0 1px 2px hsl(0deg 0% 0% / 0.075), 1px 2px 4px hsl(0deg 0% 0% / 0.075), 1px 3px 8px hsl(0deg 0% 0% / 0.075), 2px 4px 16px hsl(0deg 0% 0% / 0.075)}[data-swal2-theme=dark]{--swal2-dark-theme-black: #19191a;--swal2-dark-theme-white: #e1e1e1;--swal2-background: var(--swal2-dark-theme-black);--swal2-color: var(--swal2-dark-theme-white);--swal2-footer-border-color: #555;--swal2-input-background: color-mix(in srgb, var(--swal2-dark-theme-black), var(--swal2-dark-theme-white) 10%);--swal2-validation-message-background: color-mix( in srgb, var(--swal2-dark-theme-black), var(--swal2-dark-theme-white) 10% );--swal2-validation-message-color: var(--swal2-dark-theme-white);--swal2-timer-progress-bar-background: rgba(255, 255, 255, 0.7)}@media(prefers-color-scheme: dark){[data-swal2-theme=auto]{--swal2-dark-theme-black: #19191a;--swal2-dark-theme-white: #e1e1e1;--swal2-background: var(--swal2-dark-theme-black);--swal2-color: var(--swal2-dark-theme-white);--swal2-footer-border-color: #555;--swal2-input-background: color-mix(in srgb, var(--swal2-dark-theme-black), var(--swal2-dark-theme-white) 10%);--swal2-validation-message-background: color-mix( in srgb, var(--swal2-dark-theme-black), var(--swal2-dark-theme-white) 10% );--swal2-validation-message-color: var(--swal2-dark-theme-white);--swal2-timer-progress-bar-background: rgba(255, 255, 255, 0.7)}}body.swal2-shown:not(.swal2-no-backdrop,.swal2-toast-shown){overflow:hidden}body.swal2-height-auto{height:auto !important}body.swal2-no-backdrop .swal2-container{background-color:rgba(0,0,0,0) !important;pointer-events:none}body.swal2-no-backdrop .swal2-container .swal2-popup{pointer-events:all}body.swal2-no-backdrop .swal2-container .swal2-modal{box-shadow:0 0 10px var(--swal2-backdrop)}body.swal2-toast-shown .swal2-container{box-sizing:border-box;width:360px;max-width:100%;background-color:rgba(0,0,0,0);pointer-events:none}body.swal2-toast-shown .swal2-container.swal2-top{inset:0 auto auto 50%;transform:translateX(-50%)}body.swal2-toast-shown .swal2-container.swal2-top-end,body.swal2-toast-shown .swal2-container.swal2-top-right{inset:0 0 auto auto}body.swal2-toast-shown .swal2-container.swal2-top-start,body.swal2-toast-shown .swal2-container.swal2-top-left{inset:0 auto auto 0}body.swal2-toast-shown .swal2-container.swal2-center-start,body.swal2-toast-shown .swal2-container.swal2-center-left{inset:50% auto auto 0;transform:translateY(-50%)}body.swal2-toast-shown .swal2-container.swal2-center{inset:50% auto auto 50%;transform:translate(-50%, -50%)}body.swal2-toast-shown .swal2-container.swal2-center-end,body.swal2-toast-shown .swal2-container.swal2-center-right{inset:50% 0 auto auto;transform:translateY(-50%)}body.swal2-toast-shown .swal2-container.swal2-bottom-start,body.swal2-toast-shown .swal2-container.swal2-bottom-left{inset:auto auto 0 0}body.swal2-toast-shown .swal2-container.swal2-bottom{inset:auto auto 0 50%;transform:translateX(-50%)}body.swal2-toast-shown .swal2-container.swal2-bottom-end,body.swal2-toast-shown .swal2-container.swal2-bottom-right{inset:auto 0 0 auto}@media print{body.swal2-shown:not(.swal2-no-backdrop,.swal2-toast-shown){overflow-y:scroll !important}body.swal2-shown:not(.swal2-no-backdrop,.swal2-toast-shown)>[aria-hidden=true]{display:none}body.swal2-shown:not(.swal2-no-backdrop,.swal2-toast-shown) .swal2-container{position:static !important}}div:where(.swal2-container){display:grid;position:fixed;z-index:1060;inset:0;box-sizing:border-box;grid-template-areas:\"top-start top top-end\" \"center-start center center-end\" \"bottom-start bottom-center bottom-end\";grid-template-rows:minmax(min-content, auto) minmax(min-content, auto) minmax(min-content, auto);height:100%;padding:var(--swal2-container-padding);overflow-x:hidden;transition:var(--swal2-backdrop-transition);-webkit-overflow-scrolling:touch}div:where(.swal2-container).swal2-backdrop-show,div:where(.swal2-container).swal2-noanimation{background:var(--swal2-backdrop)}div:where(.swal2-container).swal2-backdrop-hide{background:rgba(0,0,0,0) !important}div:where(.swal2-container).swal2-top-start,div:where(.swal2-container).swal2-center-start,div:where(.swal2-container).swal2-bottom-start{grid-template-columns:minmax(0, 1fr) auto auto}div:where(.swal2-container).swal2-top,div:where(.swal2-container).swal2-center,div:where(.swal2-container).swal2-bottom{grid-template-columns:auto minmax(0, 1fr) auto}div:where(.swal2-container).swal2-top-end,div:where(.swal2-container).swal2-center-end,div:where(.swal2-container).swal2-bottom-end{grid-template-columns:auto auto minmax(0, 1fr)}div:where(.swal2-container).swal2-top-start>.swal2-popup{align-self:start}div:where(.swal2-container).swal2-top>.swal2-popup{grid-column:2;place-self:start center}div:where(.swal2-container).swal2-top-end>.swal2-popup,div:where(.swal2-container).swal2-top-right>.swal2-popup{grid-column:3;place-self:start end}div:where(.swal2-container).swal2-center-start>.swal2-popup,div:where(.swal2-container).swal2-center-left>.swal2-popup{grid-row:2;align-self:center}div:where(.swal2-container).swal2-center>.swal2-popup{grid-column:2;grid-row:2;place-self:center center}div:where(.swal2-container).swal2-center-end>.swal2-popup,div:where(.swal2-container).swal2-center-right>.swal2-popup{grid-column:3;grid-row:2;place-self:center end}div:where(.swal2-container).swal2-bottom-start>.swal2-popup,div:where(.swal2-container).swal2-bottom-left>.swal2-popup{grid-column:1;grid-row:3;align-self:end}div:where(.swal2-container).swal2-bottom>.swal2-popup{grid-column:2;grid-row:3;place-self:end center}div:where(.swal2-container).swal2-bottom-end>.swal2-popup,div:where(.swal2-container).swal2-bottom-right>.swal2-popup{grid-column:3;grid-row:3;place-self:end end}div:where(.swal2-container).swal2-grow-row>.swal2-popup,div:where(.swal2-container).swal2-grow-fullscreen>.swal2-popup{grid-column:1/4;width:100%}div:where(.swal2-container).swal2-grow-column>.swal2-popup,div:where(.swal2-container).swal2-grow-fullscreen>.swal2-popup{grid-row:1/4;align-self:stretch}div:where(.swal2-container).swal2-no-transition{transition:none !important}div:where(.swal2-container)[popover]{width:auto;border:0}div:where(.swal2-container) div:where(.swal2-popup){display:none;position:relative;box-sizing:border-box;grid-template-columns:minmax(0, 100%);width:var(--swal2-width);max-width:100%;padding:var(--swal2-padding);border:var(--swal2-border);border-radius:var(--swal2-border-radius);background:var(--swal2-background);color:var(--swal2-color);font-family:inherit;font-size:1rem;container-name:swal2-popup}div:where(.swal2-container) div:where(.swal2-popup):focus{outline:none}div:where(.swal2-container) div:where(.swal2-popup).swal2-loading{overflow-y:hidden}div:where(.swal2-container) div:where(.swal2-popup).swal2-draggable{cursor:grab}div:where(.swal2-container) div:where(.swal2-popup).swal2-draggable div:where(.swal2-icon){cursor:grab}div:where(.swal2-container) div:where(.swal2-popup).swal2-dragging{cursor:grabbing}div:where(.swal2-container) div:where(.swal2-popup).swal2-dragging div:where(.swal2-icon){cursor:grabbing}div:where(.swal2-container) h2:where(.swal2-title){position:relative;max-width:100%;margin:0;padding:var(--swal2-title-padding);color:inherit;font-size:1.875em;font-weight:600;text-align:center;text-transform:none;overflow-wrap:break-word;cursor:initial}div:where(.swal2-container) div:where(.swal2-actions){display:flex;z-index:1;box-sizing:border-box;flex-wrap:wrap;align-items:center;justify-content:var(--swal2-actions-justify-content);width:var(--swal2-actions-width);margin:var(--swal2-actions-margin);padding:var(--swal2-actions-padding);border-radius:var(--swal2-actions-border-radius);background:var(--swal2-actions-background)}div:where(.swal2-container) div:where(.swal2-loader){display:none;align-items:center;justify-content:center;width:2.2em;height:2.2em;margin:0 1.875em;animation:swal2-rotate-loading 1.5s linear 0s infinite normal;border-width:.25em;border-style:solid;border-radius:100%;border-color:#2778c4 rgba(0,0,0,0) #2778c4 rgba(0,0,0,0)}div:where(.swal2-container) button:where(.swal2-styled){margin:.3125em;padding:.625em 1.1em;transition:var(--swal2-action-button-transition);border:none;box-shadow:0 0 0 3px rgba(0,0,0,0);font-weight:500}div:where(.swal2-container) button:where(.swal2-styled):not([disabled]){cursor:pointer}div:where(.swal2-container) button:where(.swal2-styled):where(.swal2-confirm){border-radius:var(--swal2-confirm-button-border-radius);background:initial;background-color:var(--swal2-confirm-button-background-color);box-shadow:var(--swal2-confirm-button-box-shadow);color:var(--swal2-confirm-button-color);font-size:1em}div:where(.swal2-container) button:where(.swal2-styled):where(.swal2-confirm):hover{background-color:color-mix(in srgb, var(--swal2-confirm-button-background-color), var(--swal2-action-button-hover))}div:where(.swal2-container) button:where(.swal2-styled):where(.swal2-confirm):active{background-color:color-mix(in srgb, var(--swal2-confirm-button-background-color), var(--swal2-action-button-active))}div:where(.swal2-container) button:where(.swal2-styled):where(.swal2-deny){border-radius:var(--swal2-deny-button-border-radius);background:initial;background-color:var(--swal2-deny-button-background-color);box-shadow:var(--swal2-deny-button-box-shadow);color:var(--swal2-deny-button-color);font-size:1em}div:where(.swal2-container) button:where(.swal2-styled):where(.swal2-deny):hover{background-color:color-mix(in srgb, var(--swal2-deny-button-background-color), var(--swal2-action-button-hover))}div:where(.swal2-container) button:where(.swal2-styled):where(.swal2-deny):active{background-color:color-mix(in srgb, var(--swal2-deny-button-background-color), var(--swal2-action-button-active))}div:where(.swal2-container) button:where(.swal2-styled):where(.swal2-cancel){border-radius:var(--swal2-cancel-button-border-radius);background:initial;background-color:var(--swal2-cancel-button-background-color);box-shadow:var(--swal2-cancel-button-box-shadow);color:var(--swal2-cancel-button-color);font-size:1em}div:where(.swal2-container) button:where(.swal2-styled):where(.swal2-cancel):hover{background-color:color-mix(in srgb, var(--swal2-cancel-button-background-color), var(--swal2-action-button-hover))}div:where(.swal2-container) button:where(.swal2-styled):where(.swal2-cancel):active{background-color:color-mix(in srgb, var(--swal2-cancel-button-background-color), var(--swal2-action-button-active))}div:where(.swal2-container) button:where(.swal2-styled):focus-visible{outline:none;box-shadow:var(--swal2-action-button-focus-box-shadow)}div:where(.swal2-container) button:where(.swal2-styled)[disabled]:not(.swal2-loading){opacity:.4}div:where(.swal2-container) button:where(.swal2-styled)::-moz-focus-inner{border:0}div:where(.swal2-container) div:where(.swal2-footer){margin:1em 0 0;padding:1em 1em 0;border-top:1px solid var(--swal2-footer-border-color);background:var(--swal2-footer-background);color:var(--swal2-footer-color);font-size:1em;text-align:center;cursor:initial}div:where(.swal2-container) .swal2-timer-progress-bar-container{position:absolute;right:0;bottom:0;left:0;grid-column:auto !important;overflow:hidden;border-bottom-right-radius:var(--swal2-border-radius);border-bottom-left-radius:var(--swal2-border-radius)}div:where(.swal2-container) div:where(.swal2-timer-progress-bar){width:100%;height:.25em;background:var(--swal2-timer-progress-bar-background)}div:where(.swal2-container) img:where(.swal2-image){max-width:100%;margin:2em auto 1em;cursor:initial}div:where(.swal2-container) button:where(.swal2-close){position:var(--swal2-close-button-position);inset:var(--swal2-close-button-inset);z-index:2;align-items:center;justify-content:center;width:1.2em;height:1.2em;margin-top:0;margin-right:0;margin-bottom:-1.2em;padding:0;overflow:hidden;transition:var(--swal2-close-button-transition);border:none;border-radius:var(--swal2-border-radius);outline:var(--swal2-close-button-outline);background:rgba(0,0,0,0);color:var(--swal2-close-button-color);font-family:monospace;font-size:var(--swal2-close-button-font-size);cursor:pointer;justify-self:end}div:where(.swal2-container) button:where(.swal2-close):hover{transform:var(--swal2-close-button-hover-transform);background:rgba(0,0,0,0);color:#f27474}div:where(.swal2-container) button:where(.swal2-close):focus-visible{outline:none;box-shadow:var(--swal2-close-button-focus-box-shadow)}div:where(.swal2-container) button:where(.swal2-close)::-moz-focus-inner{border:0}div:where(.swal2-container) div:where(.swal2-html-container){z-index:1;justify-content:center;margin:0;padding:var(--swal2-html-container-padding);overflow:auto;color:inherit;font-size:1.125em;font-weight:normal;line-height:normal;text-align:center;overflow-wrap:break-word;word-break:break-word;cursor:initial}div:where(.swal2-container) input:where(.swal2-input),div:where(.swal2-container) input:where(.swal2-file),div:where(.swal2-container) textarea:where(.swal2-textarea),div:where(.swal2-container) select:where(.swal2-select),div:where(.swal2-container) div:where(.swal2-radio),div:where(.swal2-container) label:where(.swal2-checkbox){margin:1em 2em 3px}div:where(.swal2-container) input:where(.swal2-input),div:where(.swal2-container) input:where(.swal2-file),div:where(.swal2-container) textarea:where(.swal2-textarea){box-sizing:border-box;width:auto;transition:var(--swal2-input-transition);border:var(--swal2-input-border);border-radius:var(--swal2-input-border-radius);background:var(--swal2-input-background);box-shadow:var(--swal2-input-box-shadow);color:inherit;font-size:1.125em}div:where(.swal2-container) input:where(.swal2-input).swal2-inputerror,div:where(.swal2-container) input:where(.swal2-file).swal2-inputerror,div:where(.swal2-container) textarea:where(.swal2-textarea).swal2-inputerror{border-color:#f27474 !important;box-shadow:0 0 2px #f27474 !important}div:where(.swal2-container) input:where(.swal2-input):hover,div:where(.swal2-container) input:where(.swal2-file):hover,div:where(.swal2-container) textarea:where(.swal2-textarea):hover{box-shadow:var(--swal2-input-hover-box-shadow)}div:where(.swal2-container) input:where(.swal2-input):focus,div:where(.swal2-container) input:where(.swal2-file):focus,div:where(.swal2-container) textarea:where(.swal2-textarea):focus{border:var(--swal2-input-focus-border);outline:none;box-shadow:var(--swal2-input-focus-box-shadow)}div:where(.swal2-container) input:where(.swal2-input)::placeholder,div:where(.swal2-container) input:where(.swal2-file)::placeholder,div:where(.swal2-container) textarea:where(.swal2-textarea)::placeholder{color:#ccc}div:where(.swal2-container) .swal2-range{margin:1em 2em 3px;background:var(--swal2-background)}div:where(.swal2-container) .swal2-range input{width:80%}div:where(.swal2-container) .swal2-range output{width:20%;color:inherit;font-weight:600;text-align:center}div:where(.swal2-container) .swal2-range input,div:where(.swal2-container) .swal2-range output{height:2.625em;padding:0;font-size:1.125em;line-height:2.625em}div:where(.swal2-container) .swal2-input{height:2.625em;padding:0 .75em}div:where(.swal2-container) .swal2-file{width:75%;margin-right:auto;margin-left:auto;background:var(--swal2-input-background);font-size:1.125em}div:where(.swal2-container) .swal2-textarea{height:6.75em;padding:.75em}div:where(.swal2-container) .swal2-select{min-width:50%;max-width:100%;padding:.375em .625em;background:var(--swal2-input-background);color:inherit;font-size:1.125em}div:where(.swal2-container) .swal2-radio,div:where(.swal2-container) .swal2-checkbox{align-items:center;justify-content:center;background:var(--swal2-background);color:inherit}div:where(.swal2-container) .swal2-radio label,div:where(.swal2-container) .swal2-checkbox label{margin:0 .6em;font-size:1.125em}div:where(.swal2-container) .swal2-radio input,div:where(.swal2-container) .swal2-checkbox input{flex-shrink:0;margin:0 .4em}div:where(.swal2-container) label:where(.swal2-input-label){display:flex;justify-content:center;margin:1em auto 0}div:where(.swal2-container) div:where(.swal2-validation-message){align-items:center;justify-content:center;margin:1em 0 0;padding:.625em;overflow:hidden;background:var(--swal2-validation-message-background);color:var(--swal2-validation-message-color);font-size:1em;font-weight:300}div:where(.swal2-container) div:where(.swal2-validation-message)::before{content:\"!\";display:inline-block;width:1.5em;min-width:1.5em;height:1.5em;margin:0 .625em;border-radius:50%;background-color:#f27474;color:#fff;font-weight:600;line-height:1.5em;text-align:center}div:where(.swal2-container) .swal2-progress-steps{flex-wrap:wrap;align-items:center;max-width:100%;margin:1.25em auto;padding:0;background:rgba(0,0,0,0);font-weight:600}div:where(.swal2-container) .swal2-progress-steps li{display:inline-block;position:relative}div:where(.swal2-container) .swal2-progress-steps .swal2-progress-step{z-index:20;flex-shrink:0;width:2em;height:2em;border-radius:2em;background:#2778c4;color:#fff;line-height:2em;text-align:center}div:where(.swal2-container) .swal2-progress-steps .swal2-progress-step.swal2-active-progress-step{background:#2778c4}div:where(.swal2-container) .swal2-progress-steps .swal2-progress-step.swal2-active-progress-step~.swal2-progress-step{background:var(--swal2-progress-step-background);color:#fff}div:where(.swal2-container) .swal2-progress-steps .swal2-progress-step.swal2-active-progress-step~.swal2-progress-step-line{background:var(--swal2-progress-step-background)}div:where(.swal2-container) .swal2-progress-steps .swal2-progress-step-line{z-index:10;flex-shrink:0;width:2.5em;height:.4em;margin:0 -1px;background:#2778c4}div:where(.swal2-icon){position:relative;box-sizing:content-box;justify-content:center;width:5em;height:5em;margin:2.5em auto .6em;zoom:var(--swal2-icon-zoom);border:.25em solid rgba(0,0,0,0);border-radius:50%;border-color:#000;font-family:inherit;line-height:5em;cursor:default;user-select:none}div:where(.swal2-icon) .swal2-icon-content{display:flex;align-items:center;font-size:3.75em}div:where(.swal2-icon).swal2-error{border-color:#f27474;color:#f27474}div:where(.swal2-icon).swal2-error .swal2-x-mark{position:relative;flex-grow:1}div:where(.swal2-icon).swal2-error [class^=swal2-x-mark-line]{display:block;position:absolute;top:2.3125em;width:2.9375em;height:.3125em;border-radius:.125em;background-color:#f27474}div:where(.swal2-icon).swal2-error [class^=swal2-x-mark-line][class$=left]{left:1.0625em;transform:rotate(45deg)}div:where(.swal2-icon).swal2-error [class^=swal2-x-mark-line][class$=right]{right:1em;transform:rotate(-45deg)}@container swal2-popup style(--swal2-icon-animations:true){div:where(.swal2-icon).swal2-error.swal2-icon-show{animation:swal2-animate-error-icon .5s}div:where(.swal2-icon).swal2-error.swal2-icon-show .swal2-x-mark{animation:swal2-animate-error-x-mark .5s}}div:where(.swal2-icon).swal2-warning{border-color:#f8bb86;color:#f8bb86}@container swal2-popup style(--swal2-icon-animations:true){div:where(.swal2-icon).swal2-warning.swal2-icon-show{animation:swal2-animate-error-icon .5s}div:where(.swal2-icon).swal2-warning.swal2-icon-show .swal2-icon-content{animation:swal2-animate-i-mark .5s}}div:where(.swal2-icon).swal2-info{border-color:#3fc3ee;color:#3fc3ee}@container swal2-popup style(--swal2-icon-animations:true){div:where(.swal2-icon).swal2-info.swal2-icon-show{animation:swal2-animate-error-icon .5s}div:where(.swal2-icon).swal2-info.swal2-icon-show .swal2-icon-content{animation:swal2-animate-i-mark .8s}}div:where(.swal2-icon).swal2-question{border-color:#87adbd;color:#87adbd}@container swal2-popup style(--swal2-icon-animations:true){div:where(.swal2-icon).swal2-question.swal2-icon-show{animation:swal2-animate-error-icon .5s}div:where(.swal2-icon).swal2-question.swal2-icon-show .swal2-icon-content{animation:swal2-animate-question-mark .8s}}div:where(.swal2-icon).swal2-success{border-color:#a5dc86;color:#a5dc86}div:where(.swal2-icon).swal2-success [class^=swal2-success-circular-line]{position:absolute;width:3.75em;height:7.5em;border-radius:50%}div:where(.swal2-icon).swal2-success [class^=swal2-success-circular-line][class$=left]{top:-0.4375em;left:-2.0635em;transform:rotate(-45deg);transform-origin:3.75em 3.75em;border-radius:7.5em 0 0 7.5em}div:where(.swal2-icon).swal2-success [class^=swal2-success-circular-line][class$=right]{top:-0.6875em;left:1.875em;transform:rotate(-45deg);transform-origin:0 3.75em;border-radius:0 7.5em 7.5em 0}div:where(.swal2-icon).swal2-success .swal2-success-ring{position:absolute;z-index:2;top:-0.25em;left:-0.25em;box-sizing:content-box;width:100%;height:100%;border:.25em solid rgba(165,220,134,.3);border-radius:50%}div:where(.swal2-icon).swal2-success .swal2-success-fix{position:absolute;z-index:1;top:.5em;left:1.625em;width:.4375em;height:5.625em;transform:rotate(-45deg)}div:where(.swal2-icon).swal2-success [class^=swal2-success-line]{display:block;position:absolute;z-index:2;height:.3125em;border-radius:.125em;background-color:#a5dc86}div:where(.swal2-icon).swal2-success [class^=swal2-success-line][class$=tip]{top:2.875em;left:.8125em;width:1.5625em;transform:rotate(45deg)}div:where(.swal2-icon).swal2-success [class^=swal2-success-line][class$=long]{top:2.375em;right:.5em;width:2.9375em;transform:rotate(-45deg)}@container swal2-popup style(--swal2-icon-animations:true){div:where(.swal2-icon).swal2-success.swal2-icon-show .swal2-success-line-tip{animation:swal2-animate-success-line-tip .75s}div:where(.swal2-icon).swal2-success.swal2-icon-show .swal2-success-line-long{animation:swal2-animate-success-line-long .75s}div:where(.swal2-icon).swal2-success.swal2-icon-show .swal2-success-circular-line-right{animation:swal2-rotate-success-circular-line 4.25s ease-in}}[class^=swal2]{-webkit-tap-highlight-color:rgba(0,0,0,0)}.swal2-show{animation:var(--swal2-show-animation)}.swal2-hide{animation:var(--swal2-hide-animation)}.swal2-noanimation{transition:none}.swal2-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}.swal2-rtl .swal2-close{margin-right:initial;margin-left:0}.swal2-rtl .swal2-timer-progress-bar{right:0;left:auto}.swal2-toast{box-sizing:border-box;grid-column:1/4 !important;grid-row:1/4 !important;grid-template-columns:min-content auto min-content;padding:1em;overflow-y:hidden;border:var(--swal2-toast-border);background:var(--swal2-background);box-shadow:var(--swal2-toast-box-shadow);pointer-events:all}.swal2-toast>*{grid-column:2}.swal2-toast h2:where(.swal2-title){margin:.5em 1em;padding:0;font-size:1em;text-align:initial}.swal2-toast .swal2-loading{justify-content:center}.swal2-toast input:where(.swal2-input){height:2em;margin:.5em;font-size:1em}.swal2-toast .swal2-validation-message{font-size:1em}.swal2-toast div:where(.swal2-footer){margin:.5em 0 0;padding:.5em 0 0;font-size:.8em}.swal2-toast button:where(.swal2-close){grid-column:3/3;grid-row:1/99;align-self:center;width:.8em;height:.8em;margin:0;font-size:2em}.swal2-toast div:where(.swal2-html-container){margin:.5em 1em;padding:0;overflow:initial;font-size:1em;text-align:initial}.swal2-toast div:where(.swal2-html-container):empty{padding:0}.swal2-toast .swal2-loader{grid-column:1;grid-row:1/99;align-self:center;width:2em;height:2em;margin:.25em}.swal2-toast .swal2-icon{grid-column:1;grid-row:1/99;align-self:center;width:2em;min-width:2em;height:2em;margin:0 .5em 0 0}.swal2-toast .swal2-icon .swal2-icon-content{display:flex;align-items:center;font-size:1.8em;font-weight:bold}.swal2-toast .swal2-icon.swal2-success .swal2-success-ring{width:2em;height:2em}.swal2-toast .swal2-icon.swal2-error [class^=swal2-x-mark-line]{top:.875em;width:1.375em}.swal2-toast .swal2-icon.swal2-error [class^=swal2-x-mark-line][class$=left]{left:.3125em}.swal2-toast .swal2-icon.swal2-error [class^=swal2-x-mark-line][class$=right]{right:.3125em}.swal2-toast div:where(.swal2-actions){justify-content:flex-start;height:auto;margin:0;margin-top:.5em;padding:0 .5em}.swal2-toast button:where(.swal2-styled){margin:.25em .5em;padding:.4em .6em;font-size:1em}.swal2-toast .swal2-success{border-color:#a5dc86}.swal2-toast .swal2-success [class^=swal2-success-circular-line]{position:absolute;width:1.6em;height:3em;border-radius:50%}.swal2-toast .swal2-success [class^=swal2-success-circular-line][class$=left]{top:-0.8em;left:-0.5em;transform:rotate(-45deg);transform-origin:2em 2em;border-radius:4em 0 0 4em}.swal2-toast .swal2-success [class^=swal2-success-circular-line][class$=right]{top:-0.25em;left:.9375em;transform-origin:0 1.5em;border-radius:0 4em 4em 0}.swal2-toast .swal2-success .swal2-success-ring{width:2em;height:2em}.swal2-toast .swal2-success .swal2-success-fix{top:0;left:.4375em;width:.4375em;height:2.6875em}.swal2-toast .swal2-success [class^=swal2-success-line]{height:.3125em}.swal2-toast .swal2-success [class^=swal2-success-line][class$=tip]{top:1.125em;left:.1875em;width:.75em}.swal2-toast .swal2-success [class^=swal2-success-line][class$=long]{top:.9375em;right:.1875em;width:1.375em}@container swal2-popup style(--swal2-icon-animations:true){.swal2-toast .swal2-success.swal2-icon-show .swal2-success-line-tip{animation:swal2-toast-animate-success-line-tip .75s}.swal2-toast .swal2-success.swal2-icon-show .swal2-success-line-long{animation:swal2-toast-animate-success-line-long .75s}}.swal2-toast.swal2-show{animation:var(--swal2-toast-show-animation)}.swal2-toast.swal2-hide{animation:var(--swal2-toast-hide-animation)}@keyframes swal2-show{0%{transform:translate3d(0, -50px, 0) scale(0.9);opacity:0}100%{transform:translate3d(0, 0, 0) scale(1);opacity:1}}@keyframes swal2-hide{0%{transform:translate3d(0, 0, 0) scale(1);opacity:1}100%{transform:translate3d(0, -50px, 0) scale(0.9);opacity:0}}@keyframes swal2-animate-success-line-tip{0%{top:1.1875em;left:.0625em;width:0}54%{top:1.0625em;left:.125em;width:0}70%{top:2.1875em;left:-0.375em;width:3.125em}84%{top:3em;left:1.3125em;width:1.0625em}100%{top:2.8125em;left:.8125em;width:1.5625em}}@keyframes swal2-animate-success-line-long{0%{top:3.375em;right:2.875em;width:0}65%{top:3.375em;right:2.875em;width:0}84%{top:2.1875em;right:0;width:3.4375em}100%{top:2.375em;right:.5em;width:2.9375em}}@keyframes swal2-rotate-success-circular-line{0%{transform:rotate(-45deg)}5%{transform:rotate(-45deg)}12%{transform:rotate(-405deg)}100%{transform:rotate(-405deg)}}@keyframes swal2-animate-error-x-mark{0%{margin-top:1.625em;transform:scale(0.4);opacity:0}50%{margin-top:1.625em;transform:scale(0.4);opacity:0}80%{margin-top:-0.375em;transform:scale(1.15)}100%{margin-top:0;transform:scale(1);opacity:1}}@keyframes swal2-animate-error-icon{0%{transform:rotateX(100deg);opacity:0}100%{transform:rotateX(0deg);opacity:1}}@keyframes swal2-rotate-loading{0%{transform:rotate(0deg)}100%{transform:rotate(360deg)}}@keyframes swal2-animate-question-mark{0%{transform:rotateY(-360deg)}100%{transform:rotateY(0)}}@keyframes swal2-animate-i-mark{0%{transform:rotateZ(45deg);opacity:0}25%{transform:rotateZ(-25deg);opacity:.4}50%{transform:rotateZ(15deg);opacity:.8}75%{transform:rotateZ(-5deg);opacity:1}100%{transform:rotateX(0);opacity:1}}@keyframes swal2-toast-show{0%{transform:translateY(-0.625em) rotateZ(2deg)}33%{transform:translateY(0) rotateZ(-2deg)}66%{transform:translateY(0.3125em) rotateZ(2deg)}100%{transform:translateY(0) rotateZ(0deg)}}@keyframes swal2-toast-hide{100%{transform:rotateZ(1deg);opacity:0}}@keyframes swal2-toast-animate-success-line-tip{0%{top:.5625em;left:.0625em;width:0}54%{top:.125em;left:.125em;width:0}70%{top:.625em;left:-0.25em;width:1.625em}84%{top:1.0625em;left:.75em;width:.5em}100%{top:1.125em;left:.1875em;width:.75em}}@keyframes swal2-toast-animate-success-line-long{0%{top:1.625em;right:1.375em;width:0}65%{top:1.25em;right:.9375em;width:0}84%{top:.9375em;right:0;width:1.125em}100%{top:.9375em;right:.1875em;width:1.375em}}"); \ No newline at end of file diff --git a/public/assets/sweetalert2/dist/sweetalert2.esm.js b/public/assets/sweetalert2/dist/sweetalert2.esm.js new file mode 100644 index 0000000..1c4b51f --- /dev/null +++ b/public/assets/sweetalert2/dist/sweetalert2.esm.js @@ -0,0 +1,4815 @@ +/*! +* sweetalert2 v11.26.18 +* Released under the MIT License. +*/ +function _assertClassBrand(e, t, n) { + if ("function" == typeof e ? e === t : e.has(t)) return arguments.length < 3 ? t : n; + throw new TypeError("Private element is not present on this object"); +} +function _checkPrivateRedeclaration(e, t) { + if (t.has(e)) throw new TypeError("Cannot initialize the same private elements twice on an object"); +} +function _classPrivateFieldGet2(s, a) { + return s.get(_assertClassBrand(s, a)); +} +function _classPrivateFieldInitSpec(e, t, a) { + _checkPrivateRedeclaration(e, t), t.set(e, a); +} +function _classPrivateFieldSet2(s, a, r) { + return s.set(_assertClassBrand(s, a), r), r; +} + +const RESTORE_FOCUS_TIMEOUT = 100; + +/** @type {GlobalState} */ +const globalState = {}; +const focusPreviousActiveElement = () => { + if (globalState.previousActiveElement instanceof HTMLElement) { + globalState.previousActiveElement.focus(); + globalState.previousActiveElement = null; + } else if (document.body) { + document.body.focus(); + } +}; + +/** + * Restore previous active (focused) element + * + * @param {boolean} returnFocus + * @returns {Promise} + */ +const restoreActiveElement = returnFocus => { + return new Promise(resolve => { + if (!returnFocus) { + return resolve(); + } + const x = window.scrollX; + const y = window.scrollY; + globalState.restoreFocusTimeout = setTimeout(() => { + focusPreviousActiveElement(); + resolve(); + }, RESTORE_FOCUS_TIMEOUT); // issues/900 + + window.scrollTo(x, y); + }); +}; + +const swalPrefix = 'swal2-'; + +/** + * @typedef {Record} SwalClasses + */ + +/** + * @typedef {'success' | 'warning' | 'info' | 'question' | 'error'} SwalIcon + * @typedef {Record} SwalIcons + */ + +/** @type {SwalClass[]} */ +const classNames = ['container', 'shown', 'height-auto', 'iosfix', 'popup', 'modal', 'no-backdrop', 'no-transition', 'toast', 'toast-shown', 'show', 'hide', 'close', 'title', 'html-container', 'actions', 'confirm', 'deny', 'cancel', 'footer', 'icon', 'icon-content', 'image', 'input', 'file', 'range', 'select', 'radio', 'checkbox', 'label', 'textarea', 'inputerror', 'input-label', 'validation-message', 'progress-steps', 'active-progress-step', 'progress-step', 'progress-step-line', 'loader', 'loading', 'styled', 'top', 'top-start', 'top-end', 'top-left', 'top-right', 'center', 'center-start', 'center-end', 'center-left', 'center-right', 'bottom', 'bottom-start', 'bottom-end', 'bottom-left', 'bottom-right', 'grow-row', 'grow-column', 'grow-fullscreen', 'rtl', 'timer-progress-bar', 'timer-progress-bar-container', 'scrollbar-measure', 'icon-success', 'icon-warning', 'icon-info', 'icon-question', 'icon-error', 'draggable', 'dragging']; +const swalClasses = classNames.reduce((acc, className) => { + acc[className] = swalPrefix + className; + return acc; +}, /** @type {SwalClasses} */{}); + +/** @type {SwalIcon[]} */ +const icons = ['success', 'warning', 'info', 'question', 'error']; +const iconTypes = icons.reduce((acc, icon) => { + acc[icon] = swalPrefix + icon; + return acc; +}, /** @type {SwalIcons} */{}); + +const consolePrefix = 'SweetAlert2:'; + +/** + * Capitalize the first letter of a string + * + * @param {string} str + * @returns {string} + */ +const capitalizeFirstLetter = str => str.charAt(0).toUpperCase() + str.slice(1); + +/** + * Standardize console warnings + * + * @param {string | string[]} message + */ +const warn = message => { + console.warn(`${consolePrefix} ${typeof message === 'object' ? message.join(' ') : message}`); +}; + +/** + * Standardize console errors + * + * @param {string} message + */ +const error = message => { + console.error(`${consolePrefix} ${message}`); +}; + +/** + * Private global state for `warnOnce` + * + * @type {string[]} + * @private + */ +const previousWarnOnceMessages = []; + +/** + * Show a console warning, but only if it hasn't already been shown + * + * @param {string} message + */ +const warnOnce = message => { + if (!previousWarnOnceMessages.includes(message)) { + previousWarnOnceMessages.push(message); + warn(message); + } +}; + +/** + * Show a one-time console warning about deprecated params/methods + * + * @param {string} deprecatedParam + * @param {string?} useInstead + */ +const warnAboutDeprecation = (deprecatedParam, useInstead = null) => { + warnOnce(`"${deprecatedParam}" is deprecated and will be removed in the next major release.${useInstead ? ` Use "${useInstead}" instead.` : ''}`); +}; + +/** + * If `arg` is a function, call it (with no arguments or context) and return the result. + * Otherwise, just pass the value through + * + * @param {(() => *) | *} arg + * @returns {*} + */ +const callIfFunction = arg => typeof arg === 'function' ? arg() : arg; + +/** + * @param {*} arg + * @returns {boolean} + */ +const hasToPromiseFn = arg => arg && typeof arg.toPromise === 'function'; + +/** + * @param {*} arg + * @returns {Promise<*>} + */ +const asPromise = arg => hasToPromiseFn(arg) ? arg.toPromise() : Promise.resolve(arg); + +/** + * @param {*} arg + * @returns {boolean} + */ +const isPromise = arg => arg && Promise.resolve(arg) === arg; + +/** + * Gets the popup container which contains the backdrop and the popup itself. + * + * @returns {HTMLElement | null} + */ +const getContainer = () => document.body.querySelector(`.${swalClasses.container}`); + +/** + * @param {string} selectorString + * @returns {HTMLElement | null} + */ +const elementBySelector = selectorString => { + const container = getContainer(); + return container ? container.querySelector(selectorString) : null; +}; + +/** + * @param {string} className + * @returns {HTMLElement | null} + */ +const elementByClass = className => { + return elementBySelector(`.${className}`); +}; + +/** + * @returns {HTMLElement | null} + */ +const getPopup = () => elementByClass(swalClasses.popup); + +/** + * @returns {HTMLElement | null} + */ +const getIcon = () => elementByClass(swalClasses.icon); + +/** + * @returns {HTMLElement | null} + */ +const getIconContent = () => elementByClass(swalClasses['icon-content']); + +/** + * @returns {HTMLElement | null} + */ +const getTitle = () => elementByClass(swalClasses.title); + +/** + * @returns {HTMLElement | null} + */ +const getHtmlContainer = () => elementByClass(swalClasses['html-container']); + +/** + * @returns {HTMLElement | null} + */ +const getImage = () => elementByClass(swalClasses.image); + +/** + * @returns {HTMLElement | null} + */ +const getProgressSteps = () => elementByClass(swalClasses['progress-steps']); + +/** + * @returns {HTMLElement | null} + */ +const getValidationMessage = () => elementByClass(swalClasses['validation-message']); + +/** + * @returns {HTMLButtonElement | null} + */ +const getConfirmButton = () => (/** @type {HTMLButtonElement} */elementBySelector(`.${swalClasses.actions} .${swalClasses.confirm}`)); + +/** + * @returns {HTMLButtonElement | null} + */ +const getCancelButton = () => (/** @type {HTMLButtonElement} */elementBySelector(`.${swalClasses.actions} .${swalClasses.cancel}`)); + +/** + * @returns {HTMLButtonElement | null} + */ +const getDenyButton = () => (/** @type {HTMLButtonElement} */elementBySelector(`.${swalClasses.actions} .${swalClasses.deny}`)); + +/** + * @returns {HTMLElement | null} + */ +const getInputLabel = () => elementByClass(swalClasses['input-label']); + +/** + * @returns {HTMLElement | null} + */ +const getLoader = () => elementBySelector(`.${swalClasses.loader}`); + +/** + * @returns {HTMLElement | null} + */ +const getActions = () => elementByClass(swalClasses.actions); + +/** + * @returns {HTMLElement | null} + */ +const getFooter = () => elementByClass(swalClasses.footer); + +/** + * @returns {HTMLElement | null} + */ +const getTimerProgressBar = () => elementByClass(swalClasses['timer-progress-bar']); + +/** + * @returns {HTMLElement | null} + */ +const getCloseButton = () => elementByClass(swalClasses.close); + +// https://github.com/jkup/focusable/blob/master/index.js +const focusable = ` + a[href], + area[href], + input:not([disabled]), + select:not([disabled]), + textarea:not([disabled]), + button:not([disabled]), + iframe, + object, + embed, + [tabindex="0"], + [contenteditable], + audio[controls], + video[controls], + summary +`; +/** + * @returns {HTMLElement[]} + */ +const getFocusableElements = () => { + const popup = getPopup(); + if (!popup) { + return []; + } + /** @type {NodeListOf} */ + const focusableElementsWithTabindex = popup.querySelectorAll('[tabindex]:not([tabindex="-1"]):not([tabindex="0"])'); + const focusableElementsWithTabindexSorted = Array.from(focusableElementsWithTabindex) + // sort according to tabindex + .sort((a, b) => { + const tabindexA = parseInt(a.getAttribute('tabindex') || '0'); + const tabindexB = parseInt(b.getAttribute('tabindex') || '0'); + if (tabindexA > tabindexB) { + return 1; + } else if (tabindexA < tabindexB) { + return -1; + } + return 0; + }); + + /** @type {NodeListOf} */ + const otherFocusableElements = popup.querySelectorAll(focusable); + const otherFocusableElementsFiltered = Array.from(otherFocusableElements).filter(el => el.getAttribute('tabindex') !== '-1'); + return [...new Set(focusableElementsWithTabindexSorted.concat(otherFocusableElementsFiltered))].filter(el => isVisible$1(el)); +}; + +/** + * @returns {boolean} + */ +const isModal = () => { + return hasClass(document.body, swalClasses.shown) && !hasClass(document.body, swalClasses['toast-shown']) && !hasClass(document.body, swalClasses['no-backdrop']); +}; + +/** + * @returns {boolean} + */ +const isToast = () => { + const popup = getPopup(); + if (!popup) { + return false; + } + return hasClass(popup, swalClasses.toast); +}; + +/** + * @returns {boolean} + */ +const isLoading = () => { + const popup = getPopup(); + if (!popup) { + return false; + } + return popup.hasAttribute('data-loading'); +}; + +/** + * Securely set innerHTML of an element + * https://github.com/sweetalert2/sweetalert2/issues/1926 + * + * @param {HTMLElement} elem + * @param {string} html + */ +const setInnerHtml = (elem, html) => { + elem.textContent = ''; + if (html) { + const parser = new DOMParser(); + const parsed = parser.parseFromString(html, `text/html`); + const head = parsed.querySelector('head'); + if (head) { + Array.from(head.childNodes).forEach(child => { + elem.appendChild(child); + }); + } + const body = parsed.querySelector('body'); + if (body) { + Array.from(body.childNodes).forEach(child => { + if (child instanceof HTMLVideoElement || child instanceof HTMLAudioElement) { + elem.appendChild(child.cloneNode(true)); // https://github.com/sweetalert2/sweetalert2/issues/2507 + } else { + elem.appendChild(child); + } + }); + } + } +}; + +/** + * @param {HTMLElement} elem + * @param {string} className + * @returns {boolean} + */ +const hasClass = (elem, className) => { + if (!className) { + return false; + } + const classList = className.split(/\s+/); + for (let i = 0; i < classList.length; i++) { + if (!elem.classList.contains(classList[i])) { + return false; + } + } + return true; +}; + +/** + * @param {HTMLElement} elem + * @param {SweetAlertOptions} params + */ +const removeCustomClasses = (elem, params) => { + Array.from(elem.classList).forEach(className => { + if (!Object.values(swalClasses).includes(className) && !Object.values(iconTypes).includes(className) && !Object.values(params.showClass || {}).includes(className)) { + elem.classList.remove(className); + } + }); +}; + +/** + * @param {HTMLElement} elem + * @param {SweetAlertOptions} params + * @param {string} className + */ +const applyCustomClass = (elem, params, className) => { + removeCustomClasses(elem, params); + if (!params.customClass) { + return; + } + const customClass = params.customClass[(/** @type {keyof SweetAlertCustomClass} */className)]; + if (!customClass) { + return; + } + if (typeof customClass !== 'string' && !customClass.forEach) { + warn(`Invalid type of customClass.${className}! Expected string or iterable object, got "${typeof customClass}"`); + return; + } + addClass(elem, customClass); +}; + +/** + * @param {HTMLElement} popup + * @param {import('./renderers/renderInput').InputClass | SweetAlertInput} inputClass + * @returns {HTMLInputElement | null} + */ +const getInput$1 = (popup, inputClass) => { + if (!inputClass) { + return null; + } + switch (inputClass) { + case 'select': + case 'textarea': + case 'file': + return popup.querySelector(`.${swalClasses.popup} > .${swalClasses[inputClass]}`); + case 'checkbox': + return popup.querySelector(`.${swalClasses.popup} > .${swalClasses.checkbox} input`); + case 'radio': + return popup.querySelector(`.${swalClasses.popup} > .${swalClasses.radio} input:checked`) || popup.querySelector(`.${swalClasses.popup} > .${swalClasses.radio} input:first-child`); + case 'range': + return popup.querySelector(`.${swalClasses.popup} > .${swalClasses.range} input`); + default: + return popup.querySelector(`.${swalClasses.popup} > .${swalClasses.input}`); + } +}; + +/** + * @param {HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement} input + */ +const focusInput = input => { + input.focus(); + + // place cursor at end of text in text input + if (input.type !== 'file') { + // http://stackoverflow.com/a/2345915 + const val = input.value; + input.value = ''; + input.value = val; + } +}; + +/** + * @param {HTMLElement | HTMLElement[] | null} target + * @param {string | string[] | readonly string[] | undefined} classList + * @param {boolean} condition + */ +const toggleClass = (target, classList, condition) => { + if (!target || !classList) { + return; + } + if (typeof classList === 'string') { + classList = classList.split(/\s+/).filter(Boolean); + } + classList.forEach(className => { + if (Array.isArray(target)) { + target.forEach(elem => { + if (condition) { + elem.classList.add(className); + } else { + elem.classList.remove(className); + } + }); + } else { + if (condition) { + target.classList.add(className); + } else { + target.classList.remove(className); + } + } + }); +}; + +/** + * @param {HTMLElement | HTMLElement[] | null} target + * @param {string | string[] | readonly string[] | undefined} classList + */ +const addClass = (target, classList) => { + toggleClass(target, classList, true); +}; + +/** + * @param {HTMLElement | HTMLElement[] | null} target + * @param {string | string[] | readonly string[] | undefined} classList + */ +const removeClass = (target, classList) => { + toggleClass(target, classList, false); +}; + +/** + * Get direct child of an element by class name + * + * @param {HTMLElement} elem + * @param {string} className + * @returns {HTMLElement | undefined} + */ +const getDirectChildByClass = (elem, className) => { + const children = Array.from(elem.children); + for (let i = 0; i < children.length; i++) { + const child = children[i]; + if (child instanceof HTMLElement && hasClass(child, className)) { + return child; + } + } +}; + +/** + * @param {HTMLElement} elem + * @param {string} property + * @param {string | number | null | undefined} value + */ +const applyNumericalStyle = (elem, property, value) => { + if (value === `${parseInt(`${value}`)}`) { + value = parseInt(value); + } + if (value || parseInt(`${value}`) === 0) { + elem.style.setProperty(property, typeof value === 'number' ? `${value}px` : (/** @type {string} */value)); + } else { + elem.style.removeProperty(property); + } +}; + +/** + * @param {HTMLElement | null} elem + * @param {string} display + */ +const show = (elem, display = 'flex') => { + if (!elem) { + return; + } + elem.style.display = display; +}; + +/** + * @param {HTMLElement | null} elem + */ +const hide = elem => { + if (!elem) { + return; + } + elem.style.display = 'none'; +}; + +/** + * @param {HTMLElement | null} elem + * @param {string} display + */ +const showWhenInnerHtmlPresent = (elem, display = 'block') => { + if (!elem) { + return; + } + new MutationObserver(() => { + toggle(elem, elem.innerHTML, display); + }).observe(elem, { + childList: true, + subtree: true + }); +}; + +/** + * @param {HTMLElement} parent + * @param {string} selector + * @param {string} property + * @param {string} value + */ +const setStyle = (parent, selector, property, value) => { + /** @type {HTMLElement | null} */ + const el = parent.querySelector(selector); + if (el) { + el.style.setProperty(property, value); + } +}; + +/** + * @param {HTMLElement} elem + * @param {boolean | string | null | undefined} condition + * @param {string} display + */ +const toggle = (elem, condition, display = 'flex') => { + if (condition) { + show(elem, display); + } else { + hide(elem); + } +}; + +/** + * borrowed from jquery $(elem).is(':visible') implementation + * + * @param {HTMLElement | null} elem + * @returns {boolean} + */ +const isVisible$1 = elem => Boolean(elem && (elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length)); + +/** + * @returns {boolean} + */ +const allButtonsAreHidden = () => !isVisible$1(getConfirmButton()) && !isVisible$1(getDenyButton()) && !isVisible$1(getCancelButton()); + +/** + * @param {HTMLElement} elem + * @returns {boolean} + */ +const isScrollable = elem => Boolean(elem.scrollHeight > elem.clientHeight); + +/** + * @param {HTMLElement} element + * @param {HTMLElement} stopElement + * @returns {boolean} + */ +const selfOrParentIsScrollable = (element, stopElement) => { + let parent = /** @type {HTMLElement | null} */element; + while (parent && parent !== stopElement) { + if (isScrollable(parent)) { + return true; + } + parent = parent.parentElement; + } + return false; +}; + +/** + * borrowed from https://stackoverflow.com/a/46352119 + * + * @param {HTMLElement} elem + * @returns {boolean} + */ +const hasCssAnimation = elem => { + const style = window.getComputedStyle(elem); + const animDuration = parseFloat(style.getPropertyValue('animation-duration') || '0'); + const transDuration = parseFloat(style.getPropertyValue('transition-duration') || '0'); + return animDuration > 0 || transDuration > 0; +}; + +/** + * @param {number} timer + * @param {boolean} reset + */ +const animateTimerProgressBar = (timer, reset = false) => { + const timerProgressBar = getTimerProgressBar(); + if (!timerProgressBar) { + return; + } + if (isVisible$1(timerProgressBar)) { + if (reset) { + timerProgressBar.style.transition = 'none'; + timerProgressBar.style.width = '100%'; + } + setTimeout(() => { + timerProgressBar.style.transition = `width ${timer / 1000}s linear`; + timerProgressBar.style.width = '0%'; + }, 10); + } +}; +const stopTimerProgressBar = () => { + const timerProgressBar = getTimerProgressBar(); + if (!timerProgressBar) { + return; + } + const timerProgressBarWidth = parseInt(window.getComputedStyle(timerProgressBar).width); + timerProgressBar.style.removeProperty('transition'); + timerProgressBar.style.width = '100%'; + const timerProgressBarFullWidth = parseInt(window.getComputedStyle(timerProgressBar).width); + const timerProgressBarPercent = timerProgressBarWidth / timerProgressBarFullWidth * 100; + timerProgressBar.style.width = `${timerProgressBarPercent}%`; +}; + +/** + * Detect Node env + * + * @returns {boolean} + */ +const isNodeEnv = () => typeof window === 'undefined' || typeof document === 'undefined'; + +const sweetHTML = ` +
            + +
              +
              + +

              +
              + + +
              + + +
              + +
              + + +
              +
              +
              + + + +
              +
              +
              +
              +
              +
              +`.replace(/(^|\n)\s*/g, ''); + +/** + * @returns {boolean} + */ +const resetOldContainer = () => { + const oldContainer = getContainer(); + if (!oldContainer) { + return false; + } + oldContainer.remove(); + removeClass([document.documentElement, document.body], [swalClasses['no-backdrop'], swalClasses['toast-shown'], + // @ts-ignore: 'has-column' is not defined in swalClasses but may be set dynamically + swalClasses['has-column']]); + return true; +}; +const resetValidationMessage$1 = () => { + if (globalState.currentInstance) { + globalState.currentInstance.resetValidationMessage(); + } +}; +const addInputChangeListeners = () => { + const popup = getPopup(); + if (!popup) { + return; + } + const input = getDirectChildByClass(popup, swalClasses.input); + const file = getDirectChildByClass(popup, swalClasses.file); + /** @type {HTMLInputElement | null} */ + const range = popup.querySelector(`.${swalClasses.range} input`); + /** @type {HTMLOutputElement | null} */ + const rangeOutput = popup.querySelector(`.${swalClasses.range} output`); + const select = getDirectChildByClass(popup, swalClasses.select); + /** @type {HTMLInputElement | null} */ + const checkbox = popup.querySelector(`.${swalClasses.checkbox} input`); + const textarea = getDirectChildByClass(popup, swalClasses.textarea); + if (input) { + input.oninput = resetValidationMessage$1; + } + if (file) { + file.onchange = resetValidationMessage$1; + } + if (select) { + select.onchange = resetValidationMessage$1; + } + if (checkbox) { + checkbox.onchange = resetValidationMessage$1; + } + if (textarea) { + textarea.oninput = resetValidationMessage$1; + } + if (range && rangeOutput) { + range.oninput = () => { + resetValidationMessage$1(); + rangeOutput.value = range.value; + }; + range.onchange = () => { + resetValidationMessage$1(); + rangeOutput.value = range.value; + }; + } +}; + +/** + * @param {string | HTMLElement} target + * @returns {HTMLElement} + */ +const getTarget = target => { + if (typeof target === 'string') { + const element = document.querySelector(target); + if (!element) { + throw new Error(`Target element "${target}" not found`); + } + return /** @type {HTMLElement} */element; + } + return target; +}; + +/** + * @param {SweetAlertOptions} params + */ +const setupAccessibility = params => { + const popup = getPopup(); + if (!popup) { + return; + } + popup.setAttribute('role', params.toast ? 'alert' : 'dialog'); + popup.setAttribute('aria-live', params.toast ? 'polite' : 'assertive'); + if (!params.toast) { + popup.setAttribute('aria-modal', 'true'); + } +}; + +/** + * @param {HTMLElement} targetElement + */ +const setupRTL = targetElement => { + if (window.getComputedStyle(targetElement).direction === 'rtl') { + addClass(getContainer(), swalClasses.rtl); + globalState.isRTL = true; + } +}; + +/** + * Add modal + backdrop to DOM + * + * @param {SweetAlertOptions} params + */ +const init = params => { + // Clean up the old popup container if it exists + const oldContainerExisted = resetOldContainer(); + if (isNodeEnv()) { + error('SweetAlert2 requires document to initialize'); + return; + } + const container = document.createElement('div'); + container.className = swalClasses.container; + if (oldContainerExisted) { + addClass(container, swalClasses['no-transition']); + } + setInnerHtml(container, sweetHTML); + container.dataset['swal2Theme'] = params.theme; + const targetElement = getTarget(params.target || 'body'); + targetElement.appendChild(container); + if (params.topLayer) { + container.setAttribute('popover', ''); + container.showPopover(); + } + setupAccessibility(params); + setupRTL(targetElement); + addInputChangeListeners(); +}; + +/** + * @param {HTMLElement | object | string} param + * @param {HTMLElement} target + */ +const parseHtmlToContainer = (param, target) => { + // DOM element + if (param instanceof HTMLElement) { + target.appendChild(param); + } + + // Object + else if (typeof param === 'object') { + handleObject(param, target); + } + + // Plain string + else if (param) { + setInnerHtml(target, param); + } +}; + +/** + * @param {object} param + * @param {HTMLElement} target + */ +const handleObject = (param, target) => { + // JQuery element(s) + if ('jquery' in param) { + handleJqueryElem(target, param); + } + + // For other objects use their string representation + else { + setInnerHtml(target, param.toString()); + } +}; + +/** + * @param {HTMLElement} target + * @param {any} elem + */ +const handleJqueryElem = (target, elem) => { + target.textContent = ''; + if (0 in elem) { + for (let i = 0; i in elem; i++) { + target.appendChild(elem[i].cloneNode(true)); + } + } else { + target.appendChild(elem.cloneNode(true)); + } +}; + +/** + * @param {SweetAlert} instance + * @param {SweetAlertOptions} params + */ +const renderActions = (instance, params) => { + const actions = getActions(); + const loader = getLoader(); + if (!actions || !loader) { + return; + } + + // Actions (buttons) wrapper + if (!params.showConfirmButton && !params.showDenyButton && !params.showCancelButton) { + hide(actions); + } else { + show(actions); + } + + // Custom class + applyCustomClass(actions, params, 'actions'); + + // Render all the buttons + renderButtons(actions, loader, params); + + // Loader + setInnerHtml(loader, params.loaderHtml || ''); + applyCustomClass(loader, params, 'loader'); +}; + +/** + * @param {HTMLElement} actions + * @param {HTMLElement} loader + * @param {SweetAlertOptions} params + */ +function renderButtons(actions, loader, params) { + const confirmButton = getConfirmButton(); + const denyButton = getDenyButton(); + const cancelButton = getCancelButton(); + if (!confirmButton || !denyButton || !cancelButton) { + return; + } + + // Render buttons + renderButton(confirmButton, 'confirm', params); + renderButton(denyButton, 'deny', params); + renderButton(cancelButton, 'cancel', params); + handleButtonsStyling(confirmButton, denyButton, cancelButton, params); + if (params.reverseButtons) { + if (params.toast) { + actions.insertBefore(cancelButton, confirmButton); + actions.insertBefore(denyButton, confirmButton); + } else { + actions.insertBefore(cancelButton, loader); + actions.insertBefore(denyButton, loader); + actions.insertBefore(confirmButton, loader); + } + } +} + +/** + * @param {HTMLElement} confirmButton + * @param {HTMLElement} denyButton + * @param {HTMLElement} cancelButton + * @param {SweetAlertOptions} params + */ +function handleButtonsStyling(confirmButton, denyButton, cancelButton, params) { + if (!params.buttonsStyling) { + removeClass([confirmButton, denyButton, cancelButton], swalClasses.styled); + return; + } + addClass([confirmButton, denyButton, cancelButton], swalClasses.styled); + + // Apply custom background colors to action buttons + if (params.confirmButtonColor) { + confirmButton.style.setProperty('--swal2-confirm-button-background-color', params.confirmButtonColor); + } + if (params.denyButtonColor) { + denyButton.style.setProperty('--swal2-deny-button-background-color', params.denyButtonColor); + } + if (params.cancelButtonColor) { + cancelButton.style.setProperty('--swal2-cancel-button-background-color', params.cancelButtonColor); + } + + // Apply the outline color to action buttons + applyOutlineColor(confirmButton); + applyOutlineColor(denyButton); + applyOutlineColor(cancelButton); +} + +/** + * @param {HTMLElement} button + */ +function applyOutlineColor(button) { + const buttonStyle = window.getComputedStyle(button); + if (buttonStyle.getPropertyValue('--swal2-action-button-focus-box-shadow')) { + // If the button already has a custom outline color, no need to change it + return; + } + const outlineColor = buttonStyle.backgroundColor.replace(/rgba?\((\d+), (\d+), (\d+).*/, 'rgba($1, $2, $3, 0.5)'); + button.style.setProperty('--swal2-action-button-focus-box-shadow', buttonStyle.getPropertyValue('--swal2-outline').replace(/ rgba\(.*/, ` ${outlineColor}`)); +} + +/** + * @param {HTMLElement} button + * @param {'confirm' | 'deny' | 'cancel'} buttonType + * @param {SweetAlertOptions} params + */ +function renderButton(button, buttonType, params) { + const buttonName = /** @type {'Confirm' | 'Deny' | 'Cancel'} */capitalizeFirstLetter(buttonType); + toggle(button, params[`show${buttonName}Button`], 'inline-block'); + setInnerHtml(button, params[`${buttonType}ButtonText`] || ''); // Set caption text + button.setAttribute('aria-label', params[`${buttonType}ButtonAriaLabel`] || ''); // ARIA label + + // Add buttons custom classes + button.className = swalClasses[buttonType]; + applyCustomClass(button, params, `${buttonType}Button`); +} + +/** + * @param {SweetAlert} instance + * @param {SweetAlertOptions} params + */ +const renderCloseButton = (instance, params) => { + const closeButton = getCloseButton(); + if (!closeButton) { + return; + } + setInnerHtml(closeButton, params.closeButtonHtml || ''); + + // Custom class + applyCustomClass(closeButton, params, 'closeButton'); + toggle(closeButton, params.showCloseButton); + closeButton.setAttribute('aria-label', params.closeButtonAriaLabel || ''); +}; + +/** + * @param {SweetAlert} instance + * @param {SweetAlertOptions} params + */ +const renderContainer = (instance, params) => { + const container = getContainer(); + if (!container) { + return; + } + handleBackdropParam(container, params.backdrop); + handlePositionParam(container, params.position); + handleGrowParam(container, params.grow); + + // Custom class + applyCustomClass(container, params, 'container'); +}; + +/** + * @param {HTMLElement} container + * @param {SweetAlertOptions['backdrop']} backdrop + */ +function handleBackdropParam(container, backdrop) { + if (typeof backdrop === 'string') { + container.style.background = backdrop; + } else if (!backdrop) { + addClass([document.documentElement, document.body], swalClasses['no-backdrop']); + } +} + +/** + * @param {HTMLElement} container + * @param {SweetAlertOptions['position']} position + */ +function handlePositionParam(container, position) { + if (!position) { + return; + } + if (position in swalClasses) { + addClass(container, swalClasses[position]); + } else { + warn('The "position" parameter is not valid, defaulting to "center"'); + addClass(container, swalClasses.center); + } +} + +/** + * @param {HTMLElement} container + * @param {SweetAlertOptions['grow']} grow + */ +function handleGrowParam(container, grow) { + if (!grow) { + return; + } + addClass(container, swalClasses[`grow-${grow}`]); +} + +/** + * This module contains `WeakMap`s for each effectively-"private property" that a `Swal` has. + * For example, to set the private property "foo" of `this` to "bar", you can `privateProps.foo.set(this, 'bar')` + * This is the approach that Babel will probably take to implement private methods/fields + * https://github.com/tc39/proposal-private-methods + * https://github.com/babel/babel/pull/7555 + * Once we have the changes from that PR in Babel, and our core class fits reasonable in *one module* + * then we can use that language feature. + */ + +var privateProps = { + innerParams: new WeakMap(), + domCache: new WeakMap() +}; + +/// + + +/** @type {InputClass[]} */ +const inputClasses = ['input', 'file', 'range', 'select', 'radio', 'checkbox', 'textarea']; + +/** + * @param {SweetAlert} instance + * @param {SweetAlertOptions} params + */ +const renderInput = (instance, params) => { + const popup = getPopup(); + if (!popup) { + return; + } + const innerParams = privateProps.innerParams.get(instance); + const rerender = !innerParams || params.input !== innerParams.input; + inputClasses.forEach(inputClass => { + const inputContainer = getDirectChildByClass(popup, swalClasses[inputClass]); + if (!inputContainer) { + return; + } + + // set attributes + setAttributes(inputClass, params.inputAttributes); + + // set class + inputContainer.className = swalClasses[inputClass]; + if (rerender) { + hide(inputContainer); + } + }); + if (params.input) { + if (rerender) { + showInput(params); + } + // set custom class + setCustomClass(params); + } +}; + +/** + * @param {SweetAlertOptions} params + */ +const showInput = params => { + if (!params.input) { + return; + } + if (!renderInputType[params.input]) { + error(`Unexpected type of input! Expected ${Object.keys(renderInputType).join(' | ')}, got "${params.input}"`); + return; + } + const inputContainer = getInputContainer(params.input); + if (!inputContainer) { + return; + } + const input = renderInputType[params.input](inputContainer, params); + show(inputContainer); + + // input autofocus + if (params.inputAutoFocus) { + setTimeout(() => { + focusInput(input); + }); + } +}; + +/** + * @param {HTMLInputElement} input + */ +const removeAttributes = input => { + for (let i = 0; i < input.attributes.length; i++) { + const attrName = input.attributes[i].name; + if (!['id', 'type', 'value', 'style'].includes(attrName)) { + input.removeAttribute(attrName); + } + } +}; + +/** + * @param {InputClass} inputClass + * @param {SweetAlertOptions['inputAttributes']} inputAttributes + */ +const setAttributes = (inputClass, inputAttributes) => { + const popup = getPopup(); + if (!popup) { + return; + } + const input = getInput$1(popup, inputClass); + if (!input) { + return; + } + removeAttributes(input); + for (const attr in inputAttributes) { + input.setAttribute(attr, inputAttributes[attr]); + } +}; + +/** + * @param {SweetAlertOptions} params + */ +const setCustomClass = params => { + if (!params.input) { + return; + } + const inputContainer = getInputContainer(params.input); + if (inputContainer) { + applyCustomClass(inputContainer, params, 'input'); + } +}; + +/** + * @param {HTMLInputElement | HTMLTextAreaElement} input + * @param {SweetAlertOptions} params + */ +const setInputPlaceholder = (input, params) => { + if (!input.placeholder && params.inputPlaceholder) { + input.placeholder = params.inputPlaceholder; + } +}; + +/** + * @param {Input} input + * @param {Input} prependTo + * @param {SweetAlertOptions} params + */ +const setInputLabel = (input, prependTo, params) => { + if (params.inputLabel) { + const label = document.createElement('label'); + const labelClass = swalClasses['input-label']; + label.setAttribute('for', input.id); + label.className = labelClass; + if (typeof params.customClass === 'object') { + addClass(label, params.customClass.inputLabel); + } + label.innerText = params.inputLabel; + prependTo.insertAdjacentElement('beforebegin', label); + } +}; + +/** + * @param {SweetAlertInput} inputType + * @returns {HTMLElement | undefined} + */ +const getInputContainer = inputType => { + const popup = getPopup(); + if (!popup) { + return; + } + return getDirectChildByClass(popup, swalClasses[(/** @type {SwalClass} */inputType)] || swalClasses.input); +}; + +/** + * @param {HTMLInputElement | HTMLOutputElement | HTMLTextAreaElement} input + * @param {SweetAlertOptions['inputValue']} inputValue + */ +const checkAndSetInputValue = (input, inputValue) => { + if (['string', 'number'].includes(typeof inputValue)) { + input.value = `${inputValue}`; + } else if (!isPromise(inputValue)) { + warn(`Unexpected type of inputValue! Expected "string", "number" or "Promise", got "${typeof inputValue}"`); + } +}; + +/** @type {Record Input>} */ +const renderInputType = {}; + +/** + * @param {Input | HTMLElement} input + * @param {SweetAlertOptions} params + * @returns {Input} + */ +renderInputType.text = renderInputType.email = renderInputType.password = renderInputType.number = renderInputType.tel = renderInputType.url = renderInputType.search = renderInputType.date = renderInputType['datetime-local'] = renderInputType.time = renderInputType.week = renderInputType.month = /** @type {(input: Input | HTMLElement, params: SweetAlertOptions) => Input} */ +(input, params) => { + const inputElement = /** @type {HTMLInputElement} */input; + checkAndSetInputValue(inputElement, params.inputValue); + setInputLabel(inputElement, inputElement, params); + setInputPlaceholder(inputElement, params); + inputElement.type = /** @type {string} */params.input; + return inputElement; +}; + +/** + * @param {Input | HTMLElement} input + * @param {SweetAlertOptions} params + * @returns {Input} + */ +renderInputType.file = (input, params) => { + const inputElement = /** @type {HTMLInputElement} */input; + setInputLabel(inputElement, inputElement, params); + setInputPlaceholder(inputElement, params); + return inputElement; +}; + +/** + * @param {Input | HTMLElement} range + * @param {SweetAlertOptions} params + * @returns {Input} + */ +renderInputType.range = (range, params) => { + const rangeContainer = /** @type {HTMLElement} */range; + const rangeInput = rangeContainer.querySelector('input'); + const rangeOutput = rangeContainer.querySelector('output'); + if (rangeInput) { + checkAndSetInputValue(rangeInput, params.inputValue); + rangeInput.type = /** @type {string} */params.input; + setInputLabel(rangeInput, /** @type {Input} */range, params); + } + if (rangeOutput) { + checkAndSetInputValue(rangeOutput, params.inputValue); + } + return /** @type {Input} */range; +}; + +/** + * @param {Input | HTMLElement} select + * @param {SweetAlertOptions} params + * @returns {Input} + */ +renderInputType.select = (select, params) => { + const selectElement = /** @type {HTMLSelectElement} */select; + selectElement.textContent = ''; + if (params.inputPlaceholder) { + const placeholder = document.createElement('option'); + setInnerHtml(placeholder, params.inputPlaceholder); + placeholder.value = ''; + placeholder.disabled = true; + placeholder.selected = true; + selectElement.appendChild(placeholder); + } + setInputLabel(selectElement, selectElement, params); + return selectElement; +}; + +/** + * @param {Input | HTMLElement} radio + * @returns {Input} + */ +renderInputType.radio = radio => { + const radioElement = /** @type {HTMLElement} */radio; + radioElement.textContent = ''; + return /** @type {Input} */radio; +}; + +/** + * @param {Input | HTMLElement} checkboxContainer + * @param {SweetAlertOptions} params + * @returns {Input} + */ +renderInputType.checkbox = (checkboxContainer, params) => { + const popup = getPopup(); + if (!popup) { + throw new Error('Popup not found'); + } + const checkbox = getInput$1(popup, 'checkbox'); + if (!checkbox) { + throw new Error('Checkbox input not found'); + } + checkbox.value = '1'; + checkbox.checked = Boolean(params.inputValue); + const containerElement = /** @type {HTMLElement} */checkboxContainer; + const label = containerElement.querySelector('span'); + if (label) { + const placeholderOrLabel = params.inputPlaceholder || params.inputLabel; + if (placeholderOrLabel) { + setInnerHtml(label, placeholderOrLabel); + } + } + return checkbox; +}; + +/** + * @param {Input | HTMLElement} textarea + * @param {SweetAlertOptions} params + * @returns {Input} + */ +renderInputType.textarea = (textarea, params) => { + const textareaElement = /** @type {HTMLTextAreaElement} */textarea; + checkAndSetInputValue(textareaElement, params.inputValue); + setInputPlaceholder(textareaElement, params); + setInputLabel(textareaElement, textareaElement, params); + + /** + * @param {HTMLElement} el + * @returns {number} + */ + const getMargin = el => parseInt(window.getComputedStyle(el).marginLeft) + parseInt(window.getComputedStyle(el).marginRight); + + // https://github.com/sweetalert2/sweetalert2/issues/2291 + setTimeout(() => { + // https://github.com/sweetalert2/sweetalert2/issues/1699 + if ('MutationObserver' in window) { + const popup = getPopup(); + if (!popup) { + return; + } + const initialPopupWidth = parseInt(window.getComputedStyle(popup).width); + const textareaResizeHandler = () => { + // check if texarea is still in document (i.e. popup wasn't closed in the meantime) + if (!document.body.contains(textareaElement)) { + return; + } + const textareaWidth = textareaElement.offsetWidth + getMargin(textareaElement); + const popupElement = getPopup(); + if (popupElement) { + if (textareaWidth > initialPopupWidth) { + popupElement.style.width = `${textareaWidth}px`; + } else { + applyNumericalStyle(popupElement, 'width', params.width); + } + } + }; + new MutationObserver(textareaResizeHandler).observe(textareaElement, { + attributes: true, + attributeFilter: ['style'] + }); + } + }); + return textareaElement; +}; + +/** + * @param {SweetAlert} instance + * @param {SweetAlertOptions} params + */ +const renderContent = (instance, params) => { + const htmlContainer = getHtmlContainer(); + if (!htmlContainer) { + return; + } + showWhenInnerHtmlPresent(htmlContainer); + applyCustomClass(htmlContainer, params, 'htmlContainer'); + + // Content as HTML + if (params.html) { + parseHtmlToContainer(params.html, htmlContainer); + show(htmlContainer, 'block'); + } + + // Content as plain text + else if (params.text) { + htmlContainer.textContent = params.text; + show(htmlContainer, 'block'); + } + + // No content + else { + hide(htmlContainer); + } + renderInput(instance, params); +}; + +/** + * @param {SweetAlert} instance + * @param {SweetAlertOptions} params + */ +const renderFooter = (instance, params) => { + const footer = getFooter(); + if (!footer) { + return; + } + showWhenInnerHtmlPresent(footer); + toggle(footer, Boolean(params.footer), 'block'); + if (params.footer) { + parseHtmlToContainer(params.footer, footer); + } + + // Custom class + applyCustomClass(footer, params, 'footer'); +}; + +/** + * @param {SweetAlert} instance + * @param {SweetAlertOptions} params + */ +const renderIcon = (instance, params) => { + const innerParams = privateProps.innerParams.get(instance); + const icon = getIcon(); + if (!icon) { + return; + } + + // if the given icon already rendered, apply the styling without re-rendering the icon + if (innerParams && params.icon === innerParams.icon) { + // Custom or default content + setContent(icon, params); + applyStyles(icon, params); + return; + } + if (!params.icon && !params.iconHtml) { + hide(icon); + return; + } + if (params.icon && Object.keys(iconTypes).indexOf(params.icon) === -1) { + error(`Unknown icon! Expected "success", "error", "warning", "info" or "question", got "${params.icon}"`); + hide(icon); + return; + } + show(icon); + + // Custom or default content + setContent(icon, params); + applyStyles(icon, params); + + // Animate icon + addClass(icon, params.showClass && params.showClass.icon); + + // Re-adjust the success icon on system theme change + const colorSchemeQueryList = window.matchMedia('(prefers-color-scheme: dark)'); + colorSchemeQueryList.addEventListener('change', adjustSuccessIconBackgroundColor); +}; + +/** + * @param {HTMLElement} icon + * @param {SweetAlertOptions} params + */ +const applyStyles = (icon, params) => { + for (const [iconType, iconClassName] of Object.entries(iconTypes)) { + if (params.icon !== iconType) { + removeClass(icon, iconClassName); + } + } + addClass(icon, params.icon && iconTypes[params.icon]); + + // Icon color + setColor(icon, params); + + // Success icon background color + adjustSuccessIconBackgroundColor(); + + // Custom class + applyCustomClass(icon, params, 'icon'); +}; + +// Adjust success icon background color to match the popup background color +const adjustSuccessIconBackgroundColor = () => { + const popup = getPopup(); + if (!popup) { + return; + } + const popupBackgroundColor = window.getComputedStyle(popup).getPropertyValue('background-color'); + /** @type {NodeListOf} */ + const successIconParts = popup.querySelectorAll('[class^=swal2-success-circular-line], .swal2-success-fix'); + for (let i = 0; i < successIconParts.length; i++) { + successIconParts[i].style.backgroundColor = popupBackgroundColor; + } +}; + +/** + * + * @param {SweetAlertOptions} params + * @returns {string} + */ +const successIconHtml = params => ` + ${params.animation ? '
              ' : ''} + +
              + ${params.animation ? '
              ' : ''} + ${params.animation ? '
              ' : ''} +`; +const errorIconHtml = ` + + + + +`; + +/** + * @param {HTMLElement} icon + * @param {SweetAlertOptions} params + */ +const setContent = (icon, params) => { + if (!params.icon && !params.iconHtml) { + return; + } + let oldContent = icon.innerHTML; + let newContent = ''; + if (params.iconHtml) { + newContent = iconContent(params.iconHtml); + } else if (params.icon === 'success') { + newContent = successIconHtml(params); + oldContent = oldContent.replace(/ style=".*?"/g, ''); // undo adjustSuccessIconBackgroundColor() + } else if (params.icon === 'error') { + newContent = errorIconHtml; + } else if (params.icon) { + const defaultIconHtml = { + question: '?', + warning: '!', + info: 'i' + }; + newContent = iconContent(defaultIconHtml[params.icon]); + } + if (oldContent.trim() !== newContent.trim()) { + setInnerHtml(icon, newContent); + } +}; + +/** + * @param {HTMLElement} icon + * @param {SweetAlertOptions} params + */ +const setColor = (icon, params) => { + if (!params.iconColor) { + return; + } + icon.style.color = params.iconColor; + icon.style.borderColor = params.iconColor; + for (const sel of ['.swal2-success-line-tip', '.swal2-success-line-long', '.swal2-x-mark-line-left', '.swal2-x-mark-line-right']) { + setStyle(icon, sel, 'background-color', params.iconColor); + } + setStyle(icon, '.swal2-success-ring', 'border-color', params.iconColor); +}; + +/** + * @param {string} content + * @returns {string} + */ +const iconContent = content => `
              ${content}
              `; + +/** + * @param {SweetAlert} instance + * @param {SweetAlertOptions} params + */ +const renderImage = (instance, params) => { + const image = getImage(); + if (!image) { + return; + } + if (!params.imageUrl) { + hide(image); + return; + } + show(image, ''); + + // Src, alt + image.setAttribute('src', params.imageUrl); + image.setAttribute('alt', params.imageAlt || ''); + + // Width, height + applyNumericalStyle(image, 'width', params.imageWidth); + applyNumericalStyle(image, 'height', params.imageHeight); + + // Class + image.className = swalClasses.image; + applyCustomClass(image, params, 'image'); +}; + +let dragging = false; +let mousedownX = 0; +let mousedownY = 0; +let initialX = 0; +let initialY = 0; + +/** + * @param {HTMLElement} popup + */ +const addDraggableListeners = popup => { + popup.addEventListener('mousedown', down); + document.body.addEventListener('mousemove', move); + popup.addEventListener('mouseup', up); + popup.addEventListener('touchstart', down); + document.body.addEventListener('touchmove', move); + popup.addEventListener('touchend', up); +}; + +/** + * @param {HTMLElement} popup + */ +const removeDraggableListeners = popup => { + popup.removeEventListener('mousedown', down); + document.body.removeEventListener('mousemove', move); + popup.removeEventListener('mouseup', up); + popup.removeEventListener('touchstart', down); + document.body.removeEventListener('touchmove', move); + popup.removeEventListener('touchend', up); +}; + +/** + * @param {MouseEvent | TouchEvent} event + */ +const down = event => { + const popup = getPopup(); + if (!popup) { + return; + } + const icon = getIcon(); + if (event.target === popup || icon && icon.contains(/** @type {HTMLElement} */event.target)) { + dragging = true; + const clientXY = getClientXY(event); + mousedownX = clientXY.clientX; + mousedownY = clientXY.clientY; + initialX = parseInt(popup.style.insetInlineStart) || 0; + initialY = parseInt(popup.style.insetBlockStart) || 0; + addClass(popup, 'swal2-dragging'); + } +}; + +/** + * @param {MouseEvent | TouchEvent} event + */ +const move = event => { + const popup = getPopup(); + if (!popup) { + return; + } + if (dragging) { + let { + clientX, + clientY + } = getClientXY(event); + const deltaX = clientX - mousedownX; + // In RTL mode, negate the horizontal delta since insetInlineStart refers to the right edge + popup.style.insetInlineStart = `${initialX + (globalState.isRTL ? -deltaX : deltaX)}px`; + popup.style.insetBlockStart = `${initialY + (clientY - mousedownY)}px`; + } +}; +const up = () => { + const popup = getPopup(); + dragging = false; + removeClass(popup, 'swal2-dragging'); +}; + +/** + * @param {MouseEvent | TouchEvent} event + * @returns {{ clientX: number, clientY: number }} + */ +const getClientXY = event => { + let clientX = 0, + clientY = 0; + if (event.type.startsWith('mouse')) { + clientX = /** @type {MouseEvent} */event.clientX; + clientY = /** @type {MouseEvent} */event.clientY; + } else if (event.type.startsWith('touch')) { + clientX = /** @type {TouchEvent} */event.touches[0].clientX; + clientY = /** @type {TouchEvent} */event.touches[0].clientY; + } + return { + clientX, + clientY + }; +}; + +/** + * @param {SweetAlert} instance + * @param {SweetAlertOptions} params + */ +const renderPopup = (instance, params) => { + const container = getContainer(); + const popup = getPopup(); + if (!container || !popup) { + return; + } + + // Width + // https://github.com/sweetalert2/sweetalert2/issues/2170 + if (params.toast) { + applyNumericalStyle(container, 'width', params.width); + popup.style.width = '100%'; + const loader = getLoader(); + if (loader) { + popup.insertBefore(loader, getIcon()); + } + } else { + applyNumericalStyle(popup, 'width', params.width); + } + + // Padding + applyNumericalStyle(popup, 'padding', params.padding); + + // Color + if (params.color) { + popup.style.color = params.color; + } + + // Background + if (params.background) { + popup.style.background = params.background; + } + hide(getValidationMessage()); + + // Classes + addClasses$1(popup, params); + if (params.draggable && !params.toast) { + addClass(popup, swalClasses.draggable); + addDraggableListeners(popup); + } else { + removeClass(popup, swalClasses.draggable); + removeDraggableListeners(popup); + } +}; + +/** + * @param {HTMLElement} popup + * @param {SweetAlertOptions} params + */ +const addClasses$1 = (popup, params) => { + const showClass = params.showClass || {}; + // Default Class + showClass when updating Swal.update({}) + popup.className = `${swalClasses.popup} ${isVisible$1(popup) ? showClass.popup : ''}`; + if (params.toast) { + addClass([document.documentElement, document.body], swalClasses['toast-shown']); + addClass(popup, swalClasses.toast); + } else { + addClass(popup, swalClasses.modal); + } + + // Custom class + applyCustomClass(popup, params, 'popup'); + // TODO: remove in the next major + if (typeof params.customClass === 'string') { + addClass(popup, params.customClass); + } + + // Icon class (#1842) + if (params.icon) { + addClass(popup, swalClasses[`icon-${params.icon}`]); + } +}; + +/** + * @param {SweetAlert} instance + * @param {SweetAlertOptions} params + */ +const renderProgressSteps = (instance, params) => { + const progressStepsContainer = getProgressSteps(); + if (!progressStepsContainer) { + return; + } + const { + progressSteps, + currentProgressStep + } = params; + if (!progressSteps || progressSteps.length === 0 || currentProgressStep === undefined) { + hide(progressStepsContainer); + return; + } + show(progressStepsContainer); + progressStepsContainer.textContent = ''; + if (currentProgressStep >= progressSteps.length) { + warn('Invalid currentProgressStep parameter, it should be less than progressSteps.length ' + '(currentProgressStep like JS arrays starts from 0)'); + } + progressSteps.forEach((step, index) => { + const stepEl = createStepElement(step); + progressStepsContainer.appendChild(stepEl); + if (index === currentProgressStep) { + addClass(stepEl, swalClasses['active-progress-step']); + } + if (index !== progressSteps.length - 1) { + const lineEl = createLineElement(params); + progressStepsContainer.appendChild(lineEl); + } + }); +}; + +/** + * @param {string} step + * @returns {HTMLLIElement} + */ +const createStepElement = step => { + const stepEl = document.createElement('li'); + addClass(stepEl, swalClasses['progress-step']); + setInnerHtml(stepEl, step); + return stepEl; +}; + +/** + * @param {SweetAlertOptions} params + * @returns {HTMLLIElement} + */ +const createLineElement = params => { + const lineEl = document.createElement('li'); + addClass(lineEl, swalClasses['progress-step-line']); + if (params.progressStepsDistance) { + applyNumericalStyle(lineEl, 'width', params.progressStepsDistance); + } + return lineEl; +}; + +/** + * @param {SweetAlert} instance + * @param {SweetAlertOptions} params + */ +const renderTitle = (instance, params) => { + const title = getTitle(); + if (!title) { + return; + } + showWhenInnerHtmlPresent(title); + toggle(title, Boolean(params.title || params.titleText), 'block'); + if (params.title) { + parseHtmlToContainer(params.title, title); + } + if (params.titleText) { + title.innerText = params.titleText; + } + + // Custom class + applyCustomClass(title, params, 'title'); +}; + +/** + * @param {SweetAlert} instance + * @param {SweetAlertOptions} params + */ +const render = (instance, params) => { + var _globalState$eventEmi; + renderPopup(instance, params); + renderContainer(instance, params); + renderProgressSteps(instance, params); + renderIcon(instance, params); + renderImage(instance, params); + renderTitle(instance, params); + renderCloseButton(instance, params); + renderContent(instance, params); + renderActions(instance, params); + renderFooter(instance, params); + const popup = getPopup(); + if (typeof params.didRender === 'function' && popup) { + params.didRender(popup); + } + (_globalState$eventEmi = globalState.eventEmitter) === null || _globalState$eventEmi === void 0 || _globalState$eventEmi.emit('didRender', popup); +}; + +/* + * Global function to determine if SweetAlert2 popup is shown + */ +const isVisible = () => { + return isVisible$1(getPopup()); +}; + +/* + * Global function to click 'Confirm' button + */ +const clickConfirm = () => { + var _dom$getConfirmButton; + return (_dom$getConfirmButton = getConfirmButton()) === null || _dom$getConfirmButton === void 0 ? void 0 : _dom$getConfirmButton.click(); +}; + +/* + * Global function to click 'Deny' button + */ +const clickDeny = () => { + var _dom$getDenyButton; + return (_dom$getDenyButton = getDenyButton()) === null || _dom$getDenyButton === void 0 ? void 0 : _dom$getDenyButton.click(); +}; + +/* + * Global function to click 'Cancel' button + */ +const clickCancel = () => { + var _dom$getCancelButton; + return (_dom$getCancelButton = getCancelButton()) === null || _dom$getCancelButton === void 0 ? void 0 : _dom$getCancelButton.click(); +}; + +/** @type {Record} */ +const DismissReason = Object.freeze({ + cancel: 'cancel', + backdrop: 'backdrop', + close: 'close', + esc: 'esc', + timer: 'timer' +}); + +/** + * @param {GlobalState} globalState + */ +const removeKeydownHandler = globalState => { + if (globalState.keydownTarget && globalState.keydownHandlerAdded && globalState.keydownHandler) { + const handler = /** @type {EventListenerOrEventListenerObject} */ /** @type {unknown} */globalState.keydownHandler; + globalState.keydownTarget.removeEventListener('keydown', handler, { + capture: globalState.keydownListenerCapture + }); + globalState.keydownHandlerAdded = false; + } +}; + +/** + * @param {GlobalState} globalState + * @param {SweetAlertOptions} innerParams + * @param {(dismiss: DismissReason) => void} dismissWith + */ +const addKeydownHandler = (globalState, innerParams, dismissWith) => { + removeKeydownHandler(globalState); + if (!innerParams.toast) { + /** @type {(this: HTMLElement, event: KeyboardEvent) => void} */ + const handler = e => keydownHandler(innerParams, e, dismissWith); + globalState.keydownHandler = handler; + const target = innerParams.keydownListenerCapture ? window : getPopup(); + if (target) { + globalState.keydownTarget = target; + globalState.keydownListenerCapture = innerParams.keydownListenerCapture; + const eventHandler = /** @type {EventListenerOrEventListenerObject} */ /** @type {unknown} */handler; + globalState.keydownTarget.addEventListener('keydown', eventHandler, { + capture: globalState.keydownListenerCapture + }); + globalState.keydownHandlerAdded = true; + } + } +}; + +/** + * @param {number} index + * @param {number} increment + */ +const setFocus = (index, increment) => { + var _dom$getPopup; + const focusableElements = getFocusableElements(); + // search for visible elements and select the next possible match + if (focusableElements.length) { + index = index + increment; + + // shift + tab when .swal2-popup is focused + if (index === -2) { + index = focusableElements.length - 1; + } + + // rollover to first item + if (index === focusableElements.length) { + index = 0; + + // go to last item + } else if (index === -1) { + index = focusableElements.length - 1; + } + focusableElements[index].focus(); + return; + } + // no visible focusable elements, focus the popup + (_dom$getPopup = getPopup()) === null || _dom$getPopup === void 0 || _dom$getPopup.focus(); +}; +const arrowKeysNextButton = ['ArrowRight', 'ArrowDown']; +const arrowKeysPreviousButton = ['ArrowLeft', 'ArrowUp']; + +/** + * @param {SweetAlertOptions} innerParams + * @param {KeyboardEvent} event + * @param {(dismiss: DismissReason) => void} dismissWith + */ +const keydownHandler = (innerParams, event, dismissWith) => { + if (!innerParams) { + return; // This instance has already been destroyed + } + + // Ignore keydown during IME composition + // https://developer.mozilla.org/en-US/docs/Web/API/Document/keydown_event#ignoring_keydown_during_ime_composition + // https://github.com/sweetalert2/sweetalert2/issues/720 + // https://github.com/sweetalert2/sweetalert2/issues/2406 + if (event.isComposing || event.keyCode === 229) { + return; + } + if (innerParams.stopKeydownPropagation) { + event.stopPropagation(); + } + + // ENTER + if (event.key === 'Enter') { + handleEnter(event, innerParams); + } + + // TAB + else if (event.key === 'Tab') { + handleTab(event); + } + + // ARROWS - switch focus between buttons + else if ([...arrowKeysNextButton, ...arrowKeysPreviousButton].includes(event.key)) { + handleArrows(event.key); + } + + // ESC + else if (event.key === 'Escape') { + handleEsc(event, innerParams, dismissWith); + } +}; + +/** + * @param {KeyboardEvent} event + * @param {SweetAlertOptions} innerParams + */ +const handleEnter = (event, innerParams) => { + // https://github.com/sweetalert2/sweetalert2/issues/2386 + if (!callIfFunction(innerParams.allowEnterKey)) { + return; + } + const popup = getPopup(); + if (!popup || !innerParams.input) { + return; + } + const input = getInput$1(popup, innerParams.input); + if (event.target && input && event.target instanceof HTMLElement && event.target.outerHTML === input.outerHTML) { + if (['textarea', 'file'].includes(innerParams.input)) { + return; // do not submit + } + clickConfirm(); + event.preventDefault(); + } +}; + +/** + * @param {KeyboardEvent} event + */ +const handleTab = event => { + const targetElement = event.target; + const focusableElements = getFocusableElements(); + let btnIndex = -1; + for (let i = 0; i < focusableElements.length; i++) { + if (targetElement === focusableElements[i]) { + btnIndex = i; + break; + } + } + + // Cycle to the next button + if (!event.shiftKey) { + setFocus(btnIndex, 1); + } + + // Cycle to the prev button + else { + setFocus(btnIndex, -1); + } + event.stopPropagation(); + event.preventDefault(); +}; + +/** + * @param {string} key + */ +const handleArrows = key => { + const actions = getActions(); + const confirmButton = getConfirmButton(); + const denyButton = getDenyButton(); + const cancelButton = getCancelButton(); + if (!actions || !confirmButton || !denyButton || !cancelButton) { + return; + } + /** @type HTMLElement[] */ + const buttons = [confirmButton, denyButton, cancelButton]; + if (document.activeElement instanceof HTMLElement && !buttons.includes(document.activeElement)) { + return; + } + const sibling = arrowKeysNextButton.includes(key) ? 'nextElementSibling' : 'previousElementSibling'; + let buttonToFocus = document.activeElement; + if (!buttonToFocus) { + return; + } + for (let i = 0; i < actions.children.length; i++) { + buttonToFocus = buttonToFocus[sibling]; + if (!buttonToFocus) { + return; + } + if (buttonToFocus instanceof HTMLButtonElement && isVisible$1(buttonToFocus)) { + break; + } + } + if (buttonToFocus instanceof HTMLButtonElement) { + buttonToFocus.focus(); + } +}; + +/** + * @param {KeyboardEvent} event + * @param {SweetAlertOptions} innerParams + * @param {(dismiss: DismissReason) => void} dismissWith + */ +const handleEsc = (event, innerParams, dismissWith) => { + event.preventDefault(); + if (callIfFunction(innerParams.allowEscapeKey)) { + dismissWith(DismissReason.esc); + } +}; + +/** + * This module contains `WeakMap`s for each effectively-"private property" that a `Swal` has. + * For example, to set the private property "foo" of `this` to "bar", you can `privateProps.foo.set(this, 'bar')` + * This is the approach that Babel will probably take to implement private methods/fields + * https://github.com/tc39/proposal-private-methods + * https://github.com/babel/babel/pull/7555 + * Once we have the changes from that PR in Babel, and our core class fits reasonable in *one module* + * then we can use that language feature. + */ + +var privateMethods = { + swalPromiseResolve: new WeakMap(), + swalPromiseReject: new WeakMap() +}; + +// From https://developer.paciellogroup.com/blog/2018/06/the-current-state-of-modal-dialog-accessibility/ +// Adding aria-hidden="true" to elements outside of the active modal dialog ensures that +// elements not within the active modal dialog will not be surfaced if a user opens a screen +// reader’s list of elements (headings, form controls, landmarks, etc.) in the document. + +const setAriaHidden = () => { + const container = getContainer(); + const bodyChildren = Array.from(document.body.children); + bodyChildren.forEach(el => { + if (el.contains(container)) { + return; + } + if (el.hasAttribute('aria-hidden')) { + el.setAttribute('data-previous-aria-hidden', el.getAttribute('aria-hidden') || ''); + } + el.setAttribute('aria-hidden', 'true'); + }); +}; +const unsetAriaHidden = () => { + const bodyChildren = Array.from(document.body.children); + bodyChildren.forEach(el => { + if (el.hasAttribute('data-previous-aria-hidden')) { + el.setAttribute('aria-hidden', el.getAttribute('data-previous-aria-hidden') || ''); + el.removeAttribute('data-previous-aria-hidden'); + } else { + el.removeAttribute('aria-hidden'); + } + }); +}; + +// @ts-ignore +const isSafariOrIOS = typeof window !== 'undefined' && Boolean(window.GestureEvent); // true for Safari desktop + all iOS browsers https://stackoverflow.com/a/70585394 + +/** + * Fix iOS scrolling + * http://stackoverflow.com/q/39626302 + */ +const iOSfix = () => { + if (isSafariOrIOS && !hasClass(document.body, swalClasses.iosfix)) { + const offset = document.body.scrollTop; + document.body.style.top = `${offset * -1}px`; + addClass(document.body, swalClasses.iosfix); + lockBodyScroll(); + } +}; + +/** + * https://github.com/sweetalert2/sweetalert2/issues/1246 + */ +const lockBodyScroll = () => { + const container = getContainer(); + if (!container) { + return; + } + /** @type {boolean} */ + let preventTouchMove; + /** + * @param {TouchEvent} event + */ + container.ontouchstart = event => { + preventTouchMove = shouldPreventTouchMove(event); + }; + /** + * @param {TouchEvent} event + */ + container.ontouchmove = event => { + if (preventTouchMove) { + event.preventDefault(); + event.stopPropagation(); + } + }; +}; + +/** + * @param {TouchEvent} event + * @returns {boolean} + */ +const shouldPreventTouchMove = event => { + const target = event.target; + const container = getContainer(); + const htmlContainer = getHtmlContainer(); + if (!container || !htmlContainer) { + return false; + } + if (isStylus(event) || isZoom(event)) { + return false; + } + if (target === container) { + return true; + } + if (!isScrollable(container) && target instanceof HTMLElement && !selfOrParentIsScrollable(target, htmlContainer) && + // #2823 + target.tagName !== 'INPUT' && + // #1603 + target.tagName !== 'TEXTAREA' && + // #2266 + !(isScrollable(htmlContainer) && + // #1944 + htmlContainer.contains(target))) { + return true; + } + return false; +}; + +/** + * https://github.com/sweetalert2/sweetalert2/issues/1786 + * + * @param {TouchEvent} event + * @returns {boolean} + */ +const isStylus = event => { + return Boolean(event.touches && event.touches.length && + // @ts-ignore - touchType is not a standard property + event.touches[0].touchType === 'stylus'); +}; + +/** + * https://github.com/sweetalert2/sweetalert2/issues/1891 + * + * @param {TouchEvent} event + * @returns {boolean} + */ +const isZoom = event => { + return event.touches && event.touches.length > 1; +}; +const undoIOSfix = () => { + if (hasClass(document.body, swalClasses.iosfix)) { + const offset = parseInt(document.body.style.top, 10); + removeClass(document.body, swalClasses.iosfix); + document.body.style.top = ''; + document.body.scrollTop = offset * -1; + } +}; + +/** + * Measure scrollbar width for padding body during modal show/hide + * https://github.com/twbs/bootstrap/blob/master/js/src/modal.js + * + * @returns {number} + */ +const measureScrollbar = () => { + const scrollDiv = document.createElement('div'); + scrollDiv.className = swalClasses['scrollbar-measure']; + document.body.appendChild(scrollDiv); + const scrollbarWidth = scrollDiv.getBoundingClientRect().width - scrollDiv.clientWidth; + document.body.removeChild(scrollDiv); + return scrollbarWidth; +}; + +/** + * Remember state in cases where opening and handling a modal will fiddle with it. + * @type {number | null} + */ +let previousBodyPadding = null; + +/** + * @param {string} initialBodyOverflow + */ +const replaceScrollbarWithPadding = initialBodyOverflow => { + // for queues, do not do this more than once + if (previousBodyPadding !== null) { + return; + } + // if the body has overflow + if (document.body.scrollHeight > window.innerHeight || initialBodyOverflow === 'scroll' // https://github.com/sweetalert2/sweetalert2/issues/2663 + ) { + // add padding so the content doesn't shift after removal of scrollbar + previousBodyPadding = parseInt(window.getComputedStyle(document.body).getPropertyValue('padding-right')); + document.body.style.paddingRight = `${previousBodyPadding + measureScrollbar()}px`; + } +}; +const undoReplaceScrollbarWithPadding = () => { + if (previousBodyPadding !== null) { + document.body.style.paddingRight = `${previousBodyPadding}px`; + previousBodyPadding = null; + } +}; + +/** + * @param {SweetAlert} instance + * @param {HTMLElement} container + * @param {boolean} returnFocus + * @param {(() => void) | undefined} didClose + */ +function removePopupAndResetState(instance, container, returnFocus, didClose) { + if (isToast()) { + triggerDidCloseAndDispose(instance, didClose); + } else { + restoreActiveElement(returnFocus).then(() => triggerDidCloseAndDispose(instance, didClose)); + removeKeydownHandler(globalState); + } + + // workaround for https://github.com/sweetalert2/sweetalert2/issues/2088 + // for some reason removing the container in Safari will scroll the document to bottom + if (isSafariOrIOS) { + container.setAttribute('style', 'display:none !important'); + container.removeAttribute('class'); + container.innerHTML = ''; + } else { + container.remove(); + } + if (isModal()) { + undoReplaceScrollbarWithPadding(); + undoIOSfix(); + unsetAriaHidden(); + } + removeBodyClasses(); +} + +/** + * Remove SweetAlert2 classes from body + */ +function removeBodyClasses() { + removeClass([document.documentElement, document.body], [swalClasses.shown, swalClasses['height-auto'], swalClasses['no-backdrop'], swalClasses['toast-shown']]); +} + +/** + * Instance method to close sweetAlert + * + * @param {SweetAlertResult | undefined} resolveValue + * @this {SweetAlert} + */ +function close(resolveValue) { + resolveValue = prepareResolveValue(resolveValue); + const swalPromiseResolve = privateMethods.swalPromiseResolve.get(this); + const didClose = triggerClosePopup(this); + if (this.isAwaitingPromise) { + // A swal awaiting for a promise (after a click on Confirm or Deny) cannot be dismissed anymore #2335 + if (!resolveValue.isDismissed) { + handleAwaitingPromise(this); + swalPromiseResolve(resolveValue); + } + } else if (didClose) { + // Resolve Swal promise + swalPromiseResolve(resolveValue); + } +} + +/** + * @param {SweetAlert} instance + * @returns {boolean} + */ +const triggerClosePopup = instance => { + const popup = getPopup(); + if (!popup) { + return false; + } + const innerParams = privateProps.innerParams.get(instance); + if (!innerParams || hasClass(popup, innerParams.hideClass.popup)) { + return false; + } + removeClass(popup, innerParams.showClass.popup); + addClass(popup, innerParams.hideClass.popup); + const backdrop = getContainer(); + removeClass(backdrop, innerParams.showClass.backdrop); + addClass(backdrop, innerParams.hideClass.backdrop); + handlePopupAnimation(instance, popup, innerParams); + return true; +}; + +/** + * @param {Error | string} error + * @this {SweetAlert} + */ +function rejectPromise(error) { + const rejectPromise = privateMethods.swalPromiseReject.get(this); + handleAwaitingPromise(this); + if (rejectPromise) { + // Reject Swal promise + rejectPromise(error); + } +} + +/** + * @param {SweetAlert} instance + */ +const handleAwaitingPromise = instance => { + if (instance.isAwaitingPromise) { + // @ts-ignore + delete instance.isAwaitingPromise; + // The instance might have been previously partly destroyed, we must resume the destroy process in this case #2335 + if (!privateProps.innerParams.get(instance)) { + instance._destroy(); + } + } +}; + +/** + * @param {SweetAlertResult | undefined} resolveValue + * @returns {SweetAlertResult} + */ +const prepareResolveValue = resolveValue => { + // When user calls Swal.close() + if (typeof resolveValue === 'undefined') { + return { + isConfirmed: false, + isDenied: false, + isDismissed: true + }; + } + return Object.assign({ + isConfirmed: false, + isDenied: false, + isDismissed: false + }, resolveValue); +}; + +/** + * @param {SweetAlert} instance + * @param {HTMLElement} popup + * @param {SweetAlertOptions} innerParams + */ +const handlePopupAnimation = (instance, popup, innerParams) => { + var _globalState$eventEmi; + const container = getContainer(); + // If animation is supported, animate + const animationIsSupported = hasCssAnimation(popup); + if (typeof innerParams.willClose === 'function') { + innerParams.willClose(popup); + } + (_globalState$eventEmi = globalState.eventEmitter) === null || _globalState$eventEmi === void 0 || _globalState$eventEmi.emit('willClose', popup); + if (animationIsSupported && container) { + animatePopup(instance, popup, container, Boolean(innerParams.returnFocus), innerParams.didClose); + } else if (container) { + // Otherwise, remove immediately + removePopupAndResetState(instance, container, Boolean(innerParams.returnFocus), innerParams.didClose); + } +}; + +/** + * @param {SweetAlert} instance + * @param {HTMLElement} popup + * @param {HTMLElement} container + * @param {boolean} returnFocus + * @param {(() => void) | undefined} didClose + */ +const animatePopup = (instance, popup, container, returnFocus, didClose) => { + globalState.swalCloseEventFinishedCallback = removePopupAndResetState.bind(null, instance, container, returnFocus, didClose); + /** + * @param {AnimationEvent | TransitionEvent} e + */ + const swalCloseAnimationFinished = function (e) { + if (e.target === popup) { + var _globalState$swalClos; + (_globalState$swalClos = globalState.swalCloseEventFinishedCallback) === null || _globalState$swalClos === void 0 || _globalState$swalClos.call(globalState); + delete globalState.swalCloseEventFinishedCallback; + popup.removeEventListener('animationend', swalCloseAnimationFinished); + popup.removeEventListener('transitionend', swalCloseAnimationFinished); + } + }; + popup.addEventListener('animationend', swalCloseAnimationFinished); + popup.addEventListener('transitionend', swalCloseAnimationFinished); +}; + +/** + * @param {SweetAlert} instance + * @param {(() => void) | undefined} didClose + */ +const triggerDidCloseAndDispose = (instance, didClose) => { + setTimeout(() => { + var _globalState$eventEmi2; + if (typeof didClose === 'function') { + didClose.bind(instance.params)(); + } + (_globalState$eventEmi2 = globalState.eventEmitter) === null || _globalState$eventEmi2 === void 0 || _globalState$eventEmi2.emit('didClose'); + // instance might have been destroyed already + if (instance._destroy) { + instance._destroy(); + } + }); +}; + +/** + * Shows loader (spinner), this is useful with AJAX requests. + * By default the loader be shown instead of the "Confirm" button. + * + * @param {HTMLButtonElement | null} [buttonToReplace] + */ +const showLoading = buttonToReplace => { + let popup = getPopup(); + if (!popup) { + new Swal(); + } + popup = getPopup(); + if (!popup) { + return; + } + const loader = getLoader(); + if (isToast()) { + hide(getIcon()); + } else { + replaceButton(popup, buttonToReplace); + } + show(loader); + popup.setAttribute('data-loading', 'true'); + popup.setAttribute('aria-busy', 'true'); + popup.focus(); +}; + +/** + * @param {HTMLElement} popup + * @param {HTMLButtonElement | null} [buttonToReplace] + */ +const replaceButton = (popup, buttonToReplace) => { + const actions = getActions(); + const loader = getLoader(); + if (!actions || !loader) { + return; + } + if (!buttonToReplace && isVisible$1(getConfirmButton())) { + buttonToReplace = getConfirmButton(); + } + show(actions); + if (buttonToReplace) { + hide(buttonToReplace); + loader.setAttribute('data-button-to-replace', buttonToReplace.className); + actions.insertBefore(loader, buttonToReplace); + } + addClass([popup, actions], swalClasses.loading); +}; + +/** + * @param {SweetAlert} instance + * @param {SweetAlertOptions} params + */ +const handleInputOptionsAndValue = (instance, params) => { + if (params.input === 'select' || params.input === 'radio') { + handleInputOptions(instance, params); + } else if (['text', 'email', 'number', 'tel', 'textarea'].some(i => i === params.input) && (hasToPromiseFn(params.inputValue) || isPromise(params.inputValue))) { + showLoading(getConfirmButton()); + handleInputValue(instance, params); + } +}; + +/** + * @param {SweetAlert} instance + * @param {SweetAlertOptions} innerParams + * @returns {SweetAlertInputValue} + */ +const getInputValue = (instance, innerParams) => { + const input = instance.getInput(); + if (!input) { + return null; + } + switch (innerParams.input) { + case 'checkbox': + return getCheckboxValue(input); + case 'radio': + return getRadioValue(input); + case 'file': + return getFileValue(input); + default: + return innerParams.inputAutoTrim ? input.value.trim() : input.value; + } +}; + +/** + * @param {HTMLInputElement} input + * @returns {number} + */ +const getCheckboxValue = input => input.checked ? 1 : 0; + +/** + * @param {HTMLInputElement} input + * @returns {string | null} + */ +const getRadioValue = input => input.checked ? input.value : null; + +/** + * @param {HTMLInputElement} input + * @returns {FileList | File | null} + */ +const getFileValue = input => input.files && input.files.length ? input.getAttribute('multiple') !== null ? input.files : input.files[0] : null; + +/** + * @param {SweetAlert} instance + * @param {SweetAlertOptions} params + */ +const handleInputOptions = (instance, params) => { + const popup = getPopup(); + if (!popup) { + return; + } + /** + * @param {*} inputOptions + */ + const processInputOptions = inputOptions => { + if (params.input === 'select') { + populateSelectOptions(popup, formatInputOptions(inputOptions), params); + } else if (params.input === 'radio') { + populateRadioOptions(popup, formatInputOptions(inputOptions), params); + } + }; + if (hasToPromiseFn(params.inputOptions) || isPromise(params.inputOptions)) { + showLoading(getConfirmButton()); + asPromise(params.inputOptions).then(inputOptions => { + instance.hideLoading(); + processInputOptions(inputOptions); + }); + } else if (typeof params.inputOptions === 'object') { + processInputOptions(params.inputOptions); + } else { + error(`Unexpected type of inputOptions! Expected object, Map or Promise, got ${typeof params.inputOptions}`); + } +}; + +/** + * @param {SweetAlert} instance + * @param {SweetAlertOptions} params + */ +const handleInputValue = (instance, params) => { + const input = instance.getInput(); + if (!input) { + return; + } + hide(input); + asPromise(params.inputValue).then(inputValue => { + input.value = params.input === 'number' ? `${parseFloat(inputValue) || 0}` : `${inputValue}`; + show(input); + input.focus(); + instance.hideLoading(); + }).catch(err => { + error(`Error in inputValue promise: ${err}`); + input.value = ''; + show(input); + input.focus(); + instance.hideLoading(); + }); +}; + +/** + * @param {HTMLElement} popup + * @param {InputOptionFlattened[]} inputOptions + * @param {SweetAlertOptions} params + */ +function populateSelectOptions(popup, inputOptions, params) { + const select = getDirectChildByClass(popup, swalClasses.select); + if (!select) { + return; + } + /** + * @param {HTMLElement} parent + * @param {string} optionLabel + * @param {string} optionValue + */ + const renderOption = (parent, optionLabel, optionValue) => { + const option = document.createElement('option'); + option.value = optionValue; + setInnerHtml(option, optionLabel); + option.selected = isSelected(optionValue, params.inputValue); + parent.appendChild(option); + }; + inputOptions.forEach(inputOption => { + const optionValue = inputOption[0]; + const optionLabel = inputOption[1]; + // spec: + // https://www.w3.org/TR/html401/interact/forms.html#h-17.6 + // "...all OPTGROUP elements must be specified directly within a SELECT element (i.e., groups may not be nested)..." + // check whether this is a + if (Array.isArray(optionLabel)) { + // if it is an array, then it is an + const optgroup = document.createElement('optgroup'); + optgroup.label = optionValue; + optgroup.disabled = false; // not configurable for now + select.appendChild(optgroup); + optionLabel.forEach(o => renderOption(optgroup, o[1], o[0])); + } else { + // case of + valueFormatted = formatInputOptions(valueFormatted); + } + result.push([key, valueFormatted]); + }); + } else { + Object.keys(inputOptions).forEach(key => { + let valueFormatted = inputOptions[key]; + if (typeof valueFormatted === 'object') { + // case of + valueFormatted = formatInputOptions(valueFormatted); + } + result.push([key, valueFormatted]); + }); + } + return result; +}; + +/** + * @param {string} optionValue + * @param {SweetAlertInputValue} inputValue + * @returns {boolean} + */ +const isSelected = (optionValue, inputValue) => { + return Boolean(inputValue) && inputValue !== null && inputValue !== undefined && inputValue.toString() === optionValue.toString(); +}; + +/** + * @param {SweetAlert} instance + */ +const handleConfirmButtonClick = instance => { + const innerParams = privateProps.innerParams.get(instance); + instance.disableButtons(); + if (innerParams.input) { + handleConfirmOrDenyWithInput(instance, 'confirm'); + } else { + confirm(instance, true); + } +}; + +/** + * @param {SweetAlert} instance + */ +const handleDenyButtonClick = instance => { + const innerParams = privateProps.innerParams.get(instance); + instance.disableButtons(); + if (innerParams.returnInputValueOnDeny) { + handleConfirmOrDenyWithInput(instance, 'deny'); + } else { + deny(instance, false); + } +}; + +/** + * @param {SweetAlert} instance + * @param {(dismiss: DismissReason) => void} dismissWith + */ +const handleCancelButtonClick = (instance, dismissWith) => { + instance.disableButtons(); + dismissWith(DismissReason.cancel); +}; + +/** + * @param {SweetAlert} instance + * @param {'confirm' | 'deny'} type + */ +const handleConfirmOrDenyWithInput = (instance, type) => { + const innerParams = privateProps.innerParams.get(instance); + if (!innerParams.input) { + error(`The "input" parameter is needed to be set when using returnInputValueOn${capitalizeFirstLetter(type)}`); + return; + } + const input = instance.getInput(); + const inputValue = getInputValue(instance, innerParams); + if (innerParams.inputValidator) { + handleInputValidator(instance, inputValue, type); + } else if (input && !input.checkValidity()) { + instance.enableButtons(); + instance.showValidationMessage(innerParams.validationMessage || input.validationMessage); + } else if (type === 'deny') { + deny(instance, inputValue); + } else { + confirm(instance, inputValue); + } +}; + +/** + * @param {SweetAlert} instance + * @param {SweetAlertInputValue} inputValue + * @param {'confirm' | 'deny'} type + */ +const handleInputValidator = (instance, inputValue, type) => { + const innerParams = privateProps.innerParams.get(instance); + instance.disableInput(); + const validationPromise = Promise.resolve().then(() => asPromise(innerParams.inputValidator(inputValue, innerParams.validationMessage))); + validationPromise.then(validationMessage => { + instance.enableButtons(); + instance.enableInput(); + if (validationMessage) { + instance.showValidationMessage(validationMessage); + } else if (type === 'deny') { + deny(instance, inputValue); + } else { + confirm(instance, inputValue); + } + }); +}; + +/** + * @param {SweetAlert} instance + * @param {*} value + */ +const deny = (instance, value) => { + const innerParams = privateProps.innerParams.get(instance); + if (innerParams.showLoaderOnDeny) { + showLoading(getDenyButton()); + } + if (innerParams.preDeny) { + instance.isAwaitingPromise = true; // Flagging the instance as awaiting a promise so it's own promise's reject/resolve methods doesn't get destroyed until the result from this preDeny's promise is received + const preDenyPromise = Promise.resolve().then(() => asPromise(innerParams.preDeny(value, innerParams.validationMessage))); + preDenyPromise.then(preDenyValue => { + if (preDenyValue === false) { + instance.hideLoading(); + handleAwaitingPromise(instance); + } else { + instance.close(/** @type SweetAlertResult */{ + isDenied: true, + value: typeof preDenyValue === 'undefined' ? value : preDenyValue + }); + } + }).catch(error => rejectWith(instance, error)); + } else { + instance.close(/** @type SweetAlertResult */{ + isDenied: true, + value + }); + } +}; + +/** + * @param {SweetAlert} instance + * @param {*} value + */ +const succeedWith = (instance, value) => { + instance.close(/** @type SweetAlertResult */{ + isConfirmed: true, + value + }); +}; + +/** + * + * @param {SweetAlert} instance + * @param {string} error + */ +const rejectWith = (instance, error) => { + instance.rejectPromise(error); +}; + +/** + * + * @param {SweetAlert} instance + * @param {*} value + */ +const confirm = (instance, value) => { + const innerParams = privateProps.innerParams.get(instance); + if (innerParams.showLoaderOnConfirm) { + showLoading(); + } + if (innerParams.preConfirm) { + instance.resetValidationMessage(); + instance.isAwaitingPromise = true; // Flagging the instance as awaiting a promise so it's own promise's reject/resolve methods doesn't get destroyed until the result from this preConfirm's promise is received + const preConfirmPromise = Promise.resolve().then(() => asPromise(innerParams.preConfirm(value, innerParams.validationMessage))); + preConfirmPromise.then(preConfirmValue => { + if (isVisible$1(getValidationMessage()) || preConfirmValue === false) { + instance.hideLoading(); + handleAwaitingPromise(instance); + } else { + succeedWith(instance, typeof preConfirmValue === 'undefined' ? value : preConfirmValue); + } + }).catch(error => rejectWith(instance, error)); + } else { + succeedWith(instance, value); + } +}; + +/** + * Hides loader and shows back the button which was hidden by .showLoading() + * @this {SweetAlert} + */ +function hideLoading() { + // do nothing if popup is closed + const innerParams = privateProps.innerParams.get(this); + if (!innerParams) { + return; + } + const domCache = privateProps.domCache.get(this); + hide(domCache.loader); + if (isToast()) { + if (innerParams.icon) { + show(getIcon()); + } + } else { + showRelatedButton(domCache); + } + removeClass([domCache.popup, domCache.actions], swalClasses.loading); + domCache.popup.removeAttribute('aria-busy'); + domCache.popup.removeAttribute('data-loading'); + domCache.confirmButton.disabled = false; + domCache.denyButton.disabled = false; + domCache.cancelButton.disabled = false; +} + +/** + * @param {DomCache} domCache + */ +const showRelatedButton = domCache => { + const dataButtonToReplace = domCache.loader.getAttribute('data-button-to-replace'); + const buttonToReplace = dataButtonToReplace ? domCache.popup.getElementsByClassName(dataButtonToReplace) : []; + if (buttonToReplace.length) { + show(/** @type {HTMLElement} */buttonToReplace[0], 'inline-block'); + } else if (allButtonsAreHidden()) { + hide(domCache.actions); + } +}; + +/** + * Gets the input DOM node, this method works with input parameter. + * + * @returns {HTMLInputElement | null} + * @this {SweetAlert} + */ +function getInput() { + const innerParams = privateProps.innerParams.get(this); + const domCache = privateProps.domCache.get(this); + if (!domCache) { + return null; + } + return getInput$1(domCache.popup, innerParams.input); +} + +/** + * @param {SweetAlert} instance + * @param {string[]} buttons + * @param {boolean} disabled + */ +function setButtonsDisabled(instance, buttons, disabled) { + const domCache = privateProps.domCache.get(instance); + buttons.forEach(button => { + domCache[button].disabled = disabled; + }); +} + +/** + * @param {HTMLInputElement | null} input + * @param {boolean} disabled + */ +function setInputDisabled(input, disabled) { + const popup = getPopup(); + if (!popup || !input) { + return; + } + if (input.type === 'radio') { + /** @type {NodeListOf} */ + const radios = popup.querySelectorAll(`[name="${swalClasses.radio}"]`); + for (let i = 0; i < radios.length; i++) { + radios[i].disabled = disabled; + } + } else { + input.disabled = disabled; + } +} + +/** + * Enable all the buttons + * @this {SweetAlert} + */ +function enableButtons() { + setButtonsDisabled(this, ['confirmButton', 'denyButton', 'cancelButton'], false); +} + +/** + * Disable all the buttons + * @this {SweetAlert} + */ +function disableButtons() { + setButtonsDisabled(this, ['confirmButton', 'denyButton', 'cancelButton'], true); +} + +/** + * Enable the input field + * @this {SweetAlert} + */ +function enableInput() { + setInputDisabled(this.getInput(), false); +} + +/** + * Disable the input field + * @this {SweetAlert} + */ +function disableInput() { + setInputDisabled(this.getInput(), true); +} + +/** + * Show block with validation message + * + * @param {string} error + * @this {SweetAlert} + */ +function showValidationMessage(error) { + const domCache = privateProps.domCache.get(this); + const params = privateProps.innerParams.get(this); + setInnerHtml(domCache.validationMessage, error); + domCache.validationMessage.className = swalClasses['validation-message']; + if (params.customClass && params.customClass.validationMessage) { + addClass(domCache.validationMessage, params.customClass.validationMessage); + } + show(domCache.validationMessage); + const input = this.getInput(); + if (input) { + input.setAttribute('aria-invalid', 'true'); + input.setAttribute('aria-describedby', swalClasses['validation-message']); + focusInput(input); + addClass(input, swalClasses.inputerror); + } +} + +/** + * Hide block with validation message + * + * @this {SweetAlert} + */ +function resetValidationMessage() { + const domCache = privateProps.domCache.get(this); + if (domCache.validationMessage) { + hide(domCache.validationMessage); + } + const input = this.getInput(); + if (input) { + input.removeAttribute('aria-invalid'); + input.removeAttribute('aria-describedby'); + removeClass(input, swalClasses.inputerror); + } +} + +const defaultParams = { + title: '', + titleText: '', + text: '', + html: '', + footer: '', + icon: undefined, + iconColor: undefined, + iconHtml: undefined, + template: undefined, + toast: false, + draggable: false, + animation: true, + theme: 'light', + showClass: { + popup: 'swal2-show', + backdrop: 'swal2-backdrop-show', + icon: 'swal2-icon-show' + }, + hideClass: { + popup: 'swal2-hide', + backdrop: 'swal2-backdrop-hide', + icon: 'swal2-icon-hide' + }, + customClass: {}, + target: 'body', + color: undefined, + backdrop: true, + heightAuto: true, + allowOutsideClick: true, + allowEscapeKey: true, + allowEnterKey: true, + stopKeydownPropagation: true, + keydownListenerCapture: false, + showConfirmButton: true, + showDenyButton: false, + showCancelButton: false, + preConfirm: undefined, + preDeny: undefined, + confirmButtonText: 'OK', + confirmButtonAriaLabel: '', + confirmButtonColor: undefined, + denyButtonText: 'No', + denyButtonAriaLabel: '', + denyButtonColor: undefined, + cancelButtonText: 'Cancel', + cancelButtonAriaLabel: '', + cancelButtonColor: undefined, + buttonsStyling: true, + reverseButtons: false, + focusConfirm: true, + focusDeny: false, + focusCancel: false, + returnFocus: true, + showCloseButton: false, + closeButtonHtml: '×', + closeButtonAriaLabel: 'Close this dialog', + loaderHtml: '', + showLoaderOnConfirm: false, + showLoaderOnDeny: false, + imageUrl: undefined, + imageWidth: undefined, + imageHeight: undefined, + imageAlt: '', + timer: undefined, + timerProgressBar: false, + width: undefined, + padding: undefined, + background: undefined, + input: undefined, + inputPlaceholder: '', + inputLabel: '', + inputValue: '', + inputOptions: {}, + inputAutoFocus: true, + inputAutoTrim: true, + inputAttributes: {}, + inputValidator: undefined, + returnInputValueOnDeny: false, + validationMessage: undefined, + grow: false, + position: 'center', + progressSteps: [], + currentProgressStep: undefined, + progressStepsDistance: undefined, + willOpen: undefined, + didOpen: undefined, + didRender: undefined, + willClose: undefined, + didClose: undefined, + didDestroy: undefined, + scrollbarPadding: true, + topLayer: false +}; +const updatableParams = ['allowEscapeKey', 'allowOutsideClick', 'background', 'buttonsStyling', 'cancelButtonAriaLabel', 'cancelButtonColor', 'cancelButtonText', 'closeButtonAriaLabel', 'closeButtonHtml', 'color', 'confirmButtonAriaLabel', 'confirmButtonColor', 'confirmButtonText', 'currentProgressStep', 'customClass', 'denyButtonAriaLabel', 'denyButtonColor', 'denyButtonText', 'didClose', 'didDestroy', 'draggable', 'footer', 'hideClass', 'html', 'icon', 'iconColor', 'iconHtml', 'imageAlt', 'imageHeight', 'imageUrl', 'imageWidth', 'preConfirm', 'preDeny', 'progressSteps', 'returnFocus', 'reverseButtons', 'showCancelButton', 'showCloseButton', 'showConfirmButton', 'showDenyButton', 'text', 'title', 'titleText', 'theme', 'willClose']; + +/** @type {Record} */ +const deprecatedParams = { + allowEnterKey: undefined +}; +const toastIncompatibleParams = ['allowOutsideClick', 'allowEnterKey', 'backdrop', 'draggable', 'focusConfirm', 'focusDeny', 'focusCancel', 'returnFocus', 'heightAuto', 'keydownListenerCapture']; + +/** + * Is valid parameter + * + * @param {string} paramName + * @returns {boolean} + */ +const isValidParameter = paramName => { + return Object.prototype.hasOwnProperty.call(defaultParams, paramName); +}; + +/** + * Is valid parameter for Swal.update() method + * + * @param {string} paramName + * @returns {boolean} + */ +const isUpdatableParameter = paramName => { + return updatableParams.indexOf(paramName) !== -1; +}; + +/** + * Is deprecated parameter + * + * @param {string} paramName + * @returns {string | undefined} + */ +const isDeprecatedParameter = paramName => { + return deprecatedParams[paramName]; +}; + +/** + * @param {string} param + */ +const checkIfParamIsValid = param => { + if (!isValidParameter(param)) { + warn(`Unknown parameter "${param}"`); + } +}; + +/** + * @param {string} param + */ +const checkIfToastParamIsValid = param => { + if (toastIncompatibleParams.includes(param)) { + warn(`The parameter "${param}" is incompatible with toasts`); + } +}; + +/** + * @param {string} param + */ +const checkIfParamIsDeprecated = param => { + const isDeprecated = isDeprecatedParameter(param); + if (isDeprecated) { + warnAboutDeprecation(param, isDeprecated); + } +}; + +/** + * Show relevant warnings for given params + * + * @param {SweetAlertOptions} params + */ +const showWarningsForParams = params => { + if (params.backdrop === false && params.allowOutsideClick) { + warn('"allowOutsideClick" parameter requires `backdrop` parameter to be set to `true`'); + } + if (params.theme && !['light', 'dark', 'auto', 'minimal', 'borderless', 'bootstrap-4', 'bootstrap-4-light', 'bootstrap-4-dark', 'bootstrap-5', 'bootstrap-5-light', 'bootstrap-5-dark', 'material-ui', 'material-ui-light', 'material-ui-dark', 'embed-iframe', 'bulma', 'bulma-light', 'bulma-dark'].includes(params.theme)) { + warn(`Invalid theme "${params.theme}"`); + } + for (const param in params) { + checkIfParamIsValid(param); + if (params.toast) { + checkIfToastParamIsValid(param); + } + checkIfParamIsDeprecated(param); + } +}; + +/** + * Updates popup parameters. + * + * @this {any} + * @param {SweetAlertOptions} params + */ +function update(params) { + const container = getContainer(); + const popup = getPopup(); + const innerParams = privateProps.innerParams.get(this); + if (!popup || hasClass(popup, innerParams.hideClass.popup)) { + warn(`You're trying to update the closed or closing popup, that won't work. Use the update() method in preConfirm parameter or show a new popup.`); + return; + } + const validUpdatableParams = filterValidParams(params); + const updatedParams = Object.assign({}, innerParams, validUpdatableParams); + showWarningsForParams(updatedParams); + if (container) { + container.dataset['swal2Theme'] = updatedParams.theme; + } + render(this, updatedParams); + privateProps.innerParams.set(this, updatedParams); + Object.defineProperties(this, { + params: { + value: Object.assign({}, this.params, params), + writable: false, + enumerable: true + } + }); +} + +/** + * @param {SweetAlertOptions} params + * @returns {SweetAlertOptions} + */ +const filterValidParams = params => { + /** @type {Record} */ + const validUpdatableParams = {}; + Object.keys(params).forEach(param => { + if (isUpdatableParameter(param)) { + const typedParams = /** @type {Record} */params; + validUpdatableParams[param] = typedParams[param]; + } else { + warn(`Invalid parameter to update: ${param}`); + } + }); + return validUpdatableParams; +}; + +/** + * Dispose the current SweetAlert2 instance + * @this {SweetAlert} + */ +function _destroy() { + var _globalState$eventEmi; + const domCache = privateProps.domCache.get(this); + const innerParams = privateProps.innerParams.get(this); + if (!innerParams) { + disposeWeakMaps(this); // The WeakMaps might have been partly destroyed, we must recall it to dispose any remaining WeakMaps #2335 + return; // This instance has already been destroyed + } + + // Check if there is another Swal closing + if (domCache.popup && globalState.swalCloseEventFinishedCallback) { + globalState.swalCloseEventFinishedCallback(); + delete globalState.swalCloseEventFinishedCallback; + } + if (typeof innerParams.didDestroy === 'function') { + innerParams.didDestroy(); + } + (_globalState$eventEmi = globalState.eventEmitter) === null || _globalState$eventEmi === void 0 || _globalState$eventEmi.emit('didDestroy'); + disposeSwal(this); +} + +/** + * @param {SweetAlert} instance + */ +const disposeSwal = instance => { + disposeWeakMaps(instance); + // Unset this.params so GC will dispose it (#1569) + // @ts-ignore + delete instance.params; + // Unset globalState props so GC will dispose globalState (#1569) + delete globalState.keydownHandler; + delete globalState.keydownTarget; + // Unset currentInstance + delete globalState.currentInstance; +}; + +/** + * @param {SweetAlert} instance + */ +const disposeWeakMaps = instance => { + // If the current instance is awaiting a promise result, we keep the privateMethods to call them once the promise result is retrieved #2335 + if (instance.isAwaitingPromise) { + unsetWeakMaps(privateProps, instance); + instance.isAwaitingPromise = true; + } else { + unsetWeakMaps(privateMethods, instance); + unsetWeakMaps(privateProps, instance); + + // @ts-ignore + delete instance.isAwaitingPromise; + // Unset instance methods + // @ts-ignore + delete instance.disableButtons; + // @ts-ignore + delete instance.enableButtons; + // @ts-ignore + delete instance.getInput; + // @ts-ignore + delete instance.disableInput; + // @ts-ignore + delete instance.enableInput; + // @ts-ignore + delete instance.hideLoading; + // @ts-ignore + delete instance.disableLoading; + // @ts-ignore + delete instance.showValidationMessage; + // @ts-ignore + delete instance.resetValidationMessage; + // @ts-ignore + delete instance.close; + // @ts-ignore + delete instance.closePopup; + // @ts-ignore + delete instance.closeModal; + // @ts-ignore + delete instance.closeToast; + // @ts-ignore + delete instance.rejectPromise; + // @ts-ignore + delete instance.update; + // @ts-ignore + delete instance._destroy; + } +}; + +/** + * @param {Record>} obj + * @param {SweetAlert} instance + */ +const unsetWeakMaps = (obj, instance) => { + for (const i in obj) { + obj[i].delete(instance); + } +}; + +var instanceMethods = /*#__PURE__*/Object.freeze({ + __proto__: null, + _destroy: _destroy, + close: close, + closeModal: close, + closePopup: close, + closeToast: close, + disableButtons: disableButtons, + disableInput: disableInput, + disableLoading: hideLoading, + enableButtons: enableButtons, + enableInput: enableInput, + getInput: getInput, + handleAwaitingPromise: handleAwaitingPromise, + hideLoading: hideLoading, + rejectPromise: rejectPromise, + resetValidationMessage: resetValidationMessage, + showValidationMessage: showValidationMessage, + update: update +}); + +/** + * @param {SweetAlertOptions} innerParams + * @param {DomCache} domCache + * @param {(dismiss: DismissReason) => void} dismissWith + */ +const handlePopupClick = (innerParams, domCache, dismissWith) => { + if (innerParams.toast) { + handleToastClick(innerParams, domCache, dismissWith); + } else { + // Ignore click events that had mousedown on the popup but mouseup on the container + // This can happen when the user drags a slider + handleModalMousedown(domCache); + + // Ignore click events that had mousedown on the container but mouseup on the popup + handleContainerMousedown(domCache); + handleModalClick(innerParams, domCache, dismissWith); + } +}; + +/** + * @param {SweetAlertOptions} innerParams + * @param {DomCache} domCache + * @param {(dismiss: DismissReason) => void} dismissWith + */ +const handleToastClick = (innerParams, domCache, dismissWith) => { + // Closing toast by internal click + domCache.popup.onclick = () => { + if (innerParams && (isAnyButtonShown(innerParams) || innerParams.timer || innerParams.input)) { + return; + } + dismissWith(DismissReason.close); + }; +}; + +/** + * @param {SweetAlertOptions} innerParams + * @returns {boolean} + */ +const isAnyButtonShown = innerParams => { + return Boolean(innerParams.showConfirmButton || innerParams.showDenyButton || innerParams.showCancelButton || innerParams.showCloseButton); +}; +let ignoreOutsideClick = false; + +/** + * @param {DomCache} domCache + */ +const handleModalMousedown = domCache => { + domCache.popup.onmousedown = () => { + domCache.container.onmouseup = function (e) { + domCache.container.onmouseup = () => {}; + // We only check if the mouseup target is the container because usually it doesn't + // have any other direct children aside of the popup + if (e.target === domCache.container) { + ignoreOutsideClick = true; + } + }; + }; +}; + +/** + * @param {DomCache} domCache + */ +const handleContainerMousedown = domCache => { + domCache.container.onmousedown = e => { + // prevent the modal text from being selected on double click on the container (allowOutsideClick: false) + if (e.target === domCache.container) { + e.preventDefault(); + } + domCache.popup.onmouseup = function (e) { + domCache.popup.onmouseup = () => {}; + // We also need to check if the mouseup target is a child of the popup + if (e.target === domCache.popup || e.target instanceof HTMLElement && domCache.popup.contains(e.target)) { + ignoreOutsideClick = true; + } + }; + }; +}; + +/** + * @param {SweetAlertOptions} innerParams + * @param {DomCache} domCache + * @param {(dismiss: DismissReason) => void} dismissWith + */ +const handleModalClick = (innerParams, domCache, dismissWith) => { + domCache.container.onclick = e => { + if (ignoreOutsideClick) { + ignoreOutsideClick = false; + return; + } + if (e.target === domCache.container && callIfFunction(innerParams.allowOutsideClick)) { + dismissWith(DismissReason.backdrop); + } + }; +}; + +/** + * @param {unknown} elem + * @returns {boolean} + */ +const isJqueryElement = elem => typeof elem === 'object' && elem !== null && 'jquery' in elem; + +/** + * @param {unknown} elem + * @returns {boolean} + */ +const isElement = elem => elem instanceof Element || isJqueryElement(elem); + +/** + * @param {ReadonlyArray} args + * @returns {SweetAlertOptions} + */ +const argsToParams = args => { + /** @type {Record} */ + const params = {}; + if (typeof args[0] === 'object' && !isElement(args[0])) { + Object.assign(params, args[0]); + } else { + ['title', 'html', 'icon'].forEach((name, index) => { + const arg = args[index]; + if (typeof arg === 'string' || isElement(arg)) { + params[name] = arg; + } else if (arg !== undefined) { + error(`Unexpected type of ${name}! Expected "string" or "Element", got ${typeof arg}`); + } + }); + } + return /** @type {SweetAlertOptions} */params; +}; + +/** + * Main method to create a new SweetAlert2 popup + * + * @this {new (...args: any[]) => any} + * @param {...SweetAlertOptions} args + * @returns {Promise} + */ +function fire(...args) { + return new this(...args); +} + +/** + * Returns an extended version of `Swal` containing `params` as defaults. + * Useful for reusing Swal configuration. + * + * For example: + * + * Before: + * const textPromptOptions = { input: 'text', showCancelButton: true } + * const {value: firstName} = await Swal.fire({ ...textPromptOptions, title: 'What is your first name?' }) + * const {value: lastName} = await Swal.fire({ ...textPromptOptions, title: 'What is your last name?' }) + * + * After: + * const TextPrompt = Swal.mixin({ input: 'text', showCancelButton: true }) + * const {value: firstName} = await TextPrompt('What is your first name?') + * const {value: lastName} = await TextPrompt('What is your last name?') + * + * @param {SweetAlertOptions} mixinParams + * @returns {SweetAlert} + * @this {typeof import('../SweetAlert.js').SweetAlert} + */ +function mixin(mixinParams) { + // @ts-ignore: 'this' refers to the SweetAlert constructor + class MixinSwal extends this { + /** + * @param {any} params + * @param {any} priorityMixinParams + */ + _main(params, priorityMixinParams) { + return super._main(params, Object.assign({}, mixinParams, priorityMixinParams)); + } + } + // @ts-ignore + return MixinSwal; +} + +/** + * If `timer` parameter is set, returns number of milliseconds of timer remained. + * Otherwise, returns undefined. + * + * @returns {number | undefined} + */ +const getTimerLeft = () => { + return globalState.timeout && globalState.timeout.getTimerLeft(); +}; + +/** + * Stop timer. Returns number of milliseconds of timer remained. + * If `timer` parameter isn't set, returns undefined. + * + * @returns {number | undefined} + */ +const stopTimer = () => { + if (globalState.timeout) { + stopTimerProgressBar(); + return globalState.timeout.stop(); + } +}; + +/** + * Resume timer. Returns number of milliseconds of timer remained. + * If `timer` parameter isn't set, returns undefined. + * + * @returns {number | undefined} + */ +const resumeTimer = () => { + if (globalState.timeout) { + const remaining = globalState.timeout.start(); + animateTimerProgressBar(remaining); + return remaining; + } +}; + +/** + * Resume timer. Returns number of milliseconds of timer remained. + * If `timer` parameter isn't set, returns undefined. + * + * @returns {number | undefined} + */ +const toggleTimer = () => { + const timer = globalState.timeout; + return timer && (timer.running ? stopTimer() : resumeTimer()); +}; + +/** + * Increase timer. Returns number of milliseconds of an updated timer. + * If `timer` parameter isn't set, returns undefined. + * + * @param {number} ms + * @returns {number | undefined} + */ +const increaseTimer = ms => { + if (globalState.timeout) { + const remaining = globalState.timeout.increase(ms); + animateTimerProgressBar(remaining, true); + return remaining; + } +}; + +/** + * Check if timer is running. Returns true if timer is running + * or false if timer is paused or stopped. + * If `timer` parameter isn't set, returns undefined + * + * @returns {boolean} + */ +const isTimerRunning = () => { + return Boolean(globalState.timeout && globalState.timeout.isRunning()); +}; + +let bodyClickListenerAdded = false; +/** @type {Record} */ +const clickHandlers = {}; + +/** + * @this {any} + * @param {string} attr + */ +function bindClickHandler(attr = 'data-swal-template') { + clickHandlers[attr] = this; + if (!bodyClickListenerAdded) { + document.body.addEventListener('click', bodyClickListener); + bodyClickListenerAdded = true; + } +} + +/** + * @param {MouseEvent} event + */ +const bodyClickListener = event => { + for (let el = /** @type {any} */event.target; el && el !== document; el = el.parentNode) { + for (const attr in clickHandlers) { + const template = el.getAttribute && el.getAttribute(attr); + if (template) { + clickHandlers[attr].fire({ + template + }); + return; + } + } + } +}; + +// Source: https://gist.github.com/mudge/5830382?permalink_comment_id=2691957#gistcomment-2691957 + +class EventEmitter { + constructor() { + /** @type {Events} */ + this.events = {}; + } + + /** + * @param {string} eventName + * @returns {EventHandlers} + */ + _getHandlersByEventName(eventName) { + if (typeof this.events[eventName] === 'undefined') { + // not Set because we need to keep the FIFO order + // https://github.com/sweetalert2/sweetalert2/pull/2763#discussion_r1748990334 + this.events[eventName] = []; + } + return this.events[eventName]; + } + + /** + * @param {string} eventName + * @param {EventHandler} eventHandler + */ + on(eventName, eventHandler) { + const currentHandlers = this._getHandlersByEventName(eventName); + if (!currentHandlers.includes(eventHandler)) { + currentHandlers.push(eventHandler); + } + } + + /** + * @param {string} eventName + * @param {EventHandler} eventHandler + */ + once(eventName, eventHandler) { + /** + * @param {...any} args + */ + const onceFn = (...args) => { + this.removeListener(eventName, onceFn); + // @ts-ignore + eventHandler.apply(this, args); + }; + this.on(eventName, onceFn); + } + + /** + * @param {string} eventName + * @param {...any} args + */ + emit(eventName, ...args) { + this._getHandlersByEventName(eventName).forEach( + /** + * @param {EventHandler} eventHandler + */ + eventHandler => { + try { + // @ts-ignore + eventHandler.apply(this, args); + } catch (error) { + console.error(error); + } + }); + } + + /** + * @param {string} eventName + * @param {EventHandler} eventHandler + */ + removeListener(eventName, eventHandler) { + const currentHandlers = this._getHandlersByEventName(eventName); + const index = currentHandlers.indexOf(eventHandler); + if (index > -1) { + currentHandlers.splice(index, 1); + } + } + + /** + * @param {string} eventName + */ + removeAllListeners(eventName) { + if (this.events[eventName] !== undefined) { + // https://github.com/sweetalert2/sweetalert2/pull/2763#discussion_r1749239222 + this.events[eventName].length = 0; + } + } + reset() { + this.events = {}; + } +} + +globalState.eventEmitter = new EventEmitter(); + +/** + * @param {string} eventName + * @param {EventHandler} eventHandler + */ +const on = (eventName, eventHandler) => { + if (globalState.eventEmitter) { + globalState.eventEmitter.on(eventName, eventHandler); + } +}; + +/** + * @param {string} eventName + * @param {EventHandler} eventHandler + */ +const once = (eventName, eventHandler) => { + if (globalState.eventEmitter) { + globalState.eventEmitter.once(eventName, eventHandler); + } +}; + +/** + * @param {string} [eventName] + * @param {EventHandler} [eventHandler] + */ +const off = (eventName, eventHandler) => { + if (!globalState.eventEmitter) { + return; + } + + // Remove all handlers for all events + if (!eventName) { + globalState.eventEmitter.reset(); + return; + } + if (eventHandler) { + // Remove a specific handler + globalState.eventEmitter.removeListener(eventName, eventHandler); + } else { + // Remove all handlers for a specific event + globalState.eventEmitter.removeAllListeners(eventName); + } +}; + +var staticMethods = /*#__PURE__*/Object.freeze({ + __proto__: null, + argsToParams: argsToParams, + bindClickHandler: bindClickHandler, + clickCancel: clickCancel, + clickConfirm: clickConfirm, + clickDeny: clickDeny, + enableLoading: showLoading, + fire: fire, + getActions: getActions, + getCancelButton: getCancelButton, + getCloseButton: getCloseButton, + getConfirmButton: getConfirmButton, + getContainer: getContainer, + getDenyButton: getDenyButton, + getFocusableElements: getFocusableElements, + getFooter: getFooter, + getHtmlContainer: getHtmlContainer, + getIcon: getIcon, + getIconContent: getIconContent, + getImage: getImage, + getInputLabel: getInputLabel, + getLoader: getLoader, + getPopup: getPopup, + getProgressSteps: getProgressSteps, + getTimerLeft: getTimerLeft, + getTimerProgressBar: getTimerProgressBar, + getTitle: getTitle, + getValidationMessage: getValidationMessage, + increaseTimer: increaseTimer, + isDeprecatedParameter: isDeprecatedParameter, + isLoading: isLoading, + isTimerRunning: isTimerRunning, + isUpdatableParameter: isUpdatableParameter, + isValidParameter: isValidParameter, + isVisible: isVisible, + mixin: mixin, + off: off, + on: on, + once: once, + resumeTimer: resumeTimer, + showLoading: showLoading, + stopTimer: stopTimer, + toggleTimer: toggleTimer +}); + +class Timer { + /** + * @param {() => void} callback + * @param {number} delay + */ + constructor(callback, delay) { + this.callback = callback; + this.remaining = delay; + this.running = false; + this.start(); + } + + /** + * @returns {number} + */ + start() { + if (!this.running) { + this.running = true; + this.started = new Date(); + this.id = setTimeout(this.callback, this.remaining); + } + return this.remaining; + } + + /** + * @returns {number} + */ + stop() { + if (this.started && this.running) { + this.running = false; + clearTimeout(this.id); + this.remaining -= new Date().getTime() - this.started.getTime(); + } + return this.remaining; + } + + /** + * @param {number} n + * @returns {number} + */ + increase(n) { + const running = this.running; + if (running) { + this.stop(); + } + this.remaining += n; + if (running) { + this.start(); + } + return this.remaining; + } + + /** + * @returns {number} + */ + getTimerLeft() { + if (this.running) { + this.stop(); + this.start(); + } + return this.remaining; + } + + /** + * @returns {boolean} + */ + isRunning() { + return this.running; + } +} + +const swalStringParams = ['swal-title', 'swal-html', 'swal-footer']; + +/** + * @param {SweetAlertOptions} params + * @returns {SweetAlertOptions} + */ +const getTemplateParams = params => { + const template = typeof params.template === 'string' ? (/** @type {HTMLTemplateElement} */document.querySelector(params.template)) : params.template; + if (!template) { + return {}; + } + /** @type {DocumentFragment} */ + const templateContent = template.content; + showWarningsForElements(templateContent); + const result = Object.assign(getSwalParams(templateContent), getSwalFunctionParams(templateContent), getSwalButtons(templateContent), getSwalImage(templateContent), getSwalIcon(templateContent), getSwalInput(templateContent), getSwalStringParams(templateContent, swalStringParams)); + return result; +}; + +/** + * @param {DocumentFragment} templateContent + * @returns {Record} + */ +const getSwalParams = templateContent => { + /** @type {Record} */ + const result = {}; + /** @type {HTMLElement[]} */ + const swalParams = Array.from(templateContent.querySelectorAll('swal-param')); + swalParams.forEach(param => { + showWarningsForAttributes(param, ['name', 'value']); + const paramName = /** @type {keyof SweetAlertOptions} */param.getAttribute('name'); + const value = param.getAttribute('value'); + if (!paramName || !value) { + return; + } + if (paramName in defaultParams && typeof defaultParams[(/** @type {keyof typeof defaultParams} */paramName)] === 'boolean') { + result[paramName] = value !== 'false'; + } else if (paramName in defaultParams && typeof defaultParams[(/** @type {keyof typeof defaultParams} */paramName)] === 'object') { + result[paramName] = JSON.parse(value); + } else { + result[paramName] = value; + } + }); + return result; +}; + +/** + * @param {DocumentFragment} templateContent + * @returns {Record void>} + */ +const getSwalFunctionParams = templateContent => { + /** @type {Record void>} */ + const result = {}; + /** @type {HTMLElement[]} */ + const swalFunctions = Array.from(templateContent.querySelectorAll('swal-function-param')); + swalFunctions.forEach(param => { + const paramName = /** @type {keyof SweetAlertOptions} */param.getAttribute('name'); + const value = param.getAttribute('value'); + if (!paramName || !value) { + return; + } + result[paramName] = new Function(`return ${value}`)(); + }); + return result; +}; + +/** + * @param {DocumentFragment} templateContent + * @returns {Record} + */ +const getSwalButtons = templateContent => { + /** @type {Record} */ + const result = {}; + /** @type {HTMLElement[]} */ + const swalButtons = Array.from(templateContent.querySelectorAll('swal-button')); + swalButtons.forEach(button => { + showWarningsForAttributes(button, ['type', 'color', 'aria-label']); + const type = button.getAttribute('type'); + if (!type || !['confirm', 'cancel', 'deny'].includes(type)) { + return; + } + result[`${type}ButtonText`] = button.innerHTML; + result[`show${capitalizeFirstLetter(type)}Button`] = true; + if (button.hasAttribute('color')) { + const color = button.getAttribute('color'); + if (color !== null) { + result[`${type}ButtonColor`] = color; + } + } + if (button.hasAttribute('aria-label')) { + const ariaLabel = button.getAttribute('aria-label'); + if (ariaLabel !== null) { + result[`${type}ButtonAriaLabel`] = ariaLabel; + } + } + }); + return result; +}; + +/** + * @param {DocumentFragment} templateContent + * @returns {Pick} + */ +const getSwalImage = templateContent => { + const result = {}; + /** @type {HTMLElement | null} */ + const image = templateContent.querySelector('swal-image'); + if (image) { + showWarningsForAttributes(image, ['src', 'width', 'height', 'alt']); + if (image.hasAttribute('src')) { + result.imageUrl = image.getAttribute('src') || undefined; + } + if (image.hasAttribute('width')) { + result.imageWidth = image.getAttribute('width') || undefined; + } + if (image.hasAttribute('height')) { + result.imageHeight = image.getAttribute('height') || undefined; + } + if (image.hasAttribute('alt')) { + result.imageAlt = image.getAttribute('alt') || undefined; + } + } + return result; +}; + +/** + * @param {DocumentFragment} templateContent + * @returns {object} + */ +const getSwalIcon = templateContent => { + const result = {}; + /** @type {HTMLElement | null} */ + const icon = templateContent.querySelector('swal-icon'); + if (icon) { + showWarningsForAttributes(icon, ['type', 'color']); + if (icon.hasAttribute('type')) { + result.icon = icon.getAttribute('type'); + } + if (icon.hasAttribute('color')) { + result.iconColor = icon.getAttribute('color'); + } + result.iconHtml = icon.innerHTML; + } + return result; +}; + +/** + * @param {DocumentFragment} templateContent + * @returns {object} + */ +const getSwalInput = templateContent => { + /** @type {Record} */ + const result = {}; + /** @type {HTMLElement | null} */ + const input = templateContent.querySelector('swal-input'); + if (input) { + showWarningsForAttributes(input, ['type', 'label', 'placeholder', 'value']); + result.input = input.getAttribute('type') || 'text'; + if (input.hasAttribute('label')) { + result.inputLabel = input.getAttribute('label'); + } + if (input.hasAttribute('placeholder')) { + result.inputPlaceholder = input.getAttribute('placeholder'); + } + if (input.hasAttribute('value')) { + result.inputValue = input.getAttribute('value'); + } + } + /** @type {HTMLElement[]} */ + const inputOptions = Array.from(templateContent.querySelectorAll('swal-input-option')); + if (inputOptions.length) { + result.inputOptions = {}; + inputOptions.forEach(option => { + showWarningsForAttributes(option, ['value']); + const optionValue = option.getAttribute('value'); + if (!optionValue) { + return; + } + const optionName = option.innerHTML; + result.inputOptions[optionValue] = optionName; + }); + } + return result; +}; + +/** + * @param {DocumentFragment} templateContent + * @param {string[]} paramNames + * @returns {Record} + */ +const getSwalStringParams = (templateContent, paramNames) => { + /** @type {Record} */ + const result = {}; + for (const i in paramNames) { + const paramName = paramNames[i]; + /** @type {HTMLElement | null} */ + const tag = templateContent.querySelector(paramName); + if (tag) { + showWarningsForAttributes(tag, []); + result[paramName.replace(/^swal-/, '')] = tag.innerHTML.trim(); + } + } + return result; +}; + +/** + * @param {DocumentFragment} templateContent + */ +const showWarningsForElements = templateContent => { + const allowedElements = swalStringParams.concat(['swal-param', 'swal-function-param', 'swal-button', 'swal-image', 'swal-icon', 'swal-input', 'swal-input-option']); + Array.from(templateContent.children).forEach(el => { + const tagName = el.tagName.toLowerCase(); + if (!allowedElements.includes(tagName)) { + warn(`Unrecognized element <${tagName}>`); + } + }); +}; + +/** + * @param {HTMLElement} el + * @param {string[]} allowedAttributes + */ +const showWarningsForAttributes = (el, allowedAttributes) => { + Array.from(el.attributes).forEach(attribute => { + if (allowedAttributes.indexOf(attribute.name) === -1) { + warn([`Unrecognized attribute "${attribute.name}" on <${el.tagName.toLowerCase()}>.`, `${allowedAttributes.length ? `Allowed attributes are: ${allowedAttributes.join(', ')}` : 'To set the value, use HTML within the element.'}`]); + } + }); +}; + +const SHOW_CLASS_TIMEOUT = 10; + +/** + * Open popup, add necessary classes and styles, fix scrollbar + * + * @param {SweetAlertOptions} params + */ +const openPopup = params => { + var _globalState$eventEmi, _globalState$eventEmi2; + const container = getContainer(); + const popup = getPopup(); + if (!container || !popup) { + return; + } + if (typeof params.willOpen === 'function') { + params.willOpen(popup); + } + (_globalState$eventEmi = globalState.eventEmitter) === null || _globalState$eventEmi === void 0 || _globalState$eventEmi.emit('willOpen', popup); + const bodyStyles = window.getComputedStyle(document.body); + const initialBodyOverflow = bodyStyles.overflowY; + addClasses(container, popup, params); + + // scrolling is 'hidden' until animation is done, after that 'auto' + setTimeout(() => { + setScrollingVisibility(container, popup); + }, SHOW_CLASS_TIMEOUT); + if (isModal()) { + // Using ternary instead of ?? operator for Webpack 4 compatibility + fixScrollContainer(container, params.scrollbarPadding !== undefined ? params.scrollbarPadding : false, initialBodyOverflow); + setAriaHidden(); + } + if (!isToast() && !globalState.previousActiveElement) { + globalState.previousActiveElement = document.activeElement; + } + if (typeof params.didOpen === 'function') { + const didOpen = params.didOpen; + setTimeout(() => didOpen(popup)); + } + (_globalState$eventEmi2 = globalState.eventEmitter) === null || _globalState$eventEmi2 === void 0 || _globalState$eventEmi2.emit('didOpen', popup); +}; + +/** + * @param {Event} event + */ +const swalOpenAnimationFinished = event => { + const popup = getPopup(); + if (!popup || event.target !== popup) { + return; + } + const container = getContainer(); + if (!container) { + return; + } + popup.removeEventListener('animationend', swalOpenAnimationFinished); + popup.removeEventListener('transitionend', swalOpenAnimationFinished); + container.style.overflowY = 'auto'; + + // no-transition is added in init() in case one swal is opened right after another + removeClass(container, swalClasses['no-transition']); +}; + +/** + * @param {HTMLElement} container + * @param {HTMLElement} popup + */ +const setScrollingVisibility = (container, popup) => { + if (hasCssAnimation(popup)) { + container.style.overflowY = 'hidden'; + popup.addEventListener('animationend', swalOpenAnimationFinished); + popup.addEventListener('transitionend', swalOpenAnimationFinished); + } else { + container.style.overflowY = 'auto'; + } +}; + +/** + * @param {HTMLElement} container + * @param {boolean} scrollbarPadding + * @param {string} initialBodyOverflow + */ +const fixScrollContainer = (container, scrollbarPadding, initialBodyOverflow) => { + iOSfix(); + if (scrollbarPadding && initialBodyOverflow !== 'hidden') { + replaceScrollbarWithPadding(initialBodyOverflow); + } + + // sweetalert2/issues/1247 + setTimeout(() => { + container.scrollTop = 0; + }); +}; + +/** + * @param {HTMLElement} container + * @param {HTMLElement} popup + * @param {SweetAlertOptions} params + */ +const addClasses = (container, popup, params) => { + var _params$showClass; + if ((_params$showClass = params.showClass) !== null && _params$showClass !== void 0 && _params$showClass.backdrop) { + addClass(container, params.showClass.backdrop); + } + if (params.animation) { + // this workaround with opacity is needed for https://github.com/sweetalert2/sweetalert2/issues/2059 + popup.style.setProperty('opacity', '0', 'important'); + show(popup, 'grid'); + setTimeout(() => { + var _params$showClass2; + // Animate popup right after showing it + if ((_params$showClass2 = params.showClass) !== null && _params$showClass2 !== void 0 && _params$showClass2.popup) { + addClass(popup, params.showClass.popup); + } + // and remove the opacity workaround + popup.style.removeProperty('opacity'); + }, SHOW_CLASS_TIMEOUT); // 10ms in order to fix #2062 + } else { + show(popup, 'grid'); + } + addClass([document.documentElement, document.body], swalClasses.shown); + if (params.heightAuto && params.backdrop && !params.toast) { + addClass([document.documentElement, document.body], swalClasses['height-auto']); + } +}; + +var defaultInputValidators = { + /** + * @param {string} string + * @param {string} [validationMessage] + * @returns {Promise} + */ + email: (string, validationMessage) => { + return /^[a-zA-Z0-9.+_'-]+@[a-zA-Z0-9.-]+\.[a-zA-Z0-9-]+$/.test(string) ? Promise.resolve() : Promise.resolve(validationMessage || 'Invalid email address'); + }, + /** + * @param {string} string + * @param {string} [validationMessage] + * @returns {Promise} + */ + url: (string, validationMessage) => { + // taken from https://stackoverflow.com/a/3809435 with a small change from #1306 and #2013 + return /^https?:\/\/(www\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\.[a-z]{2,63}\b([-a-zA-Z0-9@:%_+.~#?&/=]*)$/.test(string) ? Promise.resolve() : Promise.resolve(validationMessage || 'Invalid URL'); + } +}; + +/** + * @param {SweetAlertOptions} params + */ +function setDefaultInputValidators(params) { + // Use default `inputValidator` for supported input types if not provided + if (params.inputValidator) { + return; + } + if (params.input === 'email') { + params.inputValidator = defaultInputValidators['email']; + } + if (params.input === 'url') { + params.inputValidator = defaultInputValidators['url']; + } +} + +/** + * @param {SweetAlertOptions} params + */ +function validateCustomTargetElement(params) { + // Determine if the custom target element is valid + if (!params.target || typeof params.target === 'string' && !document.querySelector(params.target) || typeof params.target !== 'string' && !params.target.appendChild) { + warn('Target parameter is not valid, defaulting to "body"'); + params.target = 'body'; + } +} + +/** + * Set type, text and actions on popup + * + * @param {SweetAlertOptions} params + */ +function setParameters(params) { + setDefaultInputValidators(params); + + // showLoaderOnConfirm && preConfirm + if (params.showLoaderOnConfirm && !params.preConfirm) { + warn('showLoaderOnConfirm is set to true, but preConfirm is not defined.\n' + 'showLoaderOnConfirm should be used together with preConfirm, see usage example:\n' + 'https://sweetalert2.github.io/#ajax-request'); + } + validateCustomTargetElement(params); + + // Replace newlines with
              in title + if (typeof params.title === 'string') { + params.title = params.title.split('\n').join('
              '); + } + init(params); +} + +/** @type {SweetAlert} */ +let currentInstance; +var _promise = /*#__PURE__*/new WeakMap(); +class SweetAlert { + /** + * @param {...(SweetAlertOptions | string)} args + * @this {SweetAlert} + */ + constructor(...args) { + /** + * @type {Promise} + */ + _classPrivateFieldInitSpec(this, _promise, /** @type {Promise} */Promise.resolve({ + isConfirmed: false, + isDenied: false, + isDismissed: true + })); + // Prevent run in Node env + if (typeof window === 'undefined') { + return; + } + currentInstance = this; + + // @ts-ignore + const outerParams = Object.freeze(this.constructor.argsToParams(args)); + + /** @type {Readonly} */ + this.params = outerParams; + + /** @type {boolean} */ + this.isAwaitingPromise = false; + _classPrivateFieldSet2(_promise, this, this._main(currentInstance.params)); + } + + /** + * @param {any} userParams + * @param {any} mixinParams + */ + _main(userParams, mixinParams = {}) { + showWarningsForParams(Object.assign({}, mixinParams, userParams)); + if (globalState.currentInstance) { + const swalPromiseResolve = privateMethods.swalPromiseResolve.get(globalState.currentInstance); + const { + isAwaitingPromise + } = globalState.currentInstance; + globalState.currentInstance._destroy(); + if (!isAwaitingPromise) { + swalPromiseResolve({ + isDismissed: true + }); + } + if (isModal()) { + unsetAriaHidden(); + } + } + globalState.currentInstance = currentInstance; + const innerParams = prepareParams(userParams, mixinParams); + setParameters(innerParams); + Object.freeze(innerParams); + + // clear the previous timer + if (globalState.timeout) { + globalState.timeout.stop(); + delete globalState.timeout; + } + + // clear the restore focus timeout + clearTimeout(globalState.restoreFocusTimeout); + const domCache = populateDomCache(currentInstance); + render(currentInstance, innerParams); + privateProps.innerParams.set(currentInstance, innerParams); + return swalPromise(currentInstance, domCache, innerParams); + } + + // `catch` cannot be the name of a module export, so we define our thenable methods here instead + /** + * @param {any} onFulfilled + */ + then(onFulfilled) { + return _classPrivateFieldGet2(_promise, this).then(onFulfilled); + } + + /** + * @param {any} onFinally + */ + finally(onFinally) { + return _classPrivateFieldGet2(_promise, this).finally(onFinally); + } +} + +/** + * @param {SweetAlert} instance + * @param {DomCache} domCache + * @param {SweetAlertOptions} innerParams + * @returns {Promise} + */ +const swalPromise = (instance, domCache, innerParams) => { + return new Promise((resolve, reject) => { + // functions to handle all closings/dismissals + /** + * @param {DismissReason} dismiss + */ + const dismissWith = dismiss => { + instance.close({ + isDismissed: true, + dismiss, + isConfirmed: false, + isDenied: false + }); + }; + privateMethods.swalPromiseResolve.set(instance, resolve); + privateMethods.swalPromiseReject.set(instance, reject); + domCache.confirmButton.onclick = () => { + handleConfirmButtonClick(instance); + }; + domCache.denyButton.onclick = () => { + handleDenyButtonClick(instance); + }; + domCache.cancelButton.onclick = () => { + handleCancelButtonClick(instance, dismissWith); + }; + domCache.closeButton.onclick = () => { + dismissWith(DismissReason.close); + }; + handlePopupClick(innerParams, domCache, dismissWith); + addKeydownHandler(globalState, innerParams, dismissWith); + handleInputOptionsAndValue(instance, innerParams); + openPopup(innerParams); + setupTimer(globalState, innerParams, dismissWith); + initFocus(domCache, innerParams); + + // Scroll container to top on open (#1247, #1946) + setTimeout(() => { + domCache.container.scrollTop = 0; + }); + }); +}; + +/** + * @param {SweetAlertOptions} userParams + * @param {SweetAlertOptions} mixinParams + * @returns {SweetAlertOptions} + */ +const prepareParams = (userParams, mixinParams) => { + const templateParams = getTemplateParams(userParams); + const params = Object.assign({}, defaultParams, mixinParams, templateParams, userParams); // precedence is described in #2131 + params.showClass = Object.assign({}, defaultParams.showClass, params.showClass); + params.hideClass = Object.assign({}, defaultParams.hideClass, params.hideClass); + if (params.animation === false) { + params.showClass = { + backdrop: 'swal2-noanimation' + }; + params.hideClass = {}; + } + return params; +}; + +/** + * @param {SweetAlert} instance + * @returns {DomCache} + */ +const populateDomCache = instance => { + const domCache = /** @type {DomCache} */{ + popup: (/** @type {HTMLElement} */getPopup()), + container: (/** @type {HTMLElement} */getContainer()), + actions: (/** @type {HTMLElement} */getActions()), + confirmButton: (/** @type {HTMLElement} */getConfirmButton()), + denyButton: (/** @type {HTMLElement} */getDenyButton()), + cancelButton: (/** @type {HTMLElement} */getCancelButton()), + loader: (/** @type {HTMLElement} */getLoader()), + closeButton: (/** @type {HTMLElement} */getCloseButton()), + validationMessage: (/** @type {HTMLElement} */getValidationMessage()), + progressSteps: (/** @type {HTMLElement} */getProgressSteps()) + }; + privateProps.domCache.set(instance, domCache); + return domCache; +}; + +/** + * @param {GlobalState} globalState + * @param {SweetAlertOptions} innerParams + * @param {(dismiss: DismissReason) => void} dismissWith + */ +const setupTimer = (globalState, innerParams, dismissWith) => { + const timerProgressBar = getTimerProgressBar(); + hide(timerProgressBar); + if (innerParams.timer) { + globalState.timeout = new Timer(() => { + dismissWith('timer'); + delete globalState.timeout; + }, innerParams.timer); + if (innerParams.timerProgressBar && timerProgressBar) { + show(timerProgressBar); + applyCustomClass(timerProgressBar, innerParams, 'timerProgressBar'); + setTimeout(() => { + if (globalState.timeout && globalState.timeout.running) { + // timer can be already stopped or unset at this point + animateTimerProgressBar(/** @type {number} */innerParams.timer); + } + }); + } + } +}; + +/** + * Initialize focus in the popup: + * + * 1. If `toast` is `true`, don't steal focus from the document. + * 2. Else if there is an [autofocus] element, focus it. + * 3. Else if `focusConfirm` is `true` and confirm button is visible, focus it. + * 4. Else if `focusDeny` is `true` and deny button is visible, focus it. + * 5. Else if `focusCancel` is `true` and cancel button is visible, focus it. + * 6. Else focus the first focusable element in a popup (if any). + * + * @param {DomCache} domCache + * @param {SweetAlertOptions} innerParams + */ +const initFocus = (domCache, innerParams) => { + if (innerParams.toast) { + return; + } + // TODO: this is dumb, remove `allowEnterKey` param in the next major version + if (!callIfFunction(innerParams.allowEnterKey)) { + warnAboutDeprecation('allowEnterKey'); + blurActiveElement(); + return; + } + if (focusAutofocus(domCache)) { + return; + } + if (focusButton(domCache, innerParams)) { + return; + } + setFocus(-1, 1); +}; + +/** + * @param {DomCache} domCache + * @returns {boolean} + */ +const focusAutofocus = domCache => { + const autofocusElements = Array.from(domCache.popup.querySelectorAll('[autofocus]')); + for (const autofocusElement of autofocusElements) { + if (autofocusElement instanceof HTMLElement && isVisible$1(autofocusElement)) { + autofocusElement.focus(); + return true; + } + } + return false; +}; + +/** + * @param {DomCache} domCache + * @param {SweetAlertOptions} innerParams + * @returns {boolean} + */ +const focusButton = (domCache, innerParams) => { + if (innerParams.focusDeny && isVisible$1(domCache.denyButton)) { + domCache.denyButton.focus(); + return true; + } + if (innerParams.focusCancel && isVisible$1(domCache.cancelButton)) { + domCache.cancelButton.focus(); + return true; + } + if (innerParams.focusConfirm && isVisible$1(domCache.confirmButton)) { + domCache.confirmButton.focus(); + return true; + } + return false; +}; +const blurActiveElement = () => { + if (document.activeElement instanceof HTMLElement && typeof document.activeElement.blur === 'function') { + document.activeElement.blur(); + } +}; + +// Assign instance methods from src/instanceMethods/*.js to prototype +SweetAlert.prototype.disableButtons = disableButtons; +SweetAlert.prototype.enableButtons = enableButtons; +SweetAlert.prototype.getInput = getInput; +SweetAlert.prototype.disableInput = disableInput; +SweetAlert.prototype.enableInput = enableInput; +SweetAlert.prototype.hideLoading = hideLoading; +SweetAlert.prototype.disableLoading = hideLoading; +SweetAlert.prototype.showValidationMessage = showValidationMessage; +SweetAlert.prototype.resetValidationMessage = resetValidationMessage; +SweetAlert.prototype.close = close; +SweetAlert.prototype.closePopup = close; +SweetAlert.prototype.closeModal = close; +SweetAlert.prototype.closeToast = close; +SweetAlert.prototype.rejectPromise = rejectPromise; +SweetAlert.prototype.update = update; +SweetAlert.prototype._destroy = _destroy; + +// Assign static methods from src/staticMethods/*.js to constructor +Object.assign(SweetAlert, staticMethods); + +// Proxy to instance methods to constructor, for now, for backwards compatibility +Object.keys(instanceMethods).forEach(key => { + /** + * @param {...(SweetAlertOptions | string | undefined)} args + * @returns {SweetAlertResult | Promise | undefined} + */ + // @ts-ignore: Dynamic property assignment for backwards compatibility + SweetAlert[key] = function (...args) { + // @ts-ignore + if (currentInstance && currentInstance[key]) { + // @ts-ignore + return currentInstance[key](...args); + } + return undefined; + }; +}); +SweetAlert.DismissReason = DismissReason; +SweetAlert.version = '11.26.18'; + +const Swal = SweetAlert; +// @ts-ignore +Swal.default = Swal; + +export { Swal as default }; diff --git a/public/assets/sweetalert2/dist/sweetalert2.esm.min.js b/public/assets/sweetalert2/dist/sweetalert2.esm.min.js new file mode 100644 index 0000000..1c48d91 --- /dev/null +++ b/public/assets/sweetalert2/dist/sweetalert2.esm.min.js @@ -0,0 +1,5 @@ +/*! +* sweetalert2 v11.26.18 +* Released under the MIT License. +*/ +function e(e,t,n){if("function"==typeof e?e===t:e.has(t))return arguments.length<3?t:n;throw new TypeError("Private element is not present on this object")}function t(t,n){return t.get(e(t,n))}function n(e,t,n){(function(e,t){if(t.has(e))throw new TypeError("Cannot initialize the same private elements twice on an object")})(e,t),t.set(e,n)}const o={},i=e=>new Promise(t=>{if(!e)return t();const n=window.scrollX,i=window.scrollY;o.restoreFocusTimeout=setTimeout(()=>{o.previousActiveElement instanceof HTMLElement?(o.previousActiveElement.focus(),o.previousActiveElement=null):document.body&&document.body.focus(),t()},100),window.scrollTo(n,i)}),r="swal2-",s=["container","shown","height-auto","iosfix","popup","modal","no-backdrop","no-transition","toast","toast-shown","show","hide","close","title","html-container","actions","confirm","deny","cancel","footer","icon","icon-content","image","input","file","range","select","radio","checkbox","label","textarea","inputerror","input-label","validation-message","progress-steps","active-progress-step","progress-step","progress-step-line","loader","loading","styled","top","top-start","top-end","top-left","top-right","center","center-start","center-end","center-left","center-right","bottom","bottom-start","bottom-end","bottom-left","bottom-right","grow-row","grow-column","grow-fullscreen","rtl","timer-progress-bar","timer-progress-bar-container","scrollbar-measure","icon-success","icon-warning","icon-info","icon-question","icon-error","draggable","dragging"].reduce((e,t)=>(e[t]=r+t,e),{}),a=["success","warning","info","question","error"].reduce((e,t)=>(e[t]=r+t,e),{}),l="SweetAlert2:",c=e=>e.charAt(0).toUpperCase()+e.slice(1),u=e=>{console.warn(`${l} ${"object"==typeof e?e.join(" "):e}`)},d=e=>{console.error(`${l} ${e}`)},p=[],m=(e,t=null)=>{var n;n=`"${e}" is deprecated and will be removed in the next major release.${t?` Use "${t}" instead.`:""}`,p.includes(n)||(p.push(n),u(n))},h=e=>"function"==typeof e?e():e,g=e=>e&&"function"==typeof e.toPromise,f=e=>g(e)?e.toPromise():Promise.resolve(e),b=e=>e&&Promise.resolve(e)===e,y=()=>document.body.querySelector(`.${s.container}`),v=e=>{const t=y();return t?t.querySelector(e):null},w=e=>v(`.${e}`),C=()=>w(s.popup),A=()=>w(s.icon),E=()=>w(s.title),k=()=>w(s["html-container"]),B=()=>w(s.image),$=()=>w(s["progress-steps"]),L=()=>w(s["validation-message"]),P=()=>v(`.${s.actions} .${s.confirm}`),x=()=>v(`.${s.actions} .${s.cancel}`),T=()=>v(`.${s.actions} .${s.deny}`),S=()=>v(`.${s.loader}`),O=()=>w(s.actions),M=()=>w(s.footer),j=()=>w(s["timer-progress-bar"]),H=()=>w(s.close),I=()=>{const e=C();if(!e)return[];const t=e.querySelectorAll('[tabindex]:not([tabindex="-1"]):not([tabindex="0"])'),n=Array.from(t).sort((e,t)=>{const n=parseInt(e.getAttribute("tabindex")||"0"),o=parseInt(t.getAttribute("tabindex")||"0");return n>o?1:n"-1"!==e.getAttribute("tabindex"));return[...new Set(n.concat(i))].filter(e=>ee(e))},D=()=>N(document.body,s.shown)&&!N(document.body,s["toast-shown"])&&!N(document.body,s["no-backdrop"]),V=()=>{const e=C();return!!e&&N(e,s.toast)},q=(e,t)=>{if(e.textContent="",t){const n=(new DOMParser).parseFromString(t,"text/html"),o=n.querySelector("head");o&&Array.from(o.childNodes).forEach(t=>{e.appendChild(t)});const i=n.querySelector("body");i&&Array.from(i.childNodes).forEach(t=>{t instanceof HTMLVideoElement||t instanceof HTMLAudioElement?e.appendChild(t.cloneNode(!0)):e.appendChild(t)})}},N=(e,t)=>{if(!t)return!1;const n=t.split(/\s+/);for(let t=0;t{if(((e,t)=>{Array.from(e.classList).forEach(n=>{Object.values(s).includes(n)||Object.values(a).includes(n)||Object.values(t.showClass||{}).includes(n)||e.classList.remove(n)})})(e,t),!t.customClass)return;const o=t.customClass[n];o&&("string"==typeof o||o.forEach?z(e,o):u(`Invalid type of customClass.${n}! Expected string or iterable object, got "${typeof o}"`))},R=(e,t)=>{if(!t)return null;switch(t){case"select":case"textarea":case"file":return e.querySelector(`.${s.popup} > .${s[t]}`);case"checkbox":return e.querySelector(`.${s.popup} > .${s.checkbox} input`);case"radio":return e.querySelector(`.${s.popup} > .${s.radio} input:checked`)||e.querySelector(`.${s.popup} > .${s.radio} input:first-child`);case"range":return e.querySelector(`.${s.popup} > .${s.range} input`);default:return e.querySelector(`.${s.popup} > .${s.input}`)}},F=e=>{if(e.focus(),"file"!==e.type){const t=e.value;e.value="",e.value=t}},U=(e,t,n)=>{e&&t&&("string"==typeof t&&(t=t.split(/\s+/).filter(Boolean)),t.forEach(t=>{Array.isArray(e)?e.forEach(e=>{n?e.classList.add(t):e.classList.remove(t)}):n?e.classList.add(t):e.classList.remove(t)}))},z=(e,t)=>{U(e,t,!0)},W=(e,t)=>{U(e,t,!1)},K=(e,t)=>{const n=Array.from(e.children);for(let e=0;e{n===`${parseInt(`${n}`)}`&&(n=parseInt(n)),n||0===parseInt(`${n}`)?e.style.setProperty(t,"number"==typeof n?`${n}px`:n):e.style.removeProperty(t)},X=(e,t="flex")=>{e&&(e.style.display=t)},Z=e=>{e&&(e.style.display="none")},J=(e,t="block")=>{e&&new MutationObserver(()=>{Q(e,e.innerHTML,t)}).observe(e,{childList:!0,subtree:!0})},G=(e,t,n,o)=>{const i=e.querySelector(t);i&&i.style.setProperty(n,o)},Q=(e,t,n="flex")=>{t?X(e,n):Z(e)},ee=e=>Boolean(e&&(e.offsetWidth||e.offsetHeight||e.getClientRects().length)),te=e=>Boolean(e.scrollHeight>e.clientHeight),ne=e=>{const t=window.getComputedStyle(e),n=parseFloat(t.getPropertyValue("animation-duration")||"0"),o=parseFloat(t.getPropertyValue("transition-duration")||"0");return n>0||o>0},oe=(e,t=!1)=>{const n=j();n&&ee(n)&&(t&&(n.style.transition="none",n.style.width="100%"),setTimeout(()=>{n.style.transition=`width ${e/1e3}s linear`,n.style.width="0%"},10))},ie=`\n
              \n \n
                \n
                \n \n

                \n
                \n \n \n
                \n \n \n
                \n \n
                \n \n \n
                \n
                \n
                \n \n \n \n
                \n
                \n
                \n
                \n
                \n
                \n`.replace(/(^|\n)\s*/g,""),re=()=>{o.currentInstance&&o.currentInstance.resetValidationMessage()},se=e=>{const t=(()=>{const e=y();return!!e&&(e.remove(),W([document.documentElement,document.body],[s["no-backdrop"],s["toast-shown"],s["has-column"]]),!0)})();if("undefined"==typeof window||"undefined"==typeof document)return void d("SweetAlert2 requires document to initialize");const n=document.createElement("div");n.className=s.container,t&&z(n,s["no-transition"]),q(n,ie),n.dataset.swal2Theme=e.theme;const i=(e=>{if("string"==typeof e){const t=document.querySelector(e);if(!t)throw new Error(`Target element "${e}" not found`);return t}return e})(e.target||"body");i.appendChild(n),e.topLayer&&(n.setAttribute("popover",""),n.showPopover()),(e=>{const t=C();t&&(t.setAttribute("role",e.toast?"alert":"dialog"),t.setAttribute("aria-live",e.toast?"polite":"assertive"),e.toast||t.setAttribute("aria-modal","true"))})(e),(e=>{"rtl"===window.getComputedStyle(e).direction&&(z(y(),s.rtl),o.isRTL=!0)})(i),(()=>{const e=C();if(!e)return;const t=K(e,s.input),n=K(e,s.file),o=e.querySelector(`.${s.range} input`),i=e.querySelector(`.${s.range} output`),r=K(e,s.select),a=e.querySelector(`.${s.checkbox} input`),l=K(e,s.textarea);t&&(t.oninput=re),n&&(n.onchange=re),r&&(r.onchange=re),a&&(a.onchange=re),l&&(l.oninput=re),o&&i&&(o.oninput=()=>{re(),i.value=o.value},o.onchange=()=>{re(),i.value=o.value})})()},ae=(e,t)=>{e instanceof HTMLElement?t.appendChild(e):"object"==typeof e?le(e,t):e&&q(t,e)},le=(e,t)=>{"jquery"in e?ce(t,e):q(t,e.toString())},ce=(e,t)=>{if(e.textContent="",0 in t)for(let n=0;n in t;n++)e.appendChild(t[n].cloneNode(!0));else e.appendChild(t.cloneNode(!0))},ue=(e,t)=>{const n=O(),o=S();n&&o&&(t.showConfirmButton||t.showDenyButton||t.showCancelButton?X(n):Z(n),_(n,t,"actions"),function(e,t,n){const o=P(),i=T(),r=x();if(!o||!i||!r)return;pe(o,"confirm",n),pe(i,"deny",n),pe(r,"cancel",n),function(e,t,n,o){if(!o.buttonsStyling)return void W([e,t,n],s.styled);z([e,t,n],s.styled),o.confirmButtonColor&&e.style.setProperty("--swal2-confirm-button-background-color",o.confirmButtonColor);o.denyButtonColor&&t.style.setProperty("--swal2-deny-button-background-color",o.denyButtonColor);o.cancelButtonColor&&n.style.setProperty("--swal2-cancel-button-background-color",o.cancelButtonColor);de(e),de(t),de(n)}(o,i,r,n),n.reverseButtons&&(n.toast?(e.insertBefore(r,o),e.insertBefore(i,o)):(e.insertBefore(r,t),e.insertBefore(i,t),e.insertBefore(o,t)))}(n,o,t),q(o,t.loaderHtml||""),_(o,t,"loader"))};function de(e){const t=window.getComputedStyle(e);if(t.getPropertyValue("--swal2-action-button-focus-box-shadow"))return;const n=t.backgroundColor.replace(/rgba?\((\d+), (\d+), (\d+).*/,"rgba($1, $2, $3, 0.5)");e.style.setProperty("--swal2-action-button-focus-box-shadow",t.getPropertyValue("--swal2-outline").replace(/ rgba\(.*/,` ${n}`))}function pe(e,t,n){const o=c(t);Q(e,n[`show${o}Button`],"inline-block"),q(e,n[`${t}ButtonText`]||""),e.setAttribute("aria-label",n[`${t}ButtonAriaLabel`]||""),e.className=s[t],_(e,n,`${t}Button`)}const me=(e,t)=>{const n=y();n&&(!function(e,t){"string"==typeof t?e.style.background=t:t||z([document.documentElement,document.body],s["no-backdrop"])}(n,t.backdrop),function(e,t){if(!t)return;t in s?z(e,s[t]):(u('The "position" parameter is not valid, defaulting to "center"'),z(e,s.center))}(n,t.position),function(e,t){if(!t)return;z(e,s[`grow-${t}`])}(n,t.grow),_(n,t,"container"))};var he={innerParams:new WeakMap,domCache:new WeakMap};const ge=["input","file","range","select","radio","checkbox","textarea"],fe=e=>{if(!e.input)return;if(!Ee[e.input])return void d(`Unexpected type of input! Expected ${Object.keys(Ee).join(" | ")}, got "${e.input}"`);const t=Ce(e.input);if(!t)return;const n=Ee[e.input](t,e);X(t),e.inputAutoFocus&&setTimeout(()=>{F(n)})},be=(e,t)=>{const n=C();if(!n)return;const o=R(n,e);if(o){(e=>{for(let t=0;t{if(!e.input)return;const t=Ce(e.input);t&&_(t,e,"input")},ve=(e,t)=>{!e.placeholder&&t.inputPlaceholder&&(e.placeholder=t.inputPlaceholder)},we=(e,t,n)=>{if(n.inputLabel){const o=document.createElement("label"),i=s["input-label"];o.setAttribute("for",e.id),o.className=i,"object"==typeof n.customClass&&z(o,n.customClass.inputLabel),o.innerText=n.inputLabel,t.insertAdjacentElement("beforebegin",o)}},Ce=e=>{const t=C();if(t)return K(t,s[e]||s.input)},Ae=(e,t)=>{["string","number"].includes(typeof t)?e.value=`${t}`:b(t)||u(`Unexpected type of inputValue! Expected "string", "number" or "Promise", got "${typeof t}"`)},Ee={};Ee.text=Ee.email=Ee.password=Ee.number=Ee.tel=Ee.url=Ee.search=Ee.date=Ee["datetime-local"]=Ee.time=Ee.week=Ee.month=(e,t)=>{const n=e;return Ae(n,t.inputValue),we(n,n,t),ve(n,t),n.type=t.input,n},Ee.file=(e,t)=>{const n=e;return we(n,n,t),ve(n,t),n},Ee.range=(e,t)=>{const n=e,o=n.querySelector("input"),i=n.querySelector("output");return o&&(Ae(o,t.inputValue),o.type=t.input,we(o,e,t)),i&&Ae(i,t.inputValue),e},Ee.select=(e,t)=>{const n=e;if(n.textContent="",t.inputPlaceholder){const e=document.createElement("option");q(e,t.inputPlaceholder),e.value="",e.disabled=!0,e.selected=!0,n.appendChild(e)}return we(n,n,t),n},Ee.radio=e=>(e.textContent="",e),Ee.checkbox=(e,t)=>{const n=C();if(!n)throw new Error("Popup not found");const o=R(n,"checkbox");if(!o)throw new Error("Checkbox input not found");o.value="1",o.checked=Boolean(t.inputValue);const i=e.querySelector("span");if(i){const e=t.inputPlaceholder||t.inputLabel;e&&q(i,e)}return o},Ee.textarea=(e,t)=>{const n=e;Ae(n,t.inputValue),ve(n,t),we(n,n,t);return setTimeout(()=>{if("MutationObserver"in window){const e=C();if(!e)return;const o=parseInt(window.getComputedStyle(e).width);new MutationObserver(()=>{if(!document.body.contains(n))return;const e=n.offsetWidth+(i=n,parseInt(window.getComputedStyle(i).marginLeft)+parseInt(window.getComputedStyle(i).marginRight));var i;const r=C();r&&(e>o?r.style.width=`${e}px`:Y(r,"width",t.width))}).observe(n,{attributes:!0,attributeFilter:["style"]})}}),n};const ke=(e,t)=>{const n=k();n&&(J(n),_(n,t,"htmlContainer"),t.html?(ae(t.html,n),X(n,"block")):t.text?(n.textContent=t.text,X(n,"block")):Z(n),((e,t)=>{const n=C();if(!n)return;const o=he.innerParams.get(e),i=!o||t.input!==o.input;ge.forEach(e=>{const o=K(n,s[e]);o&&(be(e,t.inputAttributes),o.className=s[e],i&&Z(o))}),t.input&&(i&&fe(t),ye(t))})(e,t))},Be=(e,t)=>{for(const[n,o]of Object.entries(a))t.icon!==n&&W(e,o);z(e,t.icon&&a[t.icon]),Pe(e,t),$e(),_(e,t,"icon")},$e=()=>{const e=C();if(!e)return;const t=window.getComputedStyle(e).getPropertyValue("background-color"),n=e.querySelectorAll("[class^=swal2-success-circular-line], .swal2-success-fix");for(let e=0;e{if(!t.icon&&!t.iconHtml)return;let n=e.innerHTML,o="";if(t.iconHtml)o=xe(t.iconHtml);else if("success"===t.icon)o=(e=>`\n ${e.animation?'
                ':""}\n \n
                \n ${e.animation?'
                ':""}\n ${e.animation?'
                ':""}\n`)(t),n=n.replace(/ style=".*?"/g,"");else if("error"===t.icon)o='\n \n \n \n \n';else if(t.icon){o=xe({question:"?",warning:"!",info:"i"}[t.icon])}n.trim()!==o.trim()&&q(e,o)},Pe=(e,t)=>{if(t.iconColor){e.style.color=t.iconColor,e.style.borderColor=t.iconColor;for(const n of[".swal2-success-line-tip",".swal2-success-line-long",".swal2-x-mark-line-left",".swal2-x-mark-line-right"])G(e,n,"background-color",t.iconColor);G(e,".swal2-success-ring","border-color",t.iconColor)}},xe=e=>`
                ${e}
                `;let Te=!1,Se=0,Oe=0,Me=0,je=0;const He=e=>{const t=C();if(!t)return;const n=A();if(e.target===t||n&&n.contains(e.target)){Te=!0;const n=Ve(e);Se=n.clientX,Oe=n.clientY,Me=parseInt(t.style.insetInlineStart)||0,je=parseInt(t.style.insetBlockStart)||0,z(t,"swal2-dragging")}},Ie=e=>{const t=C();if(t&&Te){let{clientX:n,clientY:i}=Ve(e);const r=n-Se;t.style.insetInlineStart=`${Me+(o.isRTL?-r:r)}px`,t.style.insetBlockStart=`${je+(i-Oe)}px`}},De=()=>{const e=C();Te=!1,W(e,"swal2-dragging")},Ve=e=>{let t=0,n=0;return e.type.startsWith("mouse")?(t=e.clientX,n=e.clientY):e.type.startsWith("touch")&&(t=e.touches[0].clientX,n=e.touches[0].clientY),{clientX:t,clientY:n}},qe=(e,t)=>{const n=y(),o=C();if(n&&o){if(t.toast){Y(n,"width",t.width),o.style.width="100%";const e=S();e&&o.insertBefore(e,A())}else Y(o,"width",t.width);Y(o,"padding",t.padding),t.color&&(o.style.color=t.color),t.background&&(o.style.background=t.background),Z(L()),Ne(o,t),t.draggable&&!t.toast?(z(o,s.draggable),(e=>{e.addEventListener("mousedown",He),document.body.addEventListener("mousemove",Ie),e.addEventListener("mouseup",De),e.addEventListener("touchstart",He),document.body.addEventListener("touchmove",Ie),e.addEventListener("touchend",De)})(o)):(W(o,s.draggable),(e=>{e.removeEventListener("mousedown",He),document.body.removeEventListener("mousemove",Ie),e.removeEventListener("mouseup",De),e.removeEventListener("touchstart",He),document.body.removeEventListener("touchmove",Ie),e.removeEventListener("touchend",De)})(o))}},Ne=(e,t)=>{const n=t.showClass||{};e.className=`${s.popup} ${ee(e)?n.popup:""}`,t.toast?(z([document.documentElement,document.body],s["toast-shown"]),z(e,s.toast)):z(e,s.modal),_(e,t,"popup"),"string"==typeof t.customClass&&z(e,t.customClass),t.icon&&z(e,s[`icon-${t.icon}`])},_e=e=>{const t=document.createElement("li");return z(t,s["progress-step"]),q(t,e),t},Re=e=>{const t=document.createElement("li");return z(t,s["progress-step-line"]),e.progressStepsDistance&&Y(t,"width",e.progressStepsDistance),t},Fe=(e,t)=>{var n;qe(0,t),me(0,t),((e,t)=>{const n=$();if(!n)return;const{progressSteps:o,currentProgressStep:i}=t;o&&0!==o.length&&void 0!==i?(X(n),n.textContent="",i>=o.length&&u("Invalid currentProgressStep parameter, it should be less than progressSteps.length (currentProgressStep like JS arrays starts from 0)"),o.forEach((e,r)=>{const a=_e(e);if(n.appendChild(a),r===i&&z(a,s["active-progress-step"]),r!==o.length-1){const e=Re(t);n.appendChild(e)}})):Z(n)})(0,t),((e,t)=>{const n=he.innerParams.get(e),o=A();if(!o)return;if(n&&t.icon===n.icon)return Le(o,t),void Be(o,t);if(!t.icon&&!t.iconHtml)return void Z(o);if(t.icon&&-1===Object.keys(a).indexOf(t.icon))return d(`Unknown icon! Expected "success", "error", "warning", "info" or "question", got "${t.icon}"`),void Z(o);X(o),Le(o,t),Be(o,t),z(o,t.showClass&&t.showClass.icon),window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change",$e)})(e,t),((e,t)=>{const n=B();n&&(t.imageUrl?(X(n,""),n.setAttribute("src",t.imageUrl),n.setAttribute("alt",t.imageAlt||""),Y(n,"width",t.imageWidth),Y(n,"height",t.imageHeight),n.className=s.image,_(n,t,"image")):Z(n))})(0,t),((e,t)=>{const n=E();n&&(J(n),Q(n,Boolean(t.title||t.titleText),"block"),t.title&&ae(t.title,n),t.titleText&&(n.innerText=t.titleText),_(n,t,"title"))})(0,t),((e,t)=>{const n=H();n&&(q(n,t.closeButtonHtml||""),_(n,t,"closeButton"),Q(n,t.showCloseButton),n.setAttribute("aria-label",t.closeButtonAriaLabel||""))})(0,t),ke(e,t),ue(0,t),((e,t)=>{const n=M();n&&(J(n),Q(n,Boolean(t.footer),"block"),t.footer&&ae(t.footer,n),_(n,t,"footer"))})(0,t);const i=C();"function"==typeof t.didRender&&i&&t.didRender(i),null===(n=o.eventEmitter)||void 0===n||n.emit("didRender",i)},Ue=()=>{var e;return null===(e=P())||void 0===e?void 0:e.click()},ze=Object.freeze({cancel:"cancel",backdrop:"backdrop",close:"close",esc:"esc",timer:"timer"}),We=e=>{if(e.keydownTarget&&e.keydownHandlerAdded&&e.keydownHandler){const t=e.keydownHandler;e.keydownTarget.removeEventListener("keydown",t,{capture:e.keydownListenerCapture}),e.keydownHandlerAdded=!1}},Ke=(e,t)=>{var n;const o=I();if(o.length)return-2===(e+=t)&&(e=o.length-1),e===o.length?e=0:-1===e&&(e=o.length-1),void o[e].focus();null===(n=C())||void 0===n||n.focus()},Ye=["ArrowRight","ArrowDown"],Xe=["ArrowLeft","ArrowUp"],Ze=(e,t,n)=>{e&&(t.isComposing||229===t.keyCode||(e.stopKeydownPropagation&&t.stopPropagation(),"Enter"===t.key?Je(t,e):"Tab"===t.key?Ge(t):[...Ye,...Xe].includes(t.key)?Qe(t.key):"Escape"===t.key&&et(t,e,n)))},Je=(e,t)=>{if(!h(t.allowEnterKey))return;const n=C();if(!n||!t.input)return;const o=R(n,t.input);if(e.target&&o&&e.target instanceof HTMLElement&&e.target.outerHTML===o.outerHTML){if(["textarea","file"].includes(t.input))return;Ue(),e.preventDefault()}},Ge=e=>{const t=e.target,n=I();let o=-1;for(let e=0;e{const t=O(),n=P(),o=T(),i=x();if(!(t&&n&&o&&i))return;const r=[n,o,i];if(document.activeElement instanceof HTMLElement&&!r.includes(document.activeElement))return;const s=Ye.includes(e)?"nextElementSibling":"previousElementSibling";let a=document.activeElement;if(a){for(let e=0;e{e.preventDefault(),h(t.allowEscapeKey)&&n(ze.esc)};var tt={swalPromiseResolve:new WeakMap,swalPromiseReject:new WeakMap};const nt=()=>{Array.from(document.body.children).forEach(e=>{e.hasAttribute("data-previous-aria-hidden")?(e.setAttribute("aria-hidden",e.getAttribute("data-previous-aria-hidden")||""),e.removeAttribute("data-previous-aria-hidden")):e.removeAttribute("aria-hidden")})},ot="undefined"!=typeof window&&Boolean(window.GestureEvent),it=()=>{const e=y();if(!e)return;let t;e.ontouchstart=e=>{t=rt(e)},e.ontouchmove=e=>{t&&(e.preventDefault(),e.stopPropagation())}},rt=e=>{const t=e.target,n=y(),o=k();return!(!n||!o)&&(!st(e)&&!at(e)&&(t===n||!(te(n)||!(t instanceof HTMLElement)||((e,t)=>{let n=e;for(;n&&n!==t;){if(te(n))return!0;n=n.parentElement}return!1})(t,o)||"INPUT"===t.tagName||"TEXTAREA"===t.tagName||te(o)&&o.contains(t))))},st=e=>Boolean(e.touches&&e.touches.length&&"stylus"===e.touches[0].touchType),at=e=>e.touches&&e.touches.length>1;let lt=null;const ct=e=>{null===lt&&(document.body.scrollHeight>window.innerHeight||"scroll"===e)&&(lt=parseInt(window.getComputedStyle(document.body).getPropertyValue("padding-right")),document.body.style.paddingRight=`${lt+(()=>{const e=document.createElement("div");e.className=s["scrollbar-measure"],document.body.appendChild(e);const t=e.getBoundingClientRect().width-e.clientWidth;return document.body.removeChild(e),t})()}px`)};function ut(e,t,n,r){V()?yt(e,r):(i(n).then(()=>yt(e,r)),We(o)),ot?(t.setAttribute("style","display:none !important"),t.removeAttribute("class"),t.innerHTML=""):t.remove(),D()&&(null!==lt&&(document.body.style.paddingRight=`${lt}px`,lt=null),(()=>{if(N(document.body,s.iosfix)){const e=parseInt(document.body.style.top,10);W(document.body,s.iosfix),document.body.style.top="",document.body.scrollTop=-1*e}})(),nt()),W([document.documentElement,document.body],[s.shown,s["height-auto"],s["no-backdrop"],s["toast-shown"]])}function dt(e){e=gt(e);const t=tt.swalPromiseResolve.get(this),n=pt(this);this.isAwaitingPromise?e.isDismissed||(ht(this),t(e)):n&&t(e)}const pt=e=>{const t=C();if(!t)return!1;const n=he.innerParams.get(e);if(!n||N(t,n.hideClass.popup))return!1;W(t,n.showClass.popup),z(t,n.hideClass.popup);const o=y();return W(o,n.showClass.backdrop),z(o,n.hideClass.backdrop),ft(e,t,n),!0};function mt(e){const t=tt.swalPromiseReject.get(this);ht(this),t&&t(e)}const ht=e=>{e.isAwaitingPromise&&(delete e.isAwaitingPromise,he.innerParams.get(e)||e._destroy())},gt=e=>void 0===e?{isConfirmed:!1,isDenied:!1,isDismissed:!0}:Object.assign({isConfirmed:!1,isDenied:!1,isDismissed:!1},e),ft=(e,t,n)=>{var i;const r=y(),s=ne(t);"function"==typeof n.willClose&&n.willClose(t),null===(i=o.eventEmitter)||void 0===i||i.emit("willClose",t),s&&r?bt(e,t,r,Boolean(n.returnFocus),n.didClose):r&&ut(e,r,Boolean(n.returnFocus),n.didClose)},bt=(e,t,n,i,r)=>{o.swalCloseEventFinishedCallback=ut.bind(null,e,n,i,r);const s=function(e){var n;e.target===t&&(null===(n=o.swalCloseEventFinishedCallback)||void 0===n||n.call(o),delete o.swalCloseEventFinishedCallback,t.removeEventListener("animationend",s),t.removeEventListener("transitionend",s))};t.addEventListener("animationend",s),t.addEventListener("transitionend",s)},yt=(e,t)=>{setTimeout(()=>{var n;"function"==typeof t&&t.bind(e.params)(),null===(n=o.eventEmitter)||void 0===n||n.emit("didClose"),e._destroy&&e._destroy()})},vt=e=>{let t=C();if(t||new Qn,t=C(),!t)return;const n=S();V()?Z(A()):wt(t,e),X(n),t.setAttribute("data-loading","true"),t.setAttribute("aria-busy","true"),t.focus()},wt=(e,t)=>{const n=O(),o=S();n&&o&&(!t&&ee(P())&&(t=P()),X(n),t&&(Z(t),o.setAttribute("data-button-to-replace",t.className),n.insertBefore(o,t)),z([e,n],s.loading))},Ct=e=>e.checked?1:0,At=e=>e.checked?e.value:null,Et=e=>e.files&&e.files.length?null!==e.getAttribute("multiple")?e.files:e.files[0]:null,kt=(e,t)=>{const n=C();if(!n)return;const o=e=>{"select"===t.input?function(e,t,n){const o=K(e,s.select);if(!o)return;const i=(e,t,o)=>{const i=document.createElement("option");i.value=o,q(i,t),i.selected=Lt(o,n.inputValue),e.appendChild(i)};t.forEach(e=>{const t=e[0],n=e[1];if(Array.isArray(n)){const e=document.createElement("optgroup");e.label=t,e.disabled=!1,o.appendChild(e),n.forEach(t=>i(e,t[1],t[0]))}else i(o,n,t)}),o.focus()}(n,$t(e),t):"radio"===t.input&&function(e,t,n){const o=K(e,s.radio);if(!o)return;t.forEach(e=>{const t=e[0],i=e[1],r=document.createElement("input"),a=document.createElement("label");r.type="radio",r.name=s.radio,r.value=t,Lt(t,n.inputValue)&&(r.checked=!0);const l=document.createElement("span");q(l,i),l.className=s.label,a.appendChild(r),a.appendChild(l),o.appendChild(a)});const i=o.querySelectorAll("input");i.length&&i[0].focus()}(n,$t(e),t)};g(t.inputOptions)||b(t.inputOptions)?(vt(P()),f(t.inputOptions).then(t=>{e.hideLoading(),o(t)})):"object"==typeof t.inputOptions?o(t.inputOptions):d("Unexpected type of inputOptions! Expected object, Map or Promise, got "+typeof t.inputOptions)},Bt=(e,t)=>{const n=e.getInput();n&&(Z(n),f(t.inputValue).then(o=>{n.value="number"===t.input?`${parseFloat(o)||0}`:`${o}`,X(n),n.focus(),e.hideLoading()}).catch(t=>{d(`Error in inputValue promise: ${t}`),n.value="",X(n),n.focus(),e.hideLoading()}))};const $t=e=>{const t=[];return e instanceof Map?e.forEach((e,n)=>{let o=e;"object"==typeof o&&(o=$t(o)),t.push([n,o])}):Object.keys(e).forEach(n=>{let o=e[n];"object"==typeof o&&(o=$t(o)),t.push([n,o])}),t},Lt=(e,t)=>Boolean(t)&&null!=t&&t.toString()===e.toString(),Pt=(e,t)=>{const n=he.innerParams.get(e);if(!n.input)return void d(`The "input" parameter is needed to be set when using returnInputValueOn${c(t)}`);const o=e.getInput(),i=((e,t)=>{const n=e.getInput();if(!n)return null;switch(t.input){case"checkbox":return Ct(n);case"radio":return At(n);case"file":return Et(n);default:return t.inputAutoTrim?n.value.trim():n.value}})(e,n);n.inputValidator?xt(e,i,t):o&&!o.checkValidity()?(e.enableButtons(),e.showValidationMessage(n.validationMessage||o.validationMessage)):"deny"===t?Tt(e,i):Mt(e,i)},xt=(e,t,n)=>{const o=he.innerParams.get(e);e.disableInput();Promise.resolve().then(()=>f(o.inputValidator(t,o.validationMessage))).then(o=>{e.enableButtons(),e.enableInput(),o?e.showValidationMessage(o):"deny"===n?Tt(e,t):Mt(e,t)})},Tt=(e,t)=>{const n=he.innerParams.get(e);if(n.showLoaderOnDeny&&vt(T()),n.preDeny){e.isAwaitingPromise=!0;Promise.resolve().then(()=>f(n.preDeny(t,n.validationMessage))).then(n=>{!1===n?(e.hideLoading(),ht(e)):e.close({isDenied:!0,value:void 0===n?t:n})}).catch(t=>Ot(e,t))}else e.close({isDenied:!0,value:t})},St=(e,t)=>{e.close({isConfirmed:!0,value:t})},Ot=(e,t)=>{e.rejectPromise(t)},Mt=(e,t)=>{const n=he.innerParams.get(e);if(n.showLoaderOnConfirm&&vt(),n.preConfirm){e.resetValidationMessage(),e.isAwaitingPromise=!0;Promise.resolve().then(()=>f(n.preConfirm(t,n.validationMessage))).then(n=>{ee(L())||!1===n?(e.hideLoading(),ht(e)):St(e,void 0===n?t:n)}).catch(t=>Ot(e,t))}else St(e,t)};function jt(){const e=he.innerParams.get(this);if(!e)return;const t=he.domCache.get(this);Z(t.loader),V()?e.icon&&X(A()):Ht(t),W([t.popup,t.actions],s.loading),t.popup.removeAttribute("aria-busy"),t.popup.removeAttribute("data-loading"),t.confirmButton.disabled=!1,t.denyButton.disabled=!1,t.cancelButton.disabled=!1}const Ht=e=>{const t=e.loader.getAttribute("data-button-to-replace"),n=t?e.popup.getElementsByClassName(t):[];n.length?X(n[0],"inline-block"):ee(P())||ee(T())||ee(x())||Z(e.actions)};function It(){const e=he.innerParams.get(this),t=he.domCache.get(this);return t?R(t.popup,e.input):null}function Dt(e,t,n){const o=he.domCache.get(e);t.forEach(e=>{o[e].disabled=n})}function Vt(e,t){const n=C();if(n&&e)if("radio"===e.type){const e=n.querySelectorAll(`[name="${s.radio}"]`);for(let n=0;nObject.prototype.hasOwnProperty.call(zt,e),Zt=e=>-1!==Wt.indexOf(e),Jt=e=>Kt[e],Gt=e=>{Xt(e)||u(`Unknown parameter "${e}"`)},Qt=e=>{Yt.includes(e)&&u(`The parameter "${e}" is incompatible with toasts`)},en=e=>{const t=Jt(e);t&&m(e,t)},tn=e=>{!1===e.backdrop&&e.allowOutsideClick&&u('"allowOutsideClick" parameter requires `backdrop` parameter to be set to `true`'),e.theme&&!["light","dark","auto","minimal","borderless","bootstrap-4","bootstrap-4-light","bootstrap-4-dark","bootstrap-5","bootstrap-5-light","bootstrap-5-dark","material-ui","material-ui-light","material-ui-dark","embed-iframe","bulma","bulma-light","bulma-dark"].includes(e.theme)&&u(`Invalid theme "${e.theme}"`);for(const t in e)Gt(t),e.toast&&Qt(t),en(t)};function nn(e){const t=y(),n=C(),o=he.innerParams.get(this);if(!n||N(n,o.hideClass.popup))return void u("You're trying to update the closed or closing popup, that won't work. Use the update() method in preConfirm parameter or show a new popup.");const i=on(e),r=Object.assign({},o,i);tn(r),t&&(t.dataset.swal2Theme=r.theme),Fe(this,r),he.innerParams.set(this,r),Object.defineProperties(this,{params:{value:Object.assign({},this.params,e),writable:!1,enumerable:!0}})}const on=e=>{const t={};return Object.keys(e).forEach(n=>{if(Zt(n)){const o=e;t[n]=o[n]}else u(`Invalid parameter to update: ${n}`)}),t};function rn(){var e;const t=he.domCache.get(this),n=he.innerParams.get(this);n?(t.popup&&o.swalCloseEventFinishedCallback&&(o.swalCloseEventFinishedCallback(),delete o.swalCloseEventFinishedCallback),"function"==typeof n.didDestroy&&n.didDestroy(),null===(e=o.eventEmitter)||void 0===e||e.emit("didDestroy"),sn(this)):an(this)}const sn=e=>{an(e),delete e.params,delete o.keydownHandler,delete o.keydownTarget,delete o.currentInstance},an=e=>{e.isAwaitingPromise?(ln(he,e),e.isAwaitingPromise=!0):(ln(tt,e),ln(he,e),delete e.isAwaitingPromise,delete e.disableButtons,delete e.enableButtons,delete e.getInput,delete e.disableInput,delete e.enableInput,delete e.hideLoading,delete e.disableLoading,delete e.showValidationMessage,delete e.resetValidationMessage,delete e.close,delete e.closePopup,delete e.closeModal,delete e.closeToast,delete e.rejectPromise,delete e.update,delete e._destroy)},ln=(e,t)=>{for(const n in e)e[n].delete(t)};var cn=Object.freeze({__proto__:null,_destroy:rn,close:dt,closeModal:dt,closePopup:dt,closeToast:dt,disableButtons:Nt,disableInput:Rt,disableLoading:jt,enableButtons:qt,enableInput:_t,getInput:It,handleAwaitingPromise:ht,hideLoading:jt,rejectPromise:mt,resetValidationMessage:Ut,showValidationMessage:Ft,update:nn});const un=(e,t,n)=>{t.popup.onclick=()=>{e&&(dn(e)||e.timer||e.input)||n(ze.close)}},dn=e=>Boolean(e.showConfirmButton||e.showDenyButton||e.showCancelButton||e.showCloseButton);let pn=!1;const mn=e=>{e.popup.onmousedown=()=>{e.container.onmouseup=function(t){e.container.onmouseup=()=>{},t.target===e.container&&(pn=!0)}}},hn=e=>{e.container.onmousedown=t=>{t.target===e.container&&t.preventDefault(),e.popup.onmouseup=function(t){e.popup.onmouseup=()=>{},(t.target===e.popup||t.target instanceof HTMLElement&&e.popup.contains(t.target))&&(pn=!0)}}},gn=(e,t,n)=>{t.container.onclick=o=>{pn?pn=!1:o.target===t.container&&h(e.allowOutsideClick)&&n(ze.backdrop)}},fn=e=>e instanceof Element||(e=>"object"==typeof e&&null!==e&&"jquery"in e)(e);const bn=()=>{if(o.timeout)return(()=>{const e=j();if(!e)return;const t=parseInt(window.getComputedStyle(e).width);e.style.removeProperty("transition"),e.style.width="100%";const n=t/parseInt(window.getComputedStyle(e).width)*100;e.style.width=`${n}%`})(),o.timeout.stop()},yn=()=>{if(o.timeout){const e=o.timeout.start();return oe(e),e}};let vn=!1;const wn={};const Cn=e=>{for(let t=e.target;t&&t!==document;t=t.parentNode)for(const e in wn){const n=t.getAttribute&&t.getAttribute(e);if(n)return void wn[e].fire({template:n})}};o.eventEmitter=new class{constructor(){this.events={}}_getHandlersByEventName(e){return void 0===this.events[e]&&(this.events[e]=[]),this.events[e]}on(e,t){const n=this._getHandlersByEventName(e);n.includes(t)||n.push(t)}once(e,t){const n=(...o)=>{this.removeListener(e,n),t.apply(this,o)};this.on(e,n)}emit(e,...t){this._getHandlersByEventName(e).forEach(e=>{try{e.apply(this,t)}catch(e){console.error(e)}})}removeListener(e,t){const n=this._getHandlersByEventName(e),o=n.indexOf(t);o>-1&&n.splice(o,1)}removeAllListeners(e){void 0!==this.events[e]&&(this.events[e].length=0)}reset(){this.events={}}};var An=Object.freeze({__proto__:null,argsToParams:e=>{const t={};return"object"!=typeof e[0]||fn(e[0])?["title","html","icon"].forEach((n,o)=>{const i=e[o];"string"==typeof i||fn(i)?t[n]=i:void 0!==i&&d(`Unexpected type of ${n}! Expected "string" or "Element", got ${typeof i}`)}):Object.assign(t,e[0]),t},bindClickHandler:function(e="data-swal-template"){wn[e]=this,vn||(document.body.addEventListener("click",Cn),vn=!0)},clickCancel:()=>{var e;return null===(e=x())||void 0===e?void 0:e.click()},clickConfirm:Ue,clickDeny:()=>{var e;return null===(e=T())||void 0===e?void 0:e.click()},enableLoading:vt,fire:function(...e){return new this(...e)},getActions:O,getCancelButton:x,getCloseButton:H,getConfirmButton:P,getContainer:y,getDenyButton:T,getFocusableElements:I,getFooter:M,getHtmlContainer:k,getIcon:A,getIconContent:()=>w(s["icon-content"]),getImage:B,getInputLabel:()=>w(s["input-label"]),getLoader:S,getPopup:C,getProgressSteps:$,getTimerLeft:()=>o.timeout&&o.timeout.getTimerLeft(),getTimerProgressBar:j,getTitle:E,getValidationMessage:L,increaseTimer:e=>{if(o.timeout){const t=o.timeout.increase(e);return oe(t,!0),t}},isDeprecatedParameter:Jt,isLoading:()=>{const e=C();return!!e&&e.hasAttribute("data-loading")},isTimerRunning:()=>Boolean(o.timeout&&o.timeout.isRunning()),isUpdatableParameter:Zt,isValidParameter:Xt,isVisible:()=>ee(C()),mixin:function(e){return class extends(this){_main(t,n){return super._main(t,Object.assign({},e,n))}}},off:(e,t)=>{o.eventEmitter&&(e?t?o.eventEmitter.removeListener(e,t):o.eventEmitter.removeAllListeners(e):o.eventEmitter.reset())},on:(e,t)=>{o.eventEmitter&&o.eventEmitter.on(e,t)},once:(e,t)=>{o.eventEmitter&&o.eventEmitter.once(e,t)},resumeTimer:yn,showLoading:vt,stopTimer:bn,toggleTimer:()=>{const e=o.timeout;return e&&(e.running?bn():yn())}});class En{constructor(e,t){this.callback=e,this.remaining=t,this.running=!1,this.start()}start(){return this.running||(this.running=!0,this.started=new Date,this.id=setTimeout(this.callback,this.remaining)),this.remaining}stop(){return this.started&&this.running&&(this.running=!1,clearTimeout(this.id),this.remaining-=(new Date).getTime()-this.started.getTime()),this.remaining}increase(e){const t=this.running;return t&&this.stop(),this.remaining+=e,t&&this.start(),this.remaining}getTimerLeft(){return this.running&&(this.stop(),this.start()),this.remaining}isRunning(){return this.running}}const kn=["swal-title","swal-html","swal-footer"],Bn=e=>{const t={};return Array.from(e.querySelectorAll("swal-param")).forEach(e=>{Mn(e,["name","value"]);const n=e.getAttribute("name"),o=e.getAttribute("value");n&&o&&(t[n]=n in zt&&"boolean"==typeof zt[n]?"false"!==o:n in zt&&"object"==typeof zt[n]?JSON.parse(o):o)}),t},$n=e=>{const t={};return Array.from(e.querySelectorAll("swal-function-param")).forEach(e=>{const n=e.getAttribute("name"),o=e.getAttribute("value");n&&o&&(t[n]=new Function(`return ${o}`)())}),t},Ln=e=>{const t={};return Array.from(e.querySelectorAll("swal-button")).forEach(e=>{Mn(e,["type","color","aria-label"]);const n=e.getAttribute("type");if(n&&["confirm","cancel","deny"].includes(n)){if(t[`${n}ButtonText`]=e.innerHTML,t[`show${c(n)}Button`]=!0,e.hasAttribute("color")){const o=e.getAttribute("color");null!==o&&(t[`${n}ButtonColor`]=o)}if(e.hasAttribute("aria-label")){const o=e.getAttribute("aria-label");null!==o&&(t[`${n}ButtonAriaLabel`]=o)}}}),t},Pn=e=>{const t={},n=e.querySelector("swal-image");return n&&(Mn(n,["src","width","height","alt"]),n.hasAttribute("src")&&(t.imageUrl=n.getAttribute("src")||void 0),n.hasAttribute("width")&&(t.imageWidth=n.getAttribute("width")||void 0),n.hasAttribute("height")&&(t.imageHeight=n.getAttribute("height")||void 0),n.hasAttribute("alt")&&(t.imageAlt=n.getAttribute("alt")||void 0)),t},xn=e=>{const t={},n=e.querySelector("swal-icon");return n&&(Mn(n,["type","color"]),n.hasAttribute("type")&&(t.icon=n.getAttribute("type")),n.hasAttribute("color")&&(t.iconColor=n.getAttribute("color")),t.iconHtml=n.innerHTML),t},Tn=e=>{const t={},n=e.querySelector("swal-input");n&&(Mn(n,["type","label","placeholder","value"]),t.input=n.getAttribute("type")||"text",n.hasAttribute("label")&&(t.inputLabel=n.getAttribute("label")),n.hasAttribute("placeholder")&&(t.inputPlaceholder=n.getAttribute("placeholder")),n.hasAttribute("value")&&(t.inputValue=n.getAttribute("value")));const o=Array.from(e.querySelectorAll("swal-input-option"));return o.length&&(t.inputOptions={},o.forEach(e=>{Mn(e,["value"]);const n=e.getAttribute("value");if(!n)return;const o=e.innerHTML;t.inputOptions[n]=o})),t},Sn=(e,t)=>{const n={};for(const o in t){const i=t[o],r=e.querySelector(i);r&&(Mn(r,[]),n[i.replace(/^swal-/,"")]=r.innerHTML.trim())}return n},On=e=>{const t=kn.concat(["swal-param","swal-function-param","swal-button","swal-image","swal-icon","swal-input","swal-input-option"]);Array.from(e.children).forEach(e=>{const n=e.tagName.toLowerCase();t.includes(n)||u(`Unrecognized element <${n}>`)})},Mn=(e,t)=>{Array.from(e.attributes).forEach(n=>{-1===t.indexOf(n.name)&&u([`Unrecognized attribute "${n.name}" on <${e.tagName.toLowerCase()}>.`,""+(t.length?`Allowed attributes are: ${t.join(", ")}`:"To set the value, use HTML within the element.")])})},jn=e=>{var t,n;const i=y(),r=C();if(!i||!r)return;"function"==typeof e.willOpen&&e.willOpen(r),null===(t=o.eventEmitter)||void 0===t||t.emit("willOpen",r);const s=window.getComputedStyle(document.body).overflowY;if(Vn(i,r,e),setTimeout(()=>{In(i,r)},10),D()&&(Dn(i,void 0!==e.scrollbarPadding&&e.scrollbarPadding,s),(()=>{const e=y();Array.from(document.body.children).forEach(t=>{t.contains(e)||(t.hasAttribute("aria-hidden")&&t.setAttribute("data-previous-aria-hidden",t.getAttribute("aria-hidden")||""),t.setAttribute("aria-hidden","true"))})})()),V()||o.previousActiveElement||(o.previousActiveElement=document.activeElement),"function"==typeof e.didOpen){const t=e.didOpen;setTimeout(()=>t(r))}null===(n=o.eventEmitter)||void 0===n||n.emit("didOpen",r)},Hn=e=>{const t=C();if(!t||e.target!==t)return;const n=y();n&&(t.removeEventListener("animationend",Hn),t.removeEventListener("transitionend",Hn),n.style.overflowY="auto",W(n,s["no-transition"]))},In=(e,t)=>{ne(t)?(e.style.overflowY="hidden",t.addEventListener("animationend",Hn),t.addEventListener("transitionend",Hn)):e.style.overflowY="auto"},Dn=(e,t,n)=>{(()=>{if(ot&&!N(document.body,s.iosfix)){const e=document.body.scrollTop;document.body.style.top=-1*e+"px",z(document.body,s.iosfix),it()}})(),t&&"hidden"!==n&&ct(n),setTimeout(()=>{e.scrollTop=0})},Vn=(e,t,n)=>{var o;null!==(o=n.showClass)&&void 0!==o&&o.backdrop&&z(e,n.showClass.backdrop),n.animation?(t.style.setProperty("opacity","0","important"),X(t,"grid"),setTimeout(()=>{var e;null!==(e=n.showClass)&&void 0!==e&&e.popup&&z(t,n.showClass.popup),t.style.removeProperty("opacity")},10)):X(t,"grid"),z([document.documentElement,document.body],s.shown),n.heightAuto&&n.backdrop&&!n.toast&&z([document.documentElement,document.body],s["height-auto"])};var qn=(e,t)=>/^[a-zA-Z0-9.+_'-]+@[a-zA-Z0-9.-]+\.[a-zA-Z0-9-]+$/.test(e)?Promise.resolve():Promise.resolve(t||"Invalid email address"),Nn=(e,t)=>/^https?:\/\/(www\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\.[a-z]{2,63}\b([-a-zA-Z0-9@:%_+.~#?&/=]*)$/.test(e)?Promise.resolve():Promise.resolve(t||"Invalid URL");function _n(e){!function(e){e.inputValidator||("email"===e.input&&(e.inputValidator=qn),"url"===e.input&&(e.inputValidator=Nn))}(e),e.showLoaderOnConfirm&&!e.preConfirm&&u("showLoaderOnConfirm is set to true, but preConfirm is not defined.\nshowLoaderOnConfirm should be used together with preConfirm, see usage example:\nhttps://sweetalert2.github.io/#ajax-request"),function(e){(!e.target||"string"==typeof e.target&&!document.querySelector(e.target)||"string"!=typeof e.target&&!e.target.appendChild)&&(u('Target parameter is not valid, defaulting to "body"'),e.target="body")}(e),"string"==typeof e.title&&(e.title=e.title.split("\n").join("
                ")),se(e)}let Rn;var Fn=new WeakMap;class Un{constructor(...t){if(n(this,Fn,Promise.resolve({isConfirmed:!1,isDenied:!1,isDismissed:!0})),"undefined"==typeof window)return;Rn=this;const o=Object.freeze(this.constructor.argsToParams(t));var i,r,s;this.params=o,this.isAwaitingPromise=!1,i=Fn,r=this,s=this._main(Rn.params),i.set(e(i,r),s)}_main(e,t={}){if(tn(Object.assign({},t,e)),o.currentInstance){const e=tt.swalPromiseResolve.get(o.currentInstance),{isAwaitingPromise:t}=o.currentInstance;o.currentInstance._destroy(),t||e({isDismissed:!0}),D()&&nt()}o.currentInstance=Rn;const n=Wn(e,t);_n(n),Object.freeze(n),o.timeout&&(o.timeout.stop(),delete o.timeout),clearTimeout(o.restoreFocusTimeout);const i=Kn(Rn);return Fe(Rn,n),he.innerParams.set(Rn,n),zn(Rn,i,n)}then(e){return t(Fn,this).then(e)}finally(e){return t(Fn,this).finally(e)}}const zn=(e,t,n)=>new Promise((i,r)=>{const s=t=>{e.close({isDismissed:!0,dismiss:t,isConfirmed:!1,isDenied:!1})};tt.swalPromiseResolve.set(e,i),tt.swalPromiseReject.set(e,r),t.confirmButton.onclick=()=>{(e=>{const t=he.innerParams.get(e);e.disableButtons(),t.input?Pt(e,"confirm"):Mt(e,!0)})(e)},t.denyButton.onclick=()=>{(e=>{const t=he.innerParams.get(e);e.disableButtons(),t.returnInputValueOnDeny?Pt(e,"deny"):Tt(e,!1)})(e)},t.cancelButton.onclick=()=>{((e,t)=>{e.disableButtons(),t(ze.cancel)})(e,s)},t.closeButton.onclick=()=>{s(ze.close)},((e,t,n)=>{e.toast?un(e,t,n):(mn(t),hn(t),gn(e,t,n))})(n,t,s),((e,t,n)=>{if(We(e),!t.toast){const o=e=>Ze(t,e,n);e.keydownHandler=o;const i=t.keydownListenerCapture?window:C();if(i){e.keydownTarget=i,e.keydownListenerCapture=t.keydownListenerCapture;const n=o;e.keydownTarget.addEventListener("keydown",n,{capture:e.keydownListenerCapture}),e.keydownHandlerAdded=!0}}})(o,n,s),((e,t)=>{"select"===t.input||"radio"===t.input?kt(e,t):["text","email","number","tel","textarea"].some(e=>e===t.input)&&(g(t.inputValue)||b(t.inputValue))&&(vt(P()),Bt(e,t))})(e,n),jn(n),Yn(o,n,s),Xn(t,n),setTimeout(()=>{t.container.scrollTop=0})}),Wn=(e,t)=>{const n=(e=>{const t="string"==typeof e.template?document.querySelector(e.template):e.template;if(!t)return{};const n=t.content;return On(n),Object.assign(Bn(n),$n(n),Ln(n),Pn(n),xn(n),Tn(n),Sn(n,kn))})(e),o=Object.assign({},zt,t,n,e);return o.showClass=Object.assign({},zt.showClass,o.showClass),o.hideClass=Object.assign({},zt.hideClass,o.hideClass),!1===o.animation&&(o.showClass={backdrop:"swal2-noanimation"},o.hideClass={}),o},Kn=e=>{const t={popup:C(),container:y(),actions:O(),confirmButton:P(),denyButton:T(),cancelButton:x(),loader:S(),closeButton:H(),validationMessage:L(),progressSteps:$()};return he.domCache.set(e,t),t},Yn=(e,t,n)=>{const o=j();Z(o),t.timer&&(e.timeout=new En(()=>{n("timer"),delete e.timeout},t.timer),t.timerProgressBar&&o&&(X(o),_(o,t,"timerProgressBar"),setTimeout(()=>{e.timeout&&e.timeout.running&&oe(t.timer)})))},Xn=(e,t)=>{if(!t.toast)return h(t.allowEnterKey)?void(Zn(e)||Jn(e,t)||Ke(-1,1)):(m("allowEnterKey"),void Gn())},Zn=e=>{const t=Array.from(e.popup.querySelectorAll("[autofocus]"));for(const e of t)if(e instanceof HTMLElement&&ee(e))return e.focus(),!0;return!1},Jn=(e,t)=>t.focusDeny&&ee(e.denyButton)?(e.denyButton.focus(),!0):t.focusCancel&&ee(e.cancelButton)?(e.cancelButton.focus(),!0):!(!t.focusConfirm||!ee(e.confirmButton))&&(e.confirmButton.focus(),!0),Gn=()=>{document.activeElement instanceof HTMLElement&&"function"==typeof document.activeElement.blur&&document.activeElement.blur()};Un.prototype.disableButtons=Nt,Un.prototype.enableButtons=qt,Un.prototype.getInput=It,Un.prototype.disableInput=Rt,Un.prototype.enableInput=_t,Un.prototype.hideLoading=jt,Un.prototype.disableLoading=jt,Un.prototype.showValidationMessage=Ft,Un.prototype.resetValidationMessage=Ut,Un.prototype.close=dt,Un.prototype.closePopup=dt,Un.prototype.closeModal=dt,Un.prototype.closeToast=dt,Un.prototype.rejectPromise=mt,Un.prototype.update=nn,Un.prototype._destroy=rn,Object.assign(Un,An),Object.keys(cn).forEach(e=>{Un[e]=function(...t){if(Rn&&Rn[e])return Rn[e](...t)}}),Un.DismissReason=ze,Un.version="11.26.18";const Qn=Un;Qn.default=Qn;export{Qn as default}; diff --git a/public/assets/sweetalert2/dist/sweetalert2.js b/public/assets/sweetalert2/dist/sweetalert2.js new file mode 100644 index 0000000..f93e78f --- /dev/null +++ b/public/assets/sweetalert2/dist/sweetalert2.js @@ -0,0 +1,4824 @@ +/*! +* sweetalert2 v11.26.18 +* Released under the MIT License. +*/ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Sweetalert2 = factory()); +})(this, (function () { 'use strict'; + + function _assertClassBrand(e, t, n) { + if ("function" == typeof e ? e === t : e.has(t)) return arguments.length < 3 ? t : n; + throw new TypeError("Private element is not present on this object"); + } + function _checkPrivateRedeclaration(e, t) { + if (t.has(e)) throw new TypeError("Cannot initialize the same private elements twice on an object"); + } + function _classPrivateFieldGet2(s, a) { + return s.get(_assertClassBrand(s, a)); + } + function _classPrivateFieldInitSpec(e, t, a) { + _checkPrivateRedeclaration(e, t), t.set(e, a); + } + function _classPrivateFieldSet2(s, a, r) { + return s.set(_assertClassBrand(s, a), r), r; + } + + const RESTORE_FOCUS_TIMEOUT = 100; + + /** @type {GlobalState} */ + const globalState = {}; + const focusPreviousActiveElement = () => { + if (globalState.previousActiveElement instanceof HTMLElement) { + globalState.previousActiveElement.focus(); + globalState.previousActiveElement = null; + } else if (document.body) { + document.body.focus(); + } + }; + + /** + * Restore previous active (focused) element + * + * @param {boolean} returnFocus + * @returns {Promise} + */ + const restoreActiveElement = returnFocus => { + return new Promise(resolve => { + if (!returnFocus) { + return resolve(); + } + const x = window.scrollX; + const y = window.scrollY; + globalState.restoreFocusTimeout = setTimeout(() => { + focusPreviousActiveElement(); + resolve(); + }, RESTORE_FOCUS_TIMEOUT); // issues/900 + + window.scrollTo(x, y); + }); + }; + + const swalPrefix = 'swal2-'; + + /** + * @typedef {Record} SwalClasses + */ + + /** + * @typedef {'success' | 'warning' | 'info' | 'question' | 'error'} SwalIcon + * @typedef {Record} SwalIcons + */ + + /** @type {SwalClass[]} */ + const classNames = ['container', 'shown', 'height-auto', 'iosfix', 'popup', 'modal', 'no-backdrop', 'no-transition', 'toast', 'toast-shown', 'show', 'hide', 'close', 'title', 'html-container', 'actions', 'confirm', 'deny', 'cancel', 'footer', 'icon', 'icon-content', 'image', 'input', 'file', 'range', 'select', 'radio', 'checkbox', 'label', 'textarea', 'inputerror', 'input-label', 'validation-message', 'progress-steps', 'active-progress-step', 'progress-step', 'progress-step-line', 'loader', 'loading', 'styled', 'top', 'top-start', 'top-end', 'top-left', 'top-right', 'center', 'center-start', 'center-end', 'center-left', 'center-right', 'bottom', 'bottom-start', 'bottom-end', 'bottom-left', 'bottom-right', 'grow-row', 'grow-column', 'grow-fullscreen', 'rtl', 'timer-progress-bar', 'timer-progress-bar-container', 'scrollbar-measure', 'icon-success', 'icon-warning', 'icon-info', 'icon-question', 'icon-error', 'draggable', 'dragging']; + const swalClasses = classNames.reduce((acc, className) => { + acc[className] = swalPrefix + className; + return acc; + }, /** @type {SwalClasses} */{}); + + /** @type {SwalIcon[]} */ + const icons = ['success', 'warning', 'info', 'question', 'error']; + const iconTypes = icons.reduce((acc, icon) => { + acc[icon] = swalPrefix + icon; + return acc; + }, /** @type {SwalIcons} */{}); + + const consolePrefix = 'SweetAlert2:'; + + /** + * Capitalize the first letter of a string + * + * @param {string} str + * @returns {string} + */ + const capitalizeFirstLetter = str => str.charAt(0).toUpperCase() + str.slice(1); + + /** + * Standardize console warnings + * + * @param {string | string[]} message + */ + const warn = message => { + console.warn(`${consolePrefix} ${typeof message === 'object' ? message.join(' ') : message}`); + }; + + /** + * Standardize console errors + * + * @param {string} message + */ + const error = message => { + console.error(`${consolePrefix} ${message}`); + }; + + /** + * Private global state for `warnOnce` + * + * @type {string[]} + * @private + */ + const previousWarnOnceMessages = []; + + /** + * Show a console warning, but only if it hasn't already been shown + * + * @param {string} message + */ + const warnOnce = message => { + if (!previousWarnOnceMessages.includes(message)) { + previousWarnOnceMessages.push(message); + warn(message); + } + }; + + /** + * Show a one-time console warning about deprecated params/methods + * + * @param {string} deprecatedParam + * @param {string?} useInstead + */ + const warnAboutDeprecation = (deprecatedParam, useInstead = null) => { + warnOnce(`"${deprecatedParam}" is deprecated and will be removed in the next major release.${useInstead ? ` Use "${useInstead}" instead.` : ''}`); + }; + + /** + * If `arg` is a function, call it (with no arguments or context) and return the result. + * Otherwise, just pass the value through + * + * @param {(() => *) | *} arg + * @returns {*} + */ + const callIfFunction = arg => typeof arg === 'function' ? arg() : arg; + + /** + * @param {*} arg + * @returns {boolean} + */ + const hasToPromiseFn = arg => arg && typeof arg.toPromise === 'function'; + + /** + * @param {*} arg + * @returns {Promise<*>} + */ + const asPromise = arg => hasToPromiseFn(arg) ? arg.toPromise() : Promise.resolve(arg); + + /** + * @param {*} arg + * @returns {boolean} + */ + const isPromise = arg => arg && Promise.resolve(arg) === arg; + + /** + * Gets the popup container which contains the backdrop and the popup itself. + * + * @returns {HTMLElement | null} + */ + const getContainer = () => document.body.querySelector(`.${swalClasses.container}`); + + /** + * @param {string} selectorString + * @returns {HTMLElement | null} + */ + const elementBySelector = selectorString => { + const container = getContainer(); + return container ? container.querySelector(selectorString) : null; + }; + + /** + * @param {string} className + * @returns {HTMLElement | null} + */ + const elementByClass = className => { + return elementBySelector(`.${className}`); + }; + + /** + * @returns {HTMLElement | null} + */ + const getPopup = () => elementByClass(swalClasses.popup); + + /** + * @returns {HTMLElement | null} + */ + const getIcon = () => elementByClass(swalClasses.icon); + + /** + * @returns {HTMLElement | null} + */ + const getIconContent = () => elementByClass(swalClasses['icon-content']); + + /** + * @returns {HTMLElement | null} + */ + const getTitle = () => elementByClass(swalClasses.title); + + /** + * @returns {HTMLElement | null} + */ + const getHtmlContainer = () => elementByClass(swalClasses['html-container']); + + /** + * @returns {HTMLElement | null} + */ + const getImage = () => elementByClass(swalClasses.image); + + /** + * @returns {HTMLElement | null} + */ + const getProgressSteps = () => elementByClass(swalClasses['progress-steps']); + + /** + * @returns {HTMLElement | null} + */ + const getValidationMessage = () => elementByClass(swalClasses['validation-message']); + + /** + * @returns {HTMLButtonElement | null} + */ + const getConfirmButton = () => (/** @type {HTMLButtonElement} */elementBySelector(`.${swalClasses.actions} .${swalClasses.confirm}`)); + + /** + * @returns {HTMLButtonElement | null} + */ + const getCancelButton = () => (/** @type {HTMLButtonElement} */elementBySelector(`.${swalClasses.actions} .${swalClasses.cancel}`)); + + /** + * @returns {HTMLButtonElement | null} + */ + const getDenyButton = () => (/** @type {HTMLButtonElement} */elementBySelector(`.${swalClasses.actions} .${swalClasses.deny}`)); + + /** + * @returns {HTMLElement | null} + */ + const getInputLabel = () => elementByClass(swalClasses['input-label']); + + /** + * @returns {HTMLElement | null} + */ + const getLoader = () => elementBySelector(`.${swalClasses.loader}`); + + /** + * @returns {HTMLElement | null} + */ + const getActions = () => elementByClass(swalClasses.actions); + + /** + * @returns {HTMLElement | null} + */ + const getFooter = () => elementByClass(swalClasses.footer); + + /** + * @returns {HTMLElement | null} + */ + const getTimerProgressBar = () => elementByClass(swalClasses['timer-progress-bar']); + + /** + * @returns {HTMLElement | null} + */ + const getCloseButton = () => elementByClass(swalClasses.close); + + // https://github.com/jkup/focusable/blob/master/index.js + const focusable = ` + a[href], + area[href], + input:not([disabled]), + select:not([disabled]), + textarea:not([disabled]), + button:not([disabled]), + iframe, + object, + embed, + [tabindex="0"], + [contenteditable], + audio[controls], + video[controls], + summary +`; + /** + * @returns {HTMLElement[]} + */ + const getFocusableElements = () => { + const popup = getPopup(); + if (!popup) { + return []; + } + /** @type {NodeListOf} */ + const focusableElementsWithTabindex = popup.querySelectorAll('[tabindex]:not([tabindex="-1"]):not([tabindex="0"])'); + const focusableElementsWithTabindexSorted = Array.from(focusableElementsWithTabindex) + // sort according to tabindex + .sort((a, b) => { + const tabindexA = parseInt(a.getAttribute('tabindex') || '0'); + const tabindexB = parseInt(b.getAttribute('tabindex') || '0'); + if (tabindexA > tabindexB) { + return 1; + } else if (tabindexA < tabindexB) { + return -1; + } + return 0; + }); + + /** @type {NodeListOf} */ + const otherFocusableElements = popup.querySelectorAll(focusable); + const otherFocusableElementsFiltered = Array.from(otherFocusableElements).filter(el => el.getAttribute('tabindex') !== '-1'); + return [...new Set(focusableElementsWithTabindexSorted.concat(otherFocusableElementsFiltered))].filter(el => isVisible$1(el)); + }; + + /** + * @returns {boolean} + */ + const isModal = () => { + return hasClass(document.body, swalClasses.shown) && !hasClass(document.body, swalClasses['toast-shown']) && !hasClass(document.body, swalClasses['no-backdrop']); + }; + + /** + * @returns {boolean} + */ + const isToast = () => { + const popup = getPopup(); + if (!popup) { + return false; + } + return hasClass(popup, swalClasses.toast); + }; + + /** + * @returns {boolean} + */ + const isLoading = () => { + const popup = getPopup(); + if (!popup) { + return false; + } + return popup.hasAttribute('data-loading'); + }; + + /** + * Securely set innerHTML of an element + * https://github.com/sweetalert2/sweetalert2/issues/1926 + * + * @param {HTMLElement} elem + * @param {string} html + */ + const setInnerHtml = (elem, html) => { + elem.textContent = ''; + if (html) { + const parser = new DOMParser(); + const parsed = parser.parseFromString(html, `text/html`); + const head = parsed.querySelector('head'); + if (head) { + Array.from(head.childNodes).forEach(child => { + elem.appendChild(child); + }); + } + const body = parsed.querySelector('body'); + if (body) { + Array.from(body.childNodes).forEach(child => { + if (child instanceof HTMLVideoElement || child instanceof HTMLAudioElement) { + elem.appendChild(child.cloneNode(true)); // https://github.com/sweetalert2/sweetalert2/issues/2507 + } else { + elem.appendChild(child); + } + }); + } + } + }; + + /** + * @param {HTMLElement} elem + * @param {string} className + * @returns {boolean} + */ + const hasClass = (elem, className) => { + if (!className) { + return false; + } + const classList = className.split(/\s+/); + for (let i = 0; i < classList.length; i++) { + if (!elem.classList.contains(classList[i])) { + return false; + } + } + return true; + }; + + /** + * @param {HTMLElement} elem + * @param {SweetAlertOptions} params + */ + const removeCustomClasses = (elem, params) => { + Array.from(elem.classList).forEach(className => { + if (!Object.values(swalClasses).includes(className) && !Object.values(iconTypes).includes(className) && !Object.values(params.showClass || {}).includes(className)) { + elem.classList.remove(className); + } + }); + }; + + /** + * @param {HTMLElement} elem + * @param {SweetAlertOptions} params + * @param {string} className + */ + const applyCustomClass = (elem, params, className) => { + removeCustomClasses(elem, params); + if (!params.customClass) { + return; + } + const customClass = params.customClass[(/** @type {keyof SweetAlertCustomClass} */className)]; + if (!customClass) { + return; + } + if (typeof customClass !== 'string' && !customClass.forEach) { + warn(`Invalid type of customClass.${className}! Expected string or iterable object, got "${typeof customClass}"`); + return; + } + addClass(elem, customClass); + }; + + /** + * @param {HTMLElement} popup + * @param {import('./renderers/renderInput').InputClass | SweetAlertInput} inputClass + * @returns {HTMLInputElement | null} + */ + const getInput$1 = (popup, inputClass) => { + if (!inputClass) { + return null; + } + switch (inputClass) { + case 'select': + case 'textarea': + case 'file': + return popup.querySelector(`.${swalClasses.popup} > .${swalClasses[inputClass]}`); + case 'checkbox': + return popup.querySelector(`.${swalClasses.popup} > .${swalClasses.checkbox} input`); + case 'radio': + return popup.querySelector(`.${swalClasses.popup} > .${swalClasses.radio} input:checked`) || popup.querySelector(`.${swalClasses.popup} > .${swalClasses.radio} input:first-child`); + case 'range': + return popup.querySelector(`.${swalClasses.popup} > .${swalClasses.range} input`); + default: + return popup.querySelector(`.${swalClasses.popup} > .${swalClasses.input}`); + } + }; + + /** + * @param {HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement} input + */ + const focusInput = input => { + input.focus(); + + // place cursor at end of text in text input + if (input.type !== 'file') { + // http://stackoverflow.com/a/2345915 + const val = input.value; + input.value = ''; + input.value = val; + } + }; + + /** + * @param {HTMLElement | HTMLElement[] | null} target + * @param {string | string[] | readonly string[] | undefined} classList + * @param {boolean} condition + */ + const toggleClass = (target, classList, condition) => { + if (!target || !classList) { + return; + } + if (typeof classList === 'string') { + classList = classList.split(/\s+/).filter(Boolean); + } + classList.forEach(className => { + if (Array.isArray(target)) { + target.forEach(elem => { + if (condition) { + elem.classList.add(className); + } else { + elem.classList.remove(className); + } + }); + } else { + if (condition) { + target.classList.add(className); + } else { + target.classList.remove(className); + } + } + }); + }; + + /** + * @param {HTMLElement | HTMLElement[] | null} target + * @param {string | string[] | readonly string[] | undefined} classList + */ + const addClass = (target, classList) => { + toggleClass(target, classList, true); + }; + + /** + * @param {HTMLElement | HTMLElement[] | null} target + * @param {string | string[] | readonly string[] | undefined} classList + */ + const removeClass = (target, classList) => { + toggleClass(target, classList, false); + }; + + /** + * Get direct child of an element by class name + * + * @param {HTMLElement} elem + * @param {string} className + * @returns {HTMLElement | undefined} + */ + const getDirectChildByClass = (elem, className) => { + const children = Array.from(elem.children); + for (let i = 0; i < children.length; i++) { + const child = children[i]; + if (child instanceof HTMLElement && hasClass(child, className)) { + return child; + } + } + }; + + /** + * @param {HTMLElement} elem + * @param {string} property + * @param {string | number | null | undefined} value + */ + const applyNumericalStyle = (elem, property, value) => { + if (value === `${parseInt(`${value}`)}`) { + value = parseInt(value); + } + if (value || parseInt(`${value}`) === 0) { + elem.style.setProperty(property, typeof value === 'number' ? `${value}px` : (/** @type {string} */value)); + } else { + elem.style.removeProperty(property); + } + }; + + /** + * @param {HTMLElement | null} elem + * @param {string} display + */ + const show = (elem, display = 'flex') => { + if (!elem) { + return; + } + elem.style.display = display; + }; + + /** + * @param {HTMLElement | null} elem + */ + const hide = elem => { + if (!elem) { + return; + } + elem.style.display = 'none'; + }; + + /** + * @param {HTMLElement | null} elem + * @param {string} display + */ + const showWhenInnerHtmlPresent = (elem, display = 'block') => { + if (!elem) { + return; + } + new MutationObserver(() => { + toggle(elem, elem.innerHTML, display); + }).observe(elem, { + childList: true, + subtree: true + }); + }; + + /** + * @param {HTMLElement} parent + * @param {string} selector + * @param {string} property + * @param {string} value + */ + const setStyle = (parent, selector, property, value) => { + /** @type {HTMLElement | null} */ + const el = parent.querySelector(selector); + if (el) { + el.style.setProperty(property, value); + } + }; + + /** + * @param {HTMLElement} elem + * @param {boolean | string | null | undefined} condition + * @param {string} display + */ + const toggle = (elem, condition, display = 'flex') => { + if (condition) { + show(elem, display); + } else { + hide(elem); + } + }; + + /** + * borrowed from jquery $(elem).is(':visible') implementation + * + * @param {HTMLElement | null} elem + * @returns {boolean} + */ + const isVisible$1 = elem => Boolean(elem && (elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length)); + + /** + * @returns {boolean} + */ + const allButtonsAreHidden = () => !isVisible$1(getConfirmButton()) && !isVisible$1(getDenyButton()) && !isVisible$1(getCancelButton()); + + /** + * @param {HTMLElement} elem + * @returns {boolean} + */ + const isScrollable = elem => Boolean(elem.scrollHeight > elem.clientHeight); + + /** + * @param {HTMLElement} element + * @param {HTMLElement} stopElement + * @returns {boolean} + */ + const selfOrParentIsScrollable = (element, stopElement) => { + let parent = /** @type {HTMLElement | null} */element; + while (parent && parent !== stopElement) { + if (isScrollable(parent)) { + return true; + } + parent = parent.parentElement; + } + return false; + }; + + /** + * borrowed from https://stackoverflow.com/a/46352119 + * + * @param {HTMLElement} elem + * @returns {boolean} + */ + const hasCssAnimation = elem => { + const style = window.getComputedStyle(elem); + const animDuration = parseFloat(style.getPropertyValue('animation-duration') || '0'); + const transDuration = parseFloat(style.getPropertyValue('transition-duration') || '0'); + return animDuration > 0 || transDuration > 0; + }; + + /** + * @param {number} timer + * @param {boolean} reset + */ + const animateTimerProgressBar = (timer, reset = false) => { + const timerProgressBar = getTimerProgressBar(); + if (!timerProgressBar) { + return; + } + if (isVisible$1(timerProgressBar)) { + if (reset) { + timerProgressBar.style.transition = 'none'; + timerProgressBar.style.width = '100%'; + } + setTimeout(() => { + timerProgressBar.style.transition = `width ${timer / 1000}s linear`; + timerProgressBar.style.width = '0%'; + }, 10); + } + }; + const stopTimerProgressBar = () => { + const timerProgressBar = getTimerProgressBar(); + if (!timerProgressBar) { + return; + } + const timerProgressBarWidth = parseInt(window.getComputedStyle(timerProgressBar).width); + timerProgressBar.style.removeProperty('transition'); + timerProgressBar.style.width = '100%'; + const timerProgressBarFullWidth = parseInt(window.getComputedStyle(timerProgressBar).width); + const timerProgressBarPercent = timerProgressBarWidth / timerProgressBarFullWidth * 100; + timerProgressBar.style.width = `${timerProgressBarPercent}%`; + }; + + /** + * Detect Node env + * + * @returns {boolean} + */ + const isNodeEnv = () => typeof window === 'undefined' || typeof document === 'undefined'; + + const sweetHTML = ` +
                + +
                  +
                  + +

                  +
                  + + +
                  + + +
                  + +
                  + + +
                  +
                  +
                  + + + +
                  +
                  +
                  +
                  +
                  +
                  +`.replace(/(^|\n)\s*/g, ''); + + /** + * @returns {boolean} + */ + const resetOldContainer = () => { + const oldContainer = getContainer(); + if (!oldContainer) { + return false; + } + oldContainer.remove(); + removeClass([document.documentElement, document.body], [swalClasses['no-backdrop'], swalClasses['toast-shown'], + // @ts-ignore: 'has-column' is not defined in swalClasses but may be set dynamically + swalClasses['has-column']]); + return true; + }; + const resetValidationMessage$1 = () => { + if (globalState.currentInstance) { + globalState.currentInstance.resetValidationMessage(); + } + }; + const addInputChangeListeners = () => { + const popup = getPopup(); + if (!popup) { + return; + } + const input = getDirectChildByClass(popup, swalClasses.input); + const file = getDirectChildByClass(popup, swalClasses.file); + /** @type {HTMLInputElement | null} */ + const range = popup.querySelector(`.${swalClasses.range} input`); + /** @type {HTMLOutputElement | null} */ + const rangeOutput = popup.querySelector(`.${swalClasses.range} output`); + const select = getDirectChildByClass(popup, swalClasses.select); + /** @type {HTMLInputElement | null} */ + const checkbox = popup.querySelector(`.${swalClasses.checkbox} input`); + const textarea = getDirectChildByClass(popup, swalClasses.textarea); + if (input) { + input.oninput = resetValidationMessage$1; + } + if (file) { + file.onchange = resetValidationMessage$1; + } + if (select) { + select.onchange = resetValidationMessage$1; + } + if (checkbox) { + checkbox.onchange = resetValidationMessage$1; + } + if (textarea) { + textarea.oninput = resetValidationMessage$1; + } + if (range && rangeOutput) { + range.oninput = () => { + resetValidationMessage$1(); + rangeOutput.value = range.value; + }; + range.onchange = () => { + resetValidationMessage$1(); + rangeOutput.value = range.value; + }; + } + }; + + /** + * @param {string | HTMLElement} target + * @returns {HTMLElement} + */ + const getTarget = target => { + if (typeof target === 'string') { + const element = document.querySelector(target); + if (!element) { + throw new Error(`Target element "${target}" not found`); + } + return /** @type {HTMLElement} */element; + } + return target; + }; + + /** + * @param {SweetAlertOptions} params + */ + const setupAccessibility = params => { + const popup = getPopup(); + if (!popup) { + return; + } + popup.setAttribute('role', params.toast ? 'alert' : 'dialog'); + popup.setAttribute('aria-live', params.toast ? 'polite' : 'assertive'); + if (!params.toast) { + popup.setAttribute('aria-modal', 'true'); + } + }; + + /** + * @param {HTMLElement} targetElement + */ + const setupRTL = targetElement => { + if (window.getComputedStyle(targetElement).direction === 'rtl') { + addClass(getContainer(), swalClasses.rtl); + globalState.isRTL = true; + } + }; + + /** + * Add modal + backdrop to DOM + * + * @param {SweetAlertOptions} params + */ + const init = params => { + // Clean up the old popup container if it exists + const oldContainerExisted = resetOldContainer(); + if (isNodeEnv()) { + error('SweetAlert2 requires document to initialize'); + return; + } + const container = document.createElement('div'); + container.className = swalClasses.container; + if (oldContainerExisted) { + addClass(container, swalClasses['no-transition']); + } + setInnerHtml(container, sweetHTML); + container.dataset['swal2Theme'] = params.theme; + const targetElement = getTarget(params.target || 'body'); + targetElement.appendChild(container); + if (params.topLayer) { + container.setAttribute('popover', ''); + container.showPopover(); + } + setupAccessibility(params); + setupRTL(targetElement); + addInputChangeListeners(); + }; + + /** + * @param {HTMLElement | object | string} param + * @param {HTMLElement} target + */ + const parseHtmlToContainer = (param, target) => { + // DOM element + if (param instanceof HTMLElement) { + target.appendChild(param); + } + + // Object + else if (typeof param === 'object') { + handleObject(param, target); + } + + // Plain string + else if (param) { + setInnerHtml(target, param); + } + }; + + /** + * @param {object} param + * @param {HTMLElement} target + */ + const handleObject = (param, target) => { + // JQuery element(s) + if ('jquery' in param) { + handleJqueryElem(target, param); + } + + // For other objects use their string representation + else { + setInnerHtml(target, param.toString()); + } + }; + + /** + * @param {HTMLElement} target + * @param {any} elem + */ + const handleJqueryElem = (target, elem) => { + target.textContent = ''; + if (0 in elem) { + for (let i = 0; i in elem; i++) { + target.appendChild(elem[i].cloneNode(true)); + } + } else { + target.appendChild(elem.cloneNode(true)); + } + }; + + /** + * @param {SweetAlert} instance + * @param {SweetAlertOptions} params + */ + const renderActions = (instance, params) => { + const actions = getActions(); + const loader = getLoader(); + if (!actions || !loader) { + return; + } + + // Actions (buttons) wrapper + if (!params.showConfirmButton && !params.showDenyButton && !params.showCancelButton) { + hide(actions); + } else { + show(actions); + } + + // Custom class + applyCustomClass(actions, params, 'actions'); + + // Render all the buttons + renderButtons(actions, loader, params); + + // Loader + setInnerHtml(loader, params.loaderHtml || ''); + applyCustomClass(loader, params, 'loader'); + }; + + /** + * @param {HTMLElement} actions + * @param {HTMLElement} loader + * @param {SweetAlertOptions} params + */ + function renderButtons(actions, loader, params) { + const confirmButton = getConfirmButton(); + const denyButton = getDenyButton(); + const cancelButton = getCancelButton(); + if (!confirmButton || !denyButton || !cancelButton) { + return; + } + + // Render buttons + renderButton(confirmButton, 'confirm', params); + renderButton(denyButton, 'deny', params); + renderButton(cancelButton, 'cancel', params); + handleButtonsStyling(confirmButton, denyButton, cancelButton, params); + if (params.reverseButtons) { + if (params.toast) { + actions.insertBefore(cancelButton, confirmButton); + actions.insertBefore(denyButton, confirmButton); + } else { + actions.insertBefore(cancelButton, loader); + actions.insertBefore(denyButton, loader); + actions.insertBefore(confirmButton, loader); + } + } + } + + /** + * @param {HTMLElement} confirmButton + * @param {HTMLElement} denyButton + * @param {HTMLElement} cancelButton + * @param {SweetAlertOptions} params + */ + function handleButtonsStyling(confirmButton, denyButton, cancelButton, params) { + if (!params.buttonsStyling) { + removeClass([confirmButton, denyButton, cancelButton], swalClasses.styled); + return; + } + addClass([confirmButton, denyButton, cancelButton], swalClasses.styled); + + // Apply custom background colors to action buttons + if (params.confirmButtonColor) { + confirmButton.style.setProperty('--swal2-confirm-button-background-color', params.confirmButtonColor); + } + if (params.denyButtonColor) { + denyButton.style.setProperty('--swal2-deny-button-background-color', params.denyButtonColor); + } + if (params.cancelButtonColor) { + cancelButton.style.setProperty('--swal2-cancel-button-background-color', params.cancelButtonColor); + } + + // Apply the outline color to action buttons + applyOutlineColor(confirmButton); + applyOutlineColor(denyButton); + applyOutlineColor(cancelButton); + } + + /** + * @param {HTMLElement} button + */ + function applyOutlineColor(button) { + const buttonStyle = window.getComputedStyle(button); + if (buttonStyle.getPropertyValue('--swal2-action-button-focus-box-shadow')) { + // If the button already has a custom outline color, no need to change it + return; + } + const outlineColor = buttonStyle.backgroundColor.replace(/rgba?\((\d+), (\d+), (\d+).*/, 'rgba($1, $2, $3, 0.5)'); + button.style.setProperty('--swal2-action-button-focus-box-shadow', buttonStyle.getPropertyValue('--swal2-outline').replace(/ rgba\(.*/, ` ${outlineColor}`)); + } + + /** + * @param {HTMLElement} button + * @param {'confirm' | 'deny' | 'cancel'} buttonType + * @param {SweetAlertOptions} params + */ + function renderButton(button, buttonType, params) { + const buttonName = /** @type {'Confirm' | 'Deny' | 'Cancel'} */capitalizeFirstLetter(buttonType); + toggle(button, params[`show${buttonName}Button`], 'inline-block'); + setInnerHtml(button, params[`${buttonType}ButtonText`] || ''); // Set caption text + button.setAttribute('aria-label', params[`${buttonType}ButtonAriaLabel`] || ''); // ARIA label + + // Add buttons custom classes + button.className = swalClasses[buttonType]; + applyCustomClass(button, params, `${buttonType}Button`); + } + + /** + * @param {SweetAlert} instance + * @param {SweetAlertOptions} params + */ + const renderCloseButton = (instance, params) => { + const closeButton = getCloseButton(); + if (!closeButton) { + return; + } + setInnerHtml(closeButton, params.closeButtonHtml || ''); + + // Custom class + applyCustomClass(closeButton, params, 'closeButton'); + toggle(closeButton, params.showCloseButton); + closeButton.setAttribute('aria-label', params.closeButtonAriaLabel || ''); + }; + + /** + * @param {SweetAlert} instance + * @param {SweetAlertOptions} params + */ + const renderContainer = (instance, params) => { + const container = getContainer(); + if (!container) { + return; + } + handleBackdropParam(container, params.backdrop); + handlePositionParam(container, params.position); + handleGrowParam(container, params.grow); + + // Custom class + applyCustomClass(container, params, 'container'); + }; + + /** + * @param {HTMLElement} container + * @param {SweetAlertOptions['backdrop']} backdrop + */ + function handleBackdropParam(container, backdrop) { + if (typeof backdrop === 'string') { + container.style.background = backdrop; + } else if (!backdrop) { + addClass([document.documentElement, document.body], swalClasses['no-backdrop']); + } + } + + /** + * @param {HTMLElement} container + * @param {SweetAlertOptions['position']} position + */ + function handlePositionParam(container, position) { + if (!position) { + return; + } + if (position in swalClasses) { + addClass(container, swalClasses[position]); + } else { + warn('The "position" parameter is not valid, defaulting to "center"'); + addClass(container, swalClasses.center); + } + } + + /** + * @param {HTMLElement} container + * @param {SweetAlertOptions['grow']} grow + */ + function handleGrowParam(container, grow) { + if (!grow) { + return; + } + addClass(container, swalClasses[`grow-${grow}`]); + } + + /** + * This module contains `WeakMap`s for each effectively-"private property" that a `Swal` has. + * For example, to set the private property "foo" of `this` to "bar", you can `privateProps.foo.set(this, 'bar')` + * This is the approach that Babel will probably take to implement private methods/fields + * https://github.com/tc39/proposal-private-methods + * https://github.com/babel/babel/pull/7555 + * Once we have the changes from that PR in Babel, and our core class fits reasonable in *one module* + * then we can use that language feature. + */ + + var privateProps = { + innerParams: new WeakMap(), + domCache: new WeakMap() + }; + + /// + + + /** @type {InputClass[]} */ + const inputClasses = ['input', 'file', 'range', 'select', 'radio', 'checkbox', 'textarea']; + + /** + * @param {SweetAlert} instance + * @param {SweetAlertOptions} params + */ + const renderInput = (instance, params) => { + const popup = getPopup(); + if (!popup) { + return; + } + const innerParams = privateProps.innerParams.get(instance); + const rerender = !innerParams || params.input !== innerParams.input; + inputClasses.forEach(inputClass => { + const inputContainer = getDirectChildByClass(popup, swalClasses[inputClass]); + if (!inputContainer) { + return; + } + + // set attributes + setAttributes(inputClass, params.inputAttributes); + + // set class + inputContainer.className = swalClasses[inputClass]; + if (rerender) { + hide(inputContainer); + } + }); + if (params.input) { + if (rerender) { + showInput(params); + } + // set custom class + setCustomClass(params); + } + }; + + /** + * @param {SweetAlertOptions} params + */ + const showInput = params => { + if (!params.input) { + return; + } + if (!renderInputType[params.input]) { + error(`Unexpected type of input! Expected ${Object.keys(renderInputType).join(' | ')}, got "${params.input}"`); + return; + } + const inputContainer = getInputContainer(params.input); + if (!inputContainer) { + return; + } + const input = renderInputType[params.input](inputContainer, params); + show(inputContainer); + + // input autofocus + if (params.inputAutoFocus) { + setTimeout(() => { + focusInput(input); + }); + } + }; + + /** + * @param {HTMLInputElement} input + */ + const removeAttributes = input => { + for (let i = 0; i < input.attributes.length; i++) { + const attrName = input.attributes[i].name; + if (!['id', 'type', 'value', 'style'].includes(attrName)) { + input.removeAttribute(attrName); + } + } + }; + + /** + * @param {InputClass} inputClass + * @param {SweetAlertOptions['inputAttributes']} inputAttributes + */ + const setAttributes = (inputClass, inputAttributes) => { + const popup = getPopup(); + if (!popup) { + return; + } + const input = getInput$1(popup, inputClass); + if (!input) { + return; + } + removeAttributes(input); + for (const attr in inputAttributes) { + input.setAttribute(attr, inputAttributes[attr]); + } + }; + + /** + * @param {SweetAlertOptions} params + */ + const setCustomClass = params => { + if (!params.input) { + return; + } + const inputContainer = getInputContainer(params.input); + if (inputContainer) { + applyCustomClass(inputContainer, params, 'input'); + } + }; + + /** + * @param {HTMLInputElement | HTMLTextAreaElement} input + * @param {SweetAlertOptions} params + */ + const setInputPlaceholder = (input, params) => { + if (!input.placeholder && params.inputPlaceholder) { + input.placeholder = params.inputPlaceholder; + } + }; + + /** + * @param {Input} input + * @param {Input} prependTo + * @param {SweetAlertOptions} params + */ + const setInputLabel = (input, prependTo, params) => { + if (params.inputLabel) { + const label = document.createElement('label'); + const labelClass = swalClasses['input-label']; + label.setAttribute('for', input.id); + label.className = labelClass; + if (typeof params.customClass === 'object') { + addClass(label, params.customClass.inputLabel); + } + label.innerText = params.inputLabel; + prependTo.insertAdjacentElement('beforebegin', label); + } + }; + + /** + * @param {SweetAlertInput} inputType + * @returns {HTMLElement | undefined} + */ + const getInputContainer = inputType => { + const popup = getPopup(); + if (!popup) { + return; + } + return getDirectChildByClass(popup, swalClasses[(/** @type {SwalClass} */inputType)] || swalClasses.input); + }; + + /** + * @param {HTMLInputElement | HTMLOutputElement | HTMLTextAreaElement} input + * @param {SweetAlertOptions['inputValue']} inputValue + */ + const checkAndSetInputValue = (input, inputValue) => { + if (['string', 'number'].includes(typeof inputValue)) { + input.value = `${inputValue}`; + } else if (!isPromise(inputValue)) { + warn(`Unexpected type of inputValue! Expected "string", "number" or "Promise", got "${typeof inputValue}"`); + } + }; + + /** @type {Record Input>} */ + const renderInputType = {}; + + /** + * @param {Input | HTMLElement} input + * @param {SweetAlertOptions} params + * @returns {Input} + */ + renderInputType.text = renderInputType.email = renderInputType.password = renderInputType.number = renderInputType.tel = renderInputType.url = renderInputType.search = renderInputType.date = renderInputType['datetime-local'] = renderInputType.time = renderInputType.week = renderInputType.month = /** @type {(input: Input | HTMLElement, params: SweetAlertOptions) => Input} */ + (input, params) => { + const inputElement = /** @type {HTMLInputElement} */input; + checkAndSetInputValue(inputElement, params.inputValue); + setInputLabel(inputElement, inputElement, params); + setInputPlaceholder(inputElement, params); + inputElement.type = /** @type {string} */params.input; + return inputElement; + }; + + /** + * @param {Input | HTMLElement} input + * @param {SweetAlertOptions} params + * @returns {Input} + */ + renderInputType.file = (input, params) => { + const inputElement = /** @type {HTMLInputElement} */input; + setInputLabel(inputElement, inputElement, params); + setInputPlaceholder(inputElement, params); + return inputElement; + }; + + /** + * @param {Input | HTMLElement} range + * @param {SweetAlertOptions} params + * @returns {Input} + */ + renderInputType.range = (range, params) => { + const rangeContainer = /** @type {HTMLElement} */range; + const rangeInput = rangeContainer.querySelector('input'); + const rangeOutput = rangeContainer.querySelector('output'); + if (rangeInput) { + checkAndSetInputValue(rangeInput, params.inputValue); + rangeInput.type = /** @type {string} */params.input; + setInputLabel(rangeInput, /** @type {Input} */range, params); + } + if (rangeOutput) { + checkAndSetInputValue(rangeOutput, params.inputValue); + } + return /** @type {Input} */range; + }; + + /** + * @param {Input | HTMLElement} select + * @param {SweetAlertOptions} params + * @returns {Input} + */ + renderInputType.select = (select, params) => { + const selectElement = /** @type {HTMLSelectElement} */select; + selectElement.textContent = ''; + if (params.inputPlaceholder) { + const placeholder = document.createElement('option'); + setInnerHtml(placeholder, params.inputPlaceholder); + placeholder.value = ''; + placeholder.disabled = true; + placeholder.selected = true; + selectElement.appendChild(placeholder); + } + setInputLabel(selectElement, selectElement, params); + return selectElement; + }; + + /** + * @param {Input | HTMLElement} radio + * @returns {Input} + */ + renderInputType.radio = radio => { + const radioElement = /** @type {HTMLElement} */radio; + radioElement.textContent = ''; + return /** @type {Input} */radio; + }; + + /** + * @param {Input | HTMLElement} checkboxContainer + * @param {SweetAlertOptions} params + * @returns {Input} + */ + renderInputType.checkbox = (checkboxContainer, params) => { + const popup = getPopup(); + if (!popup) { + throw new Error('Popup not found'); + } + const checkbox = getInput$1(popup, 'checkbox'); + if (!checkbox) { + throw new Error('Checkbox input not found'); + } + checkbox.value = '1'; + checkbox.checked = Boolean(params.inputValue); + const containerElement = /** @type {HTMLElement} */checkboxContainer; + const label = containerElement.querySelector('span'); + if (label) { + const placeholderOrLabel = params.inputPlaceholder || params.inputLabel; + if (placeholderOrLabel) { + setInnerHtml(label, placeholderOrLabel); + } + } + return checkbox; + }; + + /** + * @param {Input | HTMLElement} textarea + * @param {SweetAlertOptions} params + * @returns {Input} + */ + renderInputType.textarea = (textarea, params) => { + const textareaElement = /** @type {HTMLTextAreaElement} */textarea; + checkAndSetInputValue(textareaElement, params.inputValue); + setInputPlaceholder(textareaElement, params); + setInputLabel(textareaElement, textareaElement, params); + + /** + * @param {HTMLElement} el + * @returns {number} + */ + const getMargin = el => parseInt(window.getComputedStyle(el).marginLeft) + parseInt(window.getComputedStyle(el).marginRight); + + // https://github.com/sweetalert2/sweetalert2/issues/2291 + setTimeout(() => { + // https://github.com/sweetalert2/sweetalert2/issues/1699 + if ('MutationObserver' in window) { + const popup = getPopup(); + if (!popup) { + return; + } + const initialPopupWidth = parseInt(window.getComputedStyle(popup).width); + const textareaResizeHandler = () => { + // check if texarea is still in document (i.e. popup wasn't closed in the meantime) + if (!document.body.contains(textareaElement)) { + return; + } + const textareaWidth = textareaElement.offsetWidth + getMargin(textareaElement); + const popupElement = getPopup(); + if (popupElement) { + if (textareaWidth > initialPopupWidth) { + popupElement.style.width = `${textareaWidth}px`; + } else { + applyNumericalStyle(popupElement, 'width', params.width); + } + } + }; + new MutationObserver(textareaResizeHandler).observe(textareaElement, { + attributes: true, + attributeFilter: ['style'] + }); + } + }); + return textareaElement; + }; + + /** + * @param {SweetAlert} instance + * @param {SweetAlertOptions} params + */ + const renderContent = (instance, params) => { + const htmlContainer = getHtmlContainer(); + if (!htmlContainer) { + return; + } + showWhenInnerHtmlPresent(htmlContainer); + applyCustomClass(htmlContainer, params, 'htmlContainer'); + + // Content as HTML + if (params.html) { + parseHtmlToContainer(params.html, htmlContainer); + show(htmlContainer, 'block'); + } + + // Content as plain text + else if (params.text) { + htmlContainer.textContent = params.text; + show(htmlContainer, 'block'); + } + + // No content + else { + hide(htmlContainer); + } + renderInput(instance, params); + }; + + /** + * @param {SweetAlert} instance + * @param {SweetAlertOptions} params + */ + const renderFooter = (instance, params) => { + const footer = getFooter(); + if (!footer) { + return; + } + showWhenInnerHtmlPresent(footer); + toggle(footer, Boolean(params.footer), 'block'); + if (params.footer) { + parseHtmlToContainer(params.footer, footer); + } + + // Custom class + applyCustomClass(footer, params, 'footer'); + }; + + /** + * @param {SweetAlert} instance + * @param {SweetAlertOptions} params + */ + const renderIcon = (instance, params) => { + const innerParams = privateProps.innerParams.get(instance); + const icon = getIcon(); + if (!icon) { + return; + } + + // if the given icon already rendered, apply the styling without re-rendering the icon + if (innerParams && params.icon === innerParams.icon) { + // Custom or default content + setContent(icon, params); + applyStyles(icon, params); + return; + } + if (!params.icon && !params.iconHtml) { + hide(icon); + return; + } + if (params.icon && Object.keys(iconTypes).indexOf(params.icon) === -1) { + error(`Unknown icon! Expected "success", "error", "warning", "info" or "question", got "${params.icon}"`); + hide(icon); + return; + } + show(icon); + + // Custom or default content + setContent(icon, params); + applyStyles(icon, params); + + // Animate icon + addClass(icon, params.showClass && params.showClass.icon); + + // Re-adjust the success icon on system theme change + const colorSchemeQueryList = window.matchMedia('(prefers-color-scheme: dark)'); + colorSchemeQueryList.addEventListener('change', adjustSuccessIconBackgroundColor); + }; + + /** + * @param {HTMLElement} icon + * @param {SweetAlertOptions} params + */ + const applyStyles = (icon, params) => { + for (const [iconType, iconClassName] of Object.entries(iconTypes)) { + if (params.icon !== iconType) { + removeClass(icon, iconClassName); + } + } + addClass(icon, params.icon && iconTypes[params.icon]); + + // Icon color + setColor(icon, params); + + // Success icon background color + adjustSuccessIconBackgroundColor(); + + // Custom class + applyCustomClass(icon, params, 'icon'); + }; + + // Adjust success icon background color to match the popup background color + const adjustSuccessIconBackgroundColor = () => { + const popup = getPopup(); + if (!popup) { + return; + } + const popupBackgroundColor = window.getComputedStyle(popup).getPropertyValue('background-color'); + /** @type {NodeListOf} */ + const successIconParts = popup.querySelectorAll('[class^=swal2-success-circular-line], .swal2-success-fix'); + for (let i = 0; i < successIconParts.length; i++) { + successIconParts[i].style.backgroundColor = popupBackgroundColor; + } + }; + + /** + * + * @param {SweetAlertOptions} params + * @returns {string} + */ + const successIconHtml = params => ` + ${params.animation ? '
                  ' : ''} + +
                  + ${params.animation ? '
                  ' : ''} + ${params.animation ? '
                  ' : ''} +`; + const errorIconHtml = ` + + + + +`; + + /** + * @param {HTMLElement} icon + * @param {SweetAlertOptions} params + */ + const setContent = (icon, params) => { + if (!params.icon && !params.iconHtml) { + return; + } + let oldContent = icon.innerHTML; + let newContent = ''; + if (params.iconHtml) { + newContent = iconContent(params.iconHtml); + } else if (params.icon === 'success') { + newContent = successIconHtml(params); + oldContent = oldContent.replace(/ style=".*?"/g, ''); // undo adjustSuccessIconBackgroundColor() + } else if (params.icon === 'error') { + newContent = errorIconHtml; + } else if (params.icon) { + const defaultIconHtml = { + question: '?', + warning: '!', + info: 'i' + }; + newContent = iconContent(defaultIconHtml[params.icon]); + } + if (oldContent.trim() !== newContent.trim()) { + setInnerHtml(icon, newContent); + } + }; + + /** + * @param {HTMLElement} icon + * @param {SweetAlertOptions} params + */ + const setColor = (icon, params) => { + if (!params.iconColor) { + return; + } + icon.style.color = params.iconColor; + icon.style.borderColor = params.iconColor; + for (const sel of ['.swal2-success-line-tip', '.swal2-success-line-long', '.swal2-x-mark-line-left', '.swal2-x-mark-line-right']) { + setStyle(icon, sel, 'background-color', params.iconColor); + } + setStyle(icon, '.swal2-success-ring', 'border-color', params.iconColor); + }; + + /** + * @param {string} content + * @returns {string} + */ + const iconContent = content => `
                  ${content}
                  `; + + /** + * @param {SweetAlert} instance + * @param {SweetAlertOptions} params + */ + const renderImage = (instance, params) => { + const image = getImage(); + if (!image) { + return; + } + if (!params.imageUrl) { + hide(image); + return; + } + show(image, ''); + + // Src, alt + image.setAttribute('src', params.imageUrl); + image.setAttribute('alt', params.imageAlt || ''); + + // Width, height + applyNumericalStyle(image, 'width', params.imageWidth); + applyNumericalStyle(image, 'height', params.imageHeight); + + // Class + image.className = swalClasses.image; + applyCustomClass(image, params, 'image'); + }; + + let dragging = false; + let mousedownX = 0; + let mousedownY = 0; + let initialX = 0; + let initialY = 0; + + /** + * @param {HTMLElement} popup + */ + const addDraggableListeners = popup => { + popup.addEventListener('mousedown', down); + document.body.addEventListener('mousemove', move); + popup.addEventListener('mouseup', up); + popup.addEventListener('touchstart', down); + document.body.addEventListener('touchmove', move); + popup.addEventListener('touchend', up); + }; + + /** + * @param {HTMLElement} popup + */ + const removeDraggableListeners = popup => { + popup.removeEventListener('mousedown', down); + document.body.removeEventListener('mousemove', move); + popup.removeEventListener('mouseup', up); + popup.removeEventListener('touchstart', down); + document.body.removeEventListener('touchmove', move); + popup.removeEventListener('touchend', up); + }; + + /** + * @param {MouseEvent | TouchEvent} event + */ + const down = event => { + const popup = getPopup(); + if (!popup) { + return; + } + const icon = getIcon(); + if (event.target === popup || icon && icon.contains(/** @type {HTMLElement} */event.target)) { + dragging = true; + const clientXY = getClientXY(event); + mousedownX = clientXY.clientX; + mousedownY = clientXY.clientY; + initialX = parseInt(popup.style.insetInlineStart) || 0; + initialY = parseInt(popup.style.insetBlockStart) || 0; + addClass(popup, 'swal2-dragging'); + } + }; + + /** + * @param {MouseEvent | TouchEvent} event + */ + const move = event => { + const popup = getPopup(); + if (!popup) { + return; + } + if (dragging) { + let { + clientX, + clientY + } = getClientXY(event); + const deltaX = clientX - mousedownX; + // In RTL mode, negate the horizontal delta since insetInlineStart refers to the right edge + popup.style.insetInlineStart = `${initialX + (globalState.isRTL ? -deltaX : deltaX)}px`; + popup.style.insetBlockStart = `${initialY + (clientY - mousedownY)}px`; + } + }; + const up = () => { + const popup = getPopup(); + dragging = false; + removeClass(popup, 'swal2-dragging'); + }; + + /** + * @param {MouseEvent | TouchEvent} event + * @returns {{ clientX: number, clientY: number }} + */ + const getClientXY = event => { + let clientX = 0, + clientY = 0; + if (event.type.startsWith('mouse')) { + clientX = /** @type {MouseEvent} */event.clientX; + clientY = /** @type {MouseEvent} */event.clientY; + } else if (event.type.startsWith('touch')) { + clientX = /** @type {TouchEvent} */event.touches[0].clientX; + clientY = /** @type {TouchEvent} */event.touches[0].clientY; + } + return { + clientX, + clientY + }; + }; + + /** + * @param {SweetAlert} instance + * @param {SweetAlertOptions} params + */ + const renderPopup = (instance, params) => { + const container = getContainer(); + const popup = getPopup(); + if (!container || !popup) { + return; + } + + // Width + // https://github.com/sweetalert2/sweetalert2/issues/2170 + if (params.toast) { + applyNumericalStyle(container, 'width', params.width); + popup.style.width = '100%'; + const loader = getLoader(); + if (loader) { + popup.insertBefore(loader, getIcon()); + } + } else { + applyNumericalStyle(popup, 'width', params.width); + } + + // Padding + applyNumericalStyle(popup, 'padding', params.padding); + + // Color + if (params.color) { + popup.style.color = params.color; + } + + // Background + if (params.background) { + popup.style.background = params.background; + } + hide(getValidationMessage()); + + // Classes + addClasses$1(popup, params); + if (params.draggable && !params.toast) { + addClass(popup, swalClasses.draggable); + addDraggableListeners(popup); + } else { + removeClass(popup, swalClasses.draggable); + removeDraggableListeners(popup); + } + }; + + /** + * @param {HTMLElement} popup + * @param {SweetAlertOptions} params + */ + const addClasses$1 = (popup, params) => { + const showClass = params.showClass || {}; + // Default Class + showClass when updating Swal.update({}) + popup.className = `${swalClasses.popup} ${isVisible$1(popup) ? showClass.popup : ''}`; + if (params.toast) { + addClass([document.documentElement, document.body], swalClasses['toast-shown']); + addClass(popup, swalClasses.toast); + } else { + addClass(popup, swalClasses.modal); + } + + // Custom class + applyCustomClass(popup, params, 'popup'); + // TODO: remove in the next major + if (typeof params.customClass === 'string') { + addClass(popup, params.customClass); + } + + // Icon class (#1842) + if (params.icon) { + addClass(popup, swalClasses[`icon-${params.icon}`]); + } + }; + + /** + * @param {SweetAlert} instance + * @param {SweetAlertOptions} params + */ + const renderProgressSteps = (instance, params) => { + const progressStepsContainer = getProgressSteps(); + if (!progressStepsContainer) { + return; + } + const { + progressSteps, + currentProgressStep + } = params; + if (!progressSteps || progressSteps.length === 0 || currentProgressStep === undefined) { + hide(progressStepsContainer); + return; + } + show(progressStepsContainer); + progressStepsContainer.textContent = ''; + if (currentProgressStep >= progressSteps.length) { + warn('Invalid currentProgressStep parameter, it should be less than progressSteps.length ' + '(currentProgressStep like JS arrays starts from 0)'); + } + progressSteps.forEach((step, index) => { + const stepEl = createStepElement(step); + progressStepsContainer.appendChild(stepEl); + if (index === currentProgressStep) { + addClass(stepEl, swalClasses['active-progress-step']); + } + if (index !== progressSteps.length - 1) { + const lineEl = createLineElement(params); + progressStepsContainer.appendChild(lineEl); + } + }); + }; + + /** + * @param {string} step + * @returns {HTMLLIElement} + */ + const createStepElement = step => { + const stepEl = document.createElement('li'); + addClass(stepEl, swalClasses['progress-step']); + setInnerHtml(stepEl, step); + return stepEl; + }; + + /** + * @param {SweetAlertOptions} params + * @returns {HTMLLIElement} + */ + const createLineElement = params => { + const lineEl = document.createElement('li'); + addClass(lineEl, swalClasses['progress-step-line']); + if (params.progressStepsDistance) { + applyNumericalStyle(lineEl, 'width', params.progressStepsDistance); + } + return lineEl; + }; + + /** + * @param {SweetAlert} instance + * @param {SweetAlertOptions} params + */ + const renderTitle = (instance, params) => { + const title = getTitle(); + if (!title) { + return; + } + showWhenInnerHtmlPresent(title); + toggle(title, Boolean(params.title || params.titleText), 'block'); + if (params.title) { + parseHtmlToContainer(params.title, title); + } + if (params.titleText) { + title.innerText = params.titleText; + } + + // Custom class + applyCustomClass(title, params, 'title'); + }; + + /** + * @param {SweetAlert} instance + * @param {SweetAlertOptions} params + */ + const render = (instance, params) => { + var _globalState$eventEmi; + renderPopup(instance, params); + renderContainer(instance, params); + renderProgressSteps(instance, params); + renderIcon(instance, params); + renderImage(instance, params); + renderTitle(instance, params); + renderCloseButton(instance, params); + renderContent(instance, params); + renderActions(instance, params); + renderFooter(instance, params); + const popup = getPopup(); + if (typeof params.didRender === 'function' && popup) { + params.didRender(popup); + } + (_globalState$eventEmi = globalState.eventEmitter) === null || _globalState$eventEmi === void 0 || _globalState$eventEmi.emit('didRender', popup); + }; + + /* + * Global function to determine if SweetAlert2 popup is shown + */ + const isVisible = () => { + return isVisible$1(getPopup()); + }; + + /* + * Global function to click 'Confirm' button + */ + const clickConfirm = () => { + var _dom$getConfirmButton; + return (_dom$getConfirmButton = getConfirmButton()) === null || _dom$getConfirmButton === void 0 ? void 0 : _dom$getConfirmButton.click(); + }; + + /* + * Global function to click 'Deny' button + */ + const clickDeny = () => { + var _dom$getDenyButton; + return (_dom$getDenyButton = getDenyButton()) === null || _dom$getDenyButton === void 0 ? void 0 : _dom$getDenyButton.click(); + }; + + /* + * Global function to click 'Cancel' button + */ + const clickCancel = () => { + var _dom$getCancelButton; + return (_dom$getCancelButton = getCancelButton()) === null || _dom$getCancelButton === void 0 ? void 0 : _dom$getCancelButton.click(); + }; + + /** @type {Record} */ + const DismissReason = Object.freeze({ + cancel: 'cancel', + backdrop: 'backdrop', + close: 'close', + esc: 'esc', + timer: 'timer' + }); + + /** + * @param {GlobalState} globalState + */ + const removeKeydownHandler = globalState => { + if (globalState.keydownTarget && globalState.keydownHandlerAdded && globalState.keydownHandler) { + const handler = /** @type {EventListenerOrEventListenerObject} */ /** @type {unknown} */globalState.keydownHandler; + globalState.keydownTarget.removeEventListener('keydown', handler, { + capture: globalState.keydownListenerCapture + }); + globalState.keydownHandlerAdded = false; + } + }; + + /** + * @param {GlobalState} globalState + * @param {SweetAlertOptions} innerParams + * @param {(dismiss: DismissReason) => void} dismissWith + */ + const addKeydownHandler = (globalState, innerParams, dismissWith) => { + removeKeydownHandler(globalState); + if (!innerParams.toast) { + /** @type {(this: HTMLElement, event: KeyboardEvent) => void} */ + const handler = e => keydownHandler(innerParams, e, dismissWith); + globalState.keydownHandler = handler; + const target = innerParams.keydownListenerCapture ? window : getPopup(); + if (target) { + globalState.keydownTarget = target; + globalState.keydownListenerCapture = innerParams.keydownListenerCapture; + const eventHandler = /** @type {EventListenerOrEventListenerObject} */ /** @type {unknown} */handler; + globalState.keydownTarget.addEventListener('keydown', eventHandler, { + capture: globalState.keydownListenerCapture + }); + globalState.keydownHandlerAdded = true; + } + } + }; + + /** + * @param {number} index + * @param {number} increment + */ + const setFocus = (index, increment) => { + var _dom$getPopup; + const focusableElements = getFocusableElements(); + // search for visible elements and select the next possible match + if (focusableElements.length) { + index = index + increment; + + // shift + tab when .swal2-popup is focused + if (index === -2) { + index = focusableElements.length - 1; + } + + // rollover to first item + if (index === focusableElements.length) { + index = 0; + + // go to last item + } else if (index === -1) { + index = focusableElements.length - 1; + } + focusableElements[index].focus(); + return; + } + // no visible focusable elements, focus the popup + (_dom$getPopup = getPopup()) === null || _dom$getPopup === void 0 || _dom$getPopup.focus(); + }; + const arrowKeysNextButton = ['ArrowRight', 'ArrowDown']; + const arrowKeysPreviousButton = ['ArrowLeft', 'ArrowUp']; + + /** + * @param {SweetAlertOptions} innerParams + * @param {KeyboardEvent} event + * @param {(dismiss: DismissReason) => void} dismissWith + */ + const keydownHandler = (innerParams, event, dismissWith) => { + if (!innerParams) { + return; // This instance has already been destroyed + } + + // Ignore keydown during IME composition + // https://developer.mozilla.org/en-US/docs/Web/API/Document/keydown_event#ignoring_keydown_during_ime_composition + // https://github.com/sweetalert2/sweetalert2/issues/720 + // https://github.com/sweetalert2/sweetalert2/issues/2406 + if (event.isComposing || event.keyCode === 229) { + return; + } + if (innerParams.stopKeydownPropagation) { + event.stopPropagation(); + } + + // ENTER + if (event.key === 'Enter') { + handleEnter(event, innerParams); + } + + // TAB + else if (event.key === 'Tab') { + handleTab(event); + } + + // ARROWS - switch focus between buttons + else if ([...arrowKeysNextButton, ...arrowKeysPreviousButton].includes(event.key)) { + handleArrows(event.key); + } + + // ESC + else if (event.key === 'Escape') { + handleEsc(event, innerParams, dismissWith); + } + }; + + /** + * @param {KeyboardEvent} event + * @param {SweetAlertOptions} innerParams + */ + const handleEnter = (event, innerParams) => { + // https://github.com/sweetalert2/sweetalert2/issues/2386 + if (!callIfFunction(innerParams.allowEnterKey)) { + return; + } + const popup = getPopup(); + if (!popup || !innerParams.input) { + return; + } + const input = getInput$1(popup, innerParams.input); + if (event.target && input && event.target instanceof HTMLElement && event.target.outerHTML === input.outerHTML) { + if (['textarea', 'file'].includes(innerParams.input)) { + return; // do not submit + } + clickConfirm(); + event.preventDefault(); + } + }; + + /** + * @param {KeyboardEvent} event + */ + const handleTab = event => { + const targetElement = event.target; + const focusableElements = getFocusableElements(); + let btnIndex = -1; + for (let i = 0; i < focusableElements.length; i++) { + if (targetElement === focusableElements[i]) { + btnIndex = i; + break; + } + } + + // Cycle to the next button + if (!event.shiftKey) { + setFocus(btnIndex, 1); + } + + // Cycle to the prev button + else { + setFocus(btnIndex, -1); + } + event.stopPropagation(); + event.preventDefault(); + }; + + /** + * @param {string} key + */ + const handleArrows = key => { + const actions = getActions(); + const confirmButton = getConfirmButton(); + const denyButton = getDenyButton(); + const cancelButton = getCancelButton(); + if (!actions || !confirmButton || !denyButton || !cancelButton) { + return; + } + /** @type HTMLElement[] */ + const buttons = [confirmButton, denyButton, cancelButton]; + if (document.activeElement instanceof HTMLElement && !buttons.includes(document.activeElement)) { + return; + } + const sibling = arrowKeysNextButton.includes(key) ? 'nextElementSibling' : 'previousElementSibling'; + let buttonToFocus = document.activeElement; + if (!buttonToFocus) { + return; + } + for (let i = 0; i < actions.children.length; i++) { + buttonToFocus = buttonToFocus[sibling]; + if (!buttonToFocus) { + return; + } + if (buttonToFocus instanceof HTMLButtonElement && isVisible$1(buttonToFocus)) { + break; + } + } + if (buttonToFocus instanceof HTMLButtonElement) { + buttonToFocus.focus(); + } + }; + + /** + * @param {KeyboardEvent} event + * @param {SweetAlertOptions} innerParams + * @param {(dismiss: DismissReason) => void} dismissWith + */ + const handleEsc = (event, innerParams, dismissWith) => { + event.preventDefault(); + if (callIfFunction(innerParams.allowEscapeKey)) { + dismissWith(DismissReason.esc); + } + }; + + /** + * This module contains `WeakMap`s for each effectively-"private property" that a `Swal` has. + * For example, to set the private property "foo" of `this` to "bar", you can `privateProps.foo.set(this, 'bar')` + * This is the approach that Babel will probably take to implement private methods/fields + * https://github.com/tc39/proposal-private-methods + * https://github.com/babel/babel/pull/7555 + * Once we have the changes from that PR in Babel, and our core class fits reasonable in *one module* + * then we can use that language feature. + */ + + var privateMethods = { + swalPromiseResolve: new WeakMap(), + swalPromiseReject: new WeakMap() + }; + + // From https://developer.paciellogroup.com/blog/2018/06/the-current-state-of-modal-dialog-accessibility/ + // Adding aria-hidden="true" to elements outside of the active modal dialog ensures that + // elements not within the active modal dialog will not be surfaced if a user opens a screen + // reader’s list of elements (headings, form controls, landmarks, etc.) in the document. + + const setAriaHidden = () => { + const container = getContainer(); + const bodyChildren = Array.from(document.body.children); + bodyChildren.forEach(el => { + if (el.contains(container)) { + return; + } + if (el.hasAttribute('aria-hidden')) { + el.setAttribute('data-previous-aria-hidden', el.getAttribute('aria-hidden') || ''); + } + el.setAttribute('aria-hidden', 'true'); + }); + }; + const unsetAriaHidden = () => { + const bodyChildren = Array.from(document.body.children); + bodyChildren.forEach(el => { + if (el.hasAttribute('data-previous-aria-hidden')) { + el.setAttribute('aria-hidden', el.getAttribute('data-previous-aria-hidden') || ''); + el.removeAttribute('data-previous-aria-hidden'); + } else { + el.removeAttribute('aria-hidden'); + } + }); + }; + + // @ts-ignore + const isSafariOrIOS = typeof window !== 'undefined' && Boolean(window.GestureEvent); // true for Safari desktop + all iOS browsers https://stackoverflow.com/a/70585394 + + /** + * Fix iOS scrolling + * http://stackoverflow.com/q/39626302 + */ + const iOSfix = () => { + if (isSafariOrIOS && !hasClass(document.body, swalClasses.iosfix)) { + const offset = document.body.scrollTop; + document.body.style.top = `${offset * -1}px`; + addClass(document.body, swalClasses.iosfix); + lockBodyScroll(); + } + }; + + /** + * https://github.com/sweetalert2/sweetalert2/issues/1246 + */ + const lockBodyScroll = () => { + const container = getContainer(); + if (!container) { + return; + } + /** @type {boolean} */ + let preventTouchMove; + /** + * @param {TouchEvent} event + */ + container.ontouchstart = event => { + preventTouchMove = shouldPreventTouchMove(event); + }; + /** + * @param {TouchEvent} event + */ + container.ontouchmove = event => { + if (preventTouchMove) { + event.preventDefault(); + event.stopPropagation(); + } + }; + }; + + /** + * @param {TouchEvent} event + * @returns {boolean} + */ + const shouldPreventTouchMove = event => { + const target = event.target; + const container = getContainer(); + const htmlContainer = getHtmlContainer(); + if (!container || !htmlContainer) { + return false; + } + if (isStylus(event) || isZoom(event)) { + return false; + } + if (target === container) { + return true; + } + if (!isScrollable(container) && target instanceof HTMLElement && !selfOrParentIsScrollable(target, htmlContainer) && + // #2823 + target.tagName !== 'INPUT' && + // #1603 + target.tagName !== 'TEXTAREA' && + // #2266 + !(isScrollable(htmlContainer) && + // #1944 + htmlContainer.contains(target))) { + return true; + } + return false; + }; + + /** + * https://github.com/sweetalert2/sweetalert2/issues/1786 + * + * @param {TouchEvent} event + * @returns {boolean} + */ + const isStylus = event => { + return Boolean(event.touches && event.touches.length && + // @ts-ignore - touchType is not a standard property + event.touches[0].touchType === 'stylus'); + }; + + /** + * https://github.com/sweetalert2/sweetalert2/issues/1891 + * + * @param {TouchEvent} event + * @returns {boolean} + */ + const isZoom = event => { + return event.touches && event.touches.length > 1; + }; + const undoIOSfix = () => { + if (hasClass(document.body, swalClasses.iosfix)) { + const offset = parseInt(document.body.style.top, 10); + removeClass(document.body, swalClasses.iosfix); + document.body.style.top = ''; + document.body.scrollTop = offset * -1; + } + }; + + /** + * Measure scrollbar width for padding body during modal show/hide + * https://github.com/twbs/bootstrap/blob/master/js/src/modal.js + * + * @returns {number} + */ + const measureScrollbar = () => { + const scrollDiv = document.createElement('div'); + scrollDiv.className = swalClasses['scrollbar-measure']; + document.body.appendChild(scrollDiv); + const scrollbarWidth = scrollDiv.getBoundingClientRect().width - scrollDiv.clientWidth; + document.body.removeChild(scrollDiv); + return scrollbarWidth; + }; + + /** + * Remember state in cases where opening and handling a modal will fiddle with it. + * @type {number | null} + */ + let previousBodyPadding = null; + + /** + * @param {string} initialBodyOverflow + */ + const replaceScrollbarWithPadding = initialBodyOverflow => { + // for queues, do not do this more than once + if (previousBodyPadding !== null) { + return; + } + // if the body has overflow + if (document.body.scrollHeight > window.innerHeight || initialBodyOverflow === 'scroll' // https://github.com/sweetalert2/sweetalert2/issues/2663 + ) { + // add padding so the content doesn't shift after removal of scrollbar + previousBodyPadding = parseInt(window.getComputedStyle(document.body).getPropertyValue('padding-right')); + document.body.style.paddingRight = `${previousBodyPadding + measureScrollbar()}px`; + } + }; + const undoReplaceScrollbarWithPadding = () => { + if (previousBodyPadding !== null) { + document.body.style.paddingRight = `${previousBodyPadding}px`; + previousBodyPadding = null; + } + }; + + /** + * @param {SweetAlert} instance + * @param {HTMLElement} container + * @param {boolean} returnFocus + * @param {(() => void) | undefined} didClose + */ + function removePopupAndResetState(instance, container, returnFocus, didClose) { + if (isToast()) { + triggerDidCloseAndDispose(instance, didClose); + } else { + restoreActiveElement(returnFocus).then(() => triggerDidCloseAndDispose(instance, didClose)); + removeKeydownHandler(globalState); + } + + // workaround for https://github.com/sweetalert2/sweetalert2/issues/2088 + // for some reason removing the container in Safari will scroll the document to bottom + if (isSafariOrIOS) { + container.setAttribute('style', 'display:none !important'); + container.removeAttribute('class'); + container.innerHTML = ''; + } else { + container.remove(); + } + if (isModal()) { + undoReplaceScrollbarWithPadding(); + undoIOSfix(); + unsetAriaHidden(); + } + removeBodyClasses(); + } + + /** + * Remove SweetAlert2 classes from body + */ + function removeBodyClasses() { + removeClass([document.documentElement, document.body], [swalClasses.shown, swalClasses['height-auto'], swalClasses['no-backdrop'], swalClasses['toast-shown']]); + } + + /** + * Instance method to close sweetAlert + * + * @param {SweetAlertResult | undefined} resolveValue + * @this {SweetAlert} + */ + function close(resolveValue) { + resolveValue = prepareResolveValue(resolveValue); + const swalPromiseResolve = privateMethods.swalPromiseResolve.get(this); + const didClose = triggerClosePopup(this); + if (this.isAwaitingPromise) { + // A swal awaiting for a promise (after a click on Confirm or Deny) cannot be dismissed anymore #2335 + if (!resolveValue.isDismissed) { + handleAwaitingPromise(this); + swalPromiseResolve(resolveValue); + } + } else if (didClose) { + // Resolve Swal promise + swalPromiseResolve(resolveValue); + } + } + + /** + * @param {SweetAlert} instance + * @returns {boolean} + */ + const triggerClosePopup = instance => { + const popup = getPopup(); + if (!popup) { + return false; + } + const innerParams = privateProps.innerParams.get(instance); + if (!innerParams || hasClass(popup, innerParams.hideClass.popup)) { + return false; + } + removeClass(popup, innerParams.showClass.popup); + addClass(popup, innerParams.hideClass.popup); + const backdrop = getContainer(); + removeClass(backdrop, innerParams.showClass.backdrop); + addClass(backdrop, innerParams.hideClass.backdrop); + handlePopupAnimation(instance, popup, innerParams); + return true; + }; + + /** + * @param {Error | string} error + * @this {SweetAlert} + */ + function rejectPromise(error) { + const rejectPromise = privateMethods.swalPromiseReject.get(this); + handleAwaitingPromise(this); + if (rejectPromise) { + // Reject Swal promise + rejectPromise(error); + } + } + + /** + * @param {SweetAlert} instance + */ + const handleAwaitingPromise = instance => { + if (instance.isAwaitingPromise) { + // @ts-ignore + delete instance.isAwaitingPromise; + // The instance might have been previously partly destroyed, we must resume the destroy process in this case #2335 + if (!privateProps.innerParams.get(instance)) { + instance._destroy(); + } + } + }; + + /** + * @param {SweetAlertResult | undefined} resolveValue + * @returns {SweetAlertResult} + */ + const prepareResolveValue = resolveValue => { + // When user calls Swal.close() + if (typeof resolveValue === 'undefined') { + return { + isConfirmed: false, + isDenied: false, + isDismissed: true + }; + } + return Object.assign({ + isConfirmed: false, + isDenied: false, + isDismissed: false + }, resolveValue); + }; + + /** + * @param {SweetAlert} instance + * @param {HTMLElement} popup + * @param {SweetAlertOptions} innerParams + */ + const handlePopupAnimation = (instance, popup, innerParams) => { + var _globalState$eventEmi; + const container = getContainer(); + // If animation is supported, animate + const animationIsSupported = hasCssAnimation(popup); + if (typeof innerParams.willClose === 'function') { + innerParams.willClose(popup); + } + (_globalState$eventEmi = globalState.eventEmitter) === null || _globalState$eventEmi === void 0 || _globalState$eventEmi.emit('willClose', popup); + if (animationIsSupported && container) { + animatePopup(instance, popup, container, Boolean(innerParams.returnFocus), innerParams.didClose); + } else if (container) { + // Otherwise, remove immediately + removePopupAndResetState(instance, container, Boolean(innerParams.returnFocus), innerParams.didClose); + } + }; + + /** + * @param {SweetAlert} instance + * @param {HTMLElement} popup + * @param {HTMLElement} container + * @param {boolean} returnFocus + * @param {(() => void) | undefined} didClose + */ + const animatePopup = (instance, popup, container, returnFocus, didClose) => { + globalState.swalCloseEventFinishedCallback = removePopupAndResetState.bind(null, instance, container, returnFocus, didClose); + /** + * @param {AnimationEvent | TransitionEvent} e + */ + const swalCloseAnimationFinished = function (e) { + if (e.target === popup) { + var _globalState$swalClos; + (_globalState$swalClos = globalState.swalCloseEventFinishedCallback) === null || _globalState$swalClos === void 0 || _globalState$swalClos.call(globalState); + delete globalState.swalCloseEventFinishedCallback; + popup.removeEventListener('animationend', swalCloseAnimationFinished); + popup.removeEventListener('transitionend', swalCloseAnimationFinished); + } + }; + popup.addEventListener('animationend', swalCloseAnimationFinished); + popup.addEventListener('transitionend', swalCloseAnimationFinished); + }; + + /** + * @param {SweetAlert} instance + * @param {(() => void) | undefined} didClose + */ + const triggerDidCloseAndDispose = (instance, didClose) => { + setTimeout(() => { + var _globalState$eventEmi2; + if (typeof didClose === 'function') { + didClose.bind(instance.params)(); + } + (_globalState$eventEmi2 = globalState.eventEmitter) === null || _globalState$eventEmi2 === void 0 || _globalState$eventEmi2.emit('didClose'); + // instance might have been destroyed already + if (instance._destroy) { + instance._destroy(); + } + }); + }; + + /** + * Shows loader (spinner), this is useful with AJAX requests. + * By default the loader be shown instead of the "Confirm" button. + * + * @param {HTMLButtonElement | null} [buttonToReplace] + */ + const showLoading = buttonToReplace => { + let popup = getPopup(); + if (!popup) { + new Swal(); + } + popup = getPopup(); + if (!popup) { + return; + } + const loader = getLoader(); + if (isToast()) { + hide(getIcon()); + } else { + replaceButton(popup, buttonToReplace); + } + show(loader); + popup.setAttribute('data-loading', 'true'); + popup.setAttribute('aria-busy', 'true'); + popup.focus(); + }; + + /** + * @param {HTMLElement} popup + * @param {HTMLButtonElement | null} [buttonToReplace] + */ + const replaceButton = (popup, buttonToReplace) => { + const actions = getActions(); + const loader = getLoader(); + if (!actions || !loader) { + return; + } + if (!buttonToReplace && isVisible$1(getConfirmButton())) { + buttonToReplace = getConfirmButton(); + } + show(actions); + if (buttonToReplace) { + hide(buttonToReplace); + loader.setAttribute('data-button-to-replace', buttonToReplace.className); + actions.insertBefore(loader, buttonToReplace); + } + addClass([popup, actions], swalClasses.loading); + }; + + /** + * @param {SweetAlert} instance + * @param {SweetAlertOptions} params + */ + const handleInputOptionsAndValue = (instance, params) => { + if (params.input === 'select' || params.input === 'radio') { + handleInputOptions(instance, params); + } else if (['text', 'email', 'number', 'tel', 'textarea'].some(i => i === params.input) && (hasToPromiseFn(params.inputValue) || isPromise(params.inputValue))) { + showLoading(getConfirmButton()); + handleInputValue(instance, params); + } + }; + + /** + * @param {SweetAlert} instance + * @param {SweetAlertOptions} innerParams + * @returns {SweetAlertInputValue} + */ + const getInputValue = (instance, innerParams) => { + const input = instance.getInput(); + if (!input) { + return null; + } + switch (innerParams.input) { + case 'checkbox': + return getCheckboxValue(input); + case 'radio': + return getRadioValue(input); + case 'file': + return getFileValue(input); + default: + return innerParams.inputAutoTrim ? input.value.trim() : input.value; + } + }; + + /** + * @param {HTMLInputElement} input + * @returns {number} + */ + const getCheckboxValue = input => input.checked ? 1 : 0; + + /** + * @param {HTMLInputElement} input + * @returns {string | null} + */ + const getRadioValue = input => input.checked ? input.value : null; + + /** + * @param {HTMLInputElement} input + * @returns {FileList | File | null} + */ + const getFileValue = input => input.files && input.files.length ? input.getAttribute('multiple') !== null ? input.files : input.files[0] : null; + + /** + * @param {SweetAlert} instance + * @param {SweetAlertOptions} params + */ + const handleInputOptions = (instance, params) => { + const popup = getPopup(); + if (!popup) { + return; + } + /** + * @param {*} inputOptions + */ + const processInputOptions = inputOptions => { + if (params.input === 'select') { + populateSelectOptions(popup, formatInputOptions(inputOptions), params); + } else if (params.input === 'radio') { + populateRadioOptions(popup, formatInputOptions(inputOptions), params); + } + }; + if (hasToPromiseFn(params.inputOptions) || isPromise(params.inputOptions)) { + showLoading(getConfirmButton()); + asPromise(params.inputOptions).then(inputOptions => { + instance.hideLoading(); + processInputOptions(inputOptions); + }); + } else if (typeof params.inputOptions === 'object') { + processInputOptions(params.inputOptions); + } else { + error(`Unexpected type of inputOptions! Expected object, Map or Promise, got ${typeof params.inputOptions}`); + } + }; + + /** + * @param {SweetAlert} instance + * @param {SweetAlertOptions} params + */ + const handleInputValue = (instance, params) => { + const input = instance.getInput(); + if (!input) { + return; + } + hide(input); + asPromise(params.inputValue).then(inputValue => { + input.value = params.input === 'number' ? `${parseFloat(inputValue) || 0}` : `${inputValue}`; + show(input); + input.focus(); + instance.hideLoading(); + }).catch(err => { + error(`Error in inputValue promise: ${err}`); + input.value = ''; + show(input); + input.focus(); + instance.hideLoading(); + }); + }; + + /** + * @param {HTMLElement} popup + * @param {InputOptionFlattened[]} inputOptions + * @param {SweetAlertOptions} params + */ + function populateSelectOptions(popup, inputOptions, params) { + const select = getDirectChildByClass(popup, swalClasses.select); + if (!select) { + return; + } + /** + * @param {HTMLElement} parent + * @param {string} optionLabel + * @param {string} optionValue + */ + const renderOption = (parent, optionLabel, optionValue) => { + const option = document.createElement('option'); + option.value = optionValue; + setInnerHtml(option, optionLabel); + option.selected = isSelected(optionValue, params.inputValue); + parent.appendChild(option); + }; + inputOptions.forEach(inputOption => { + const optionValue = inputOption[0]; + const optionLabel = inputOption[1]; + // spec: + // https://www.w3.org/TR/html401/interact/forms.html#h-17.6 + // "...all OPTGROUP elements must be specified directly within a SELECT element (i.e., groups may not be nested)..." + // check whether this is a + if (Array.isArray(optionLabel)) { + // if it is an array, then it is an + const optgroup = document.createElement('optgroup'); + optgroup.label = optionValue; + optgroup.disabled = false; // not configurable for now + select.appendChild(optgroup); + optionLabel.forEach(o => renderOption(optgroup, o[1], o[0])); + } else { + // case of + valueFormatted = formatInputOptions(valueFormatted); + } + result.push([key, valueFormatted]); + }); + } else { + Object.keys(inputOptions).forEach(key => { + let valueFormatted = inputOptions[key]; + if (typeof valueFormatted === 'object') { + // case of + valueFormatted = formatInputOptions(valueFormatted); + } + result.push([key, valueFormatted]); + }); + } + return result; + }; + + /** + * @param {string} optionValue + * @param {SweetAlertInputValue} inputValue + * @returns {boolean} + */ + const isSelected = (optionValue, inputValue) => { + return Boolean(inputValue) && inputValue !== null && inputValue !== undefined && inputValue.toString() === optionValue.toString(); + }; + + /** + * @param {SweetAlert} instance + */ + const handleConfirmButtonClick = instance => { + const innerParams = privateProps.innerParams.get(instance); + instance.disableButtons(); + if (innerParams.input) { + handleConfirmOrDenyWithInput(instance, 'confirm'); + } else { + confirm(instance, true); + } + }; + + /** + * @param {SweetAlert} instance + */ + const handleDenyButtonClick = instance => { + const innerParams = privateProps.innerParams.get(instance); + instance.disableButtons(); + if (innerParams.returnInputValueOnDeny) { + handleConfirmOrDenyWithInput(instance, 'deny'); + } else { + deny(instance, false); + } + }; + + /** + * @param {SweetAlert} instance + * @param {(dismiss: DismissReason) => void} dismissWith + */ + const handleCancelButtonClick = (instance, dismissWith) => { + instance.disableButtons(); + dismissWith(DismissReason.cancel); + }; + + /** + * @param {SweetAlert} instance + * @param {'confirm' | 'deny'} type + */ + const handleConfirmOrDenyWithInput = (instance, type) => { + const innerParams = privateProps.innerParams.get(instance); + if (!innerParams.input) { + error(`The "input" parameter is needed to be set when using returnInputValueOn${capitalizeFirstLetter(type)}`); + return; + } + const input = instance.getInput(); + const inputValue = getInputValue(instance, innerParams); + if (innerParams.inputValidator) { + handleInputValidator(instance, inputValue, type); + } else if (input && !input.checkValidity()) { + instance.enableButtons(); + instance.showValidationMessage(innerParams.validationMessage || input.validationMessage); + } else if (type === 'deny') { + deny(instance, inputValue); + } else { + confirm(instance, inputValue); + } + }; + + /** + * @param {SweetAlert} instance + * @param {SweetAlertInputValue} inputValue + * @param {'confirm' | 'deny'} type + */ + const handleInputValidator = (instance, inputValue, type) => { + const innerParams = privateProps.innerParams.get(instance); + instance.disableInput(); + const validationPromise = Promise.resolve().then(() => asPromise(innerParams.inputValidator(inputValue, innerParams.validationMessage))); + validationPromise.then(validationMessage => { + instance.enableButtons(); + instance.enableInput(); + if (validationMessage) { + instance.showValidationMessage(validationMessage); + } else if (type === 'deny') { + deny(instance, inputValue); + } else { + confirm(instance, inputValue); + } + }); + }; + + /** + * @param {SweetAlert} instance + * @param {*} value + */ + const deny = (instance, value) => { + const innerParams = privateProps.innerParams.get(instance); + if (innerParams.showLoaderOnDeny) { + showLoading(getDenyButton()); + } + if (innerParams.preDeny) { + instance.isAwaitingPromise = true; // Flagging the instance as awaiting a promise so it's own promise's reject/resolve methods doesn't get destroyed until the result from this preDeny's promise is received + const preDenyPromise = Promise.resolve().then(() => asPromise(innerParams.preDeny(value, innerParams.validationMessage))); + preDenyPromise.then(preDenyValue => { + if (preDenyValue === false) { + instance.hideLoading(); + handleAwaitingPromise(instance); + } else { + instance.close(/** @type SweetAlertResult */{ + isDenied: true, + value: typeof preDenyValue === 'undefined' ? value : preDenyValue + }); + } + }).catch(error => rejectWith(instance, error)); + } else { + instance.close(/** @type SweetAlertResult */{ + isDenied: true, + value + }); + } + }; + + /** + * @param {SweetAlert} instance + * @param {*} value + */ + const succeedWith = (instance, value) => { + instance.close(/** @type SweetAlertResult */{ + isConfirmed: true, + value + }); + }; + + /** + * + * @param {SweetAlert} instance + * @param {string} error + */ + const rejectWith = (instance, error) => { + instance.rejectPromise(error); + }; + + /** + * + * @param {SweetAlert} instance + * @param {*} value + */ + const confirm = (instance, value) => { + const innerParams = privateProps.innerParams.get(instance); + if (innerParams.showLoaderOnConfirm) { + showLoading(); + } + if (innerParams.preConfirm) { + instance.resetValidationMessage(); + instance.isAwaitingPromise = true; // Flagging the instance as awaiting a promise so it's own promise's reject/resolve methods doesn't get destroyed until the result from this preConfirm's promise is received + const preConfirmPromise = Promise.resolve().then(() => asPromise(innerParams.preConfirm(value, innerParams.validationMessage))); + preConfirmPromise.then(preConfirmValue => { + if (isVisible$1(getValidationMessage()) || preConfirmValue === false) { + instance.hideLoading(); + handleAwaitingPromise(instance); + } else { + succeedWith(instance, typeof preConfirmValue === 'undefined' ? value : preConfirmValue); + } + }).catch(error => rejectWith(instance, error)); + } else { + succeedWith(instance, value); + } + }; + + /** + * Hides loader and shows back the button which was hidden by .showLoading() + * @this {SweetAlert} + */ + function hideLoading() { + // do nothing if popup is closed + const innerParams = privateProps.innerParams.get(this); + if (!innerParams) { + return; + } + const domCache = privateProps.domCache.get(this); + hide(domCache.loader); + if (isToast()) { + if (innerParams.icon) { + show(getIcon()); + } + } else { + showRelatedButton(domCache); + } + removeClass([domCache.popup, domCache.actions], swalClasses.loading); + domCache.popup.removeAttribute('aria-busy'); + domCache.popup.removeAttribute('data-loading'); + domCache.confirmButton.disabled = false; + domCache.denyButton.disabled = false; + domCache.cancelButton.disabled = false; + } + + /** + * @param {DomCache} domCache + */ + const showRelatedButton = domCache => { + const dataButtonToReplace = domCache.loader.getAttribute('data-button-to-replace'); + const buttonToReplace = dataButtonToReplace ? domCache.popup.getElementsByClassName(dataButtonToReplace) : []; + if (buttonToReplace.length) { + show(/** @type {HTMLElement} */buttonToReplace[0], 'inline-block'); + } else if (allButtonsAreHidden()) { + hide(domCache.actions); + } + }; + + /** + * Gets the input DOM node, this method works with input parameter. + * + * @returns {HTMLInputElement | null} + * @this {SweetAlert} + */ + function getInput() { + const innerParams = privateProps.innerParams.get(this); + const domCache = privateProps.domCache.get(this); + if (!domCache) { + return null; + } + return getInput$1(domCache.popup, innerParams.input); + } + + /** + * @param {SweetAlert} instance + * @param {string[]} buttons + * @param {boolean} disabled + */ + function setButtonsDisabled(instance, buttons, disabled) { + const domCache = privateProps.domCache.get(instance); + buttons.forEach(button => { + domCache[button].disabled = disabled; + }); + } + + /** + * @param {HTMLInputElement | null} input + * @param {boolean} disabled + */ + function setInputDisabled(input, disabled) { + const popup = getPopup(); + if (!popup || !input) { + return; + } + if (input.type === 'radio') { + /** @type {NodeListOf} */ + const radios = popup.querySelectorAll(`[name="${swalClasses.radio}"]`); + for (let i = 0; i < radios.length; i++) { + radios[i].disabled = disabled; + } + } else { + input.disabled = disabled; + } + } + + /** + * Enable all the buttons + * @this {SweetAlert} + */ + function enableButtons() { + setButtonsDisabled(this, ['confirmButton', 'denyButton', 'cancelButton'], false); + } + + /** + * Disable all the buttons + * @this {SweetAlert} + */ + function disableButtons() { + setButtonsDisabled(this, ['confirmButton', 'denyButton', 'cancelButton'], true); + } + + /** + * Enable the input field + * @this {SweetAlert} + */ + function enableInput() { + setInputDisabled(this.getInput(), false); + } + + /** + * Disable the input field + * @this {SweetAlert} + */ + function disableInput() { + setInputDisabled(this.getInput(), true); + } + + /** + * Show block with validation message + * + * @param {string} error + * @this {SweetAlert} + */ + function showValidationMessage(error) { + const domCache = privateProps.domCache.get(this); + const params = privateProps.innerParams.get(this); + setInnerHtml(domCache.validationMessage, error); + domCache.validationMessage.className = swalClasses['validation-message']; + if (params.customClass && params.customClass.validationMessage) { + addClass(domCache.validationMessage, params.customClass.validationMessage); + } + show(domCache.validationMessage); + const input = this.getInput(); + if (input) { + input.setAttribute('aria-invalid', 'true'); + input.setAttribute('aria-describedby', swalClasses['validation-message']); + focusInput(input); + addClass(input, swalClasses.inputerror); + } + } + + /** + * Hide block with validation message + * + * @this {SweetAlert} + */ + function resetValidationMessage() { + const domCache = privateProps.domCache.get(this); + if (domCache.validationMessage) { + hide(domCache.validationMessage); + } + const input = this.getInput(); + if (input) { + input.removeAttribute('aria-invalid'); + input.removeAttribute('aria-describedby'); + removeClass(input, swalClasses.inputerror); + } + } + + const defaultParams = { + title: '', + titleText: '', + text: '', + html: '', + footer: '', + icon: undefined, + iconColor: undefined, + iconHtml: undefined, + template: undefined, + toast: false, + draggable: false, + animation: true, + theme: 'light', + showClass: { + popup: 'swal2-show', + backdrop: 'swal2-backdrop-show', + icon: 'swal2-icon-show' + }, + hideClass: { + popup: 'swal2-hide', + backdrop: 'swal2-backdrop-hide', + icon: 'swal2-icon-hide' + }, + customClass: {}, + target: 'body', + color: undefined, + backdrop: true, + heightAuto: true, + allowOutsideClick: true, + allowEscapeKey: true, + allowEnterKey: true, + stopKeydownPropagation: true, + keydownListenerCapture: false, + showConfirmButton: true, + showDenyButton: false, + showCancelButton: false, + preConfirm: undefined, + preDeny: undefined, + confirmButtonText: 'OK', + confirmButtonAriaLabel: '', + confirmButtonColor: undefined, + denyButtonText: 'No', + denyButtonAriaLabel: '', + denyButtonColor: undefined, + cancelButtonText: 'Cancel', + cancelButtonAriaLabel: '', + cancelButtonColor: undefined, + buttonsStyling: true, + reverseButtons: false, + focusConfirm: true, + focusDeny: false, + focusCancel: false, + returnFocus: true, + showCloseButton: false, + closeButtonHtml: '×', + closeButtonAriaLabel: 'Close this dialog', + loaderHtml: '', + showLoaderOnConfirm: false, + showLoaderOnDeny: false, + imageUrl: undefined, + imageWidth: undefined, + imageHeight: undefined, + imageAlt: '', + timer: undefined, + timerProgressBar: false, + width: undefined, + padding: undefined, + background: undefined, + input: undefined, + inputPlaceholder: '', + inputLabel: '', + inputValue: '', + inputOptions: {}, + inputAutoFocus: true, + inputAutoTrim: true, + inputAttributes: {}, + inputValidator: undefined, + returnInputValueOnDeny: false, + validationMessage: undefined, + grow: false, + position: 'center', + progressSteps: [], + currentProgressStep: undefined, + progressStepsDistance: undefined, + willOpen: undefined, + didOpen: undefined, + didRender: undefined, + willClose: undefined, + didClose: undefined, + didDestroy: undefined, + scrollbarPadding: true, + topLayer: false + }; + const updatableParams = ['allowEscapeKey', 'allowOutsideClick', 'background', 'buttonsStyling', 'cancelButtonAriaLabel', 'cancelButtonColor', 'cancelButtonText', 'closeButtonAriaLabel', 'closeButtonHtml', 'color', 'confirmButtonAriaLabel', 'confirmButtonColor', 'confirmButtonText', 'currentProgressStep', 'customClass', 'denyButtonAriaLabel', 'denyButtonColor', 'denyButtonText', 'didClose', 'didDestroy', 'draggable', 'footer', 'hideClass', 'html', 'icon', 'iconColor', 'iconHtml', 'imageAlt', 'imageHeight', 'imageUrl', 'imageWidth', 'preConfirm', 'preDeny', 'progressSteps', 'returnFocus', 'reverseButtons', 'showCancelButton', 'showCloseButton', 'showConfirmButton', 'showDenyButton', 'text', 'title', 'titleText', 'theme', 'willClose']; + + /** @type {Record} */ + const deprecatedParams = { + allowEnterKey: undefined + }; + const toastIncompatibleParams = ['allowOutsideClick', 'allowEnterKey', 'backdrop', 'draggable', 'focusConfirm', 'focusDeny', 'focusCancel', 'returnFocus', 'heightAuto', 'keydownListenerCapture']; + + /** + * Is valid parameter + * + * @param {string} paramName + * @returns {boolean} + */ + const isValidParameter = paramName => { + return Object.prototype.hasOwnProperty.call(defaultParams, paramName); + }; + + /** + * Is valid parameter for Swal.update() method + * + * @param {string} paramName + * @returns {boolean} + */ + const isUpdatableParameter = paramName => { + return updatableParams.indexOf(paramName) !== -1; + }; + + /** + * Is deprecated parameter + * + * @param {string} paramName + * @returns {string | undefined} + */ + const isDeprecatedParameter = paramName => { + return deprecatedParams[paramName]; + }; + + /** + * @param {string} param + */ + const checkIfParamIsValid = param => { + if (!isValidParameter(param)) { + warn(`Unknown parameter "${param}"`); + } + }; + + /** + * @param {string} param + */ + const checkIfToastParamIsValid = param => { + if (toastIncompatibleParams.includes(param)) { + warn(`The parameter "${param}" is incompatible with toasts`); + } + }; + + /** + * @param {string} param + */ + const checkIfParamIsDeprecated = param => { + const isDeprecated = isDeprecatedParameter(param); + if (isDeprecated) { + warnAboutDeprecation(param, isDeprecated); + } + }; + + /** + * Show relevant warnings for given params + * + * @param {SweetAlertOptions} params + */ + const showWarningsForParams = params => { + if (params.backdrop === false && params.allowOutsideClick) { + warn('"allowOutsideClick" parameter requires `backdrop` parameter to be set to `true`'); + } + if (params.theme && !['light', 'dark', 'auto', 'minimal', 'borderless', 'bootstrap-4', 'bootstrap-4-light', 'bootstrap-4-dark', 'bootstrap-5', 'bootstrap-5-light', 'bootstrap-5-dark', 'material-ui', 'material-ui-light', 'material-ui-dark', 'embed-iframe', 'bulma', 'bulma-light', 'bulma-dark'].includes(params.theme)) { + warn(`Invalid theme "${params.theme}"`); + } + for (const param in params) { + checkIfParamIsValid(param); + if (params.toast) { + checkIfToastParamIsValid(param); + } + checkIfParamIsDeprecated(param); + } + }; + + /** + * Updates popup parameters. + * + * @this {any} + * @param {SweetAlertOptions} params + */ + function update(params) { + const container = getContainer(); + const popup = getPopup(); + const innerParams = privateProps.innerParams.get(this); + if (!popup || hasClass(popup, innerParams.hideClass.popup)) { + warn(`You're trying to update the closed or closing popup, that won't work. Use the update() method in preConfirm parameter or show a new popup.`); + return; + } + const validUpdatableParams = filterValidParams(params); + const updatedParams = Object.assign({}, innerParams, validUpdatableParams); + showWarningsForParams(updatedParams); + if (container) { + container.dataset['swal2Theme'] = updatedParams.theme; + } + render(this, updatedParams); + privateProps.innerParams.set(this, updatedParams); + Object.defineProperties(this, { + params: { + value: Object.assign({}, this.params, params), + writable: false, + enumerable: true + } + }); + } + + /** + * @param {SweetAlertOptions} params + * @returns {SweetAlertOptions} + */ + const filterValidParams = params => { + /** @type {Record} */ + const validUpdatableParams = {}; + Object.keys(params).forEach(param => { + if (isUpdatableParameter(param)) { + const typedParams = /** @type {Record} */params; + validUpdatableParams[param] = typedParams[param]; + } else { + warn(`Invalid parameter to update: ${param}`); + } + }); + return validUpdatableParams; + }; + + /** + * Dispose the current SweetAlert2 instance + * @this {SweetAlert} + */ + function _destroy() { + var _globalState$eventEmi; + const domCache = privateProps.domCache.get(this); + const innerParams = privateProps.innerParams.get(this); + if (!innerParams) { + disposeWeakMaps(this); // The WeakMaps might have been partly destroyed, we must recall it to dispose any remaining WeakMaps #2335 + return; // This instance has already been destroyed + } + + // Check if there is another Swal closing + if (domCache.popup && globalState.swalCloseEventFinishedCallback) { + globalState.swalCloseEventFinishedCallback(); + delete globalState.swalCloseEventFinishedCallback; + } + if (typeof innerParams.didDestroy === 'function') { + innerParams.didDestroy(); + } + (_globalState$eventEmi = globalState.eventEmitter) === null || _globalState$eventEmi === void 0 || _globalState$eventEmi.emit('didDestroy'); + disposeSwal(this); + } + + /** + * @param {SweetAlert} instance + */ + const disposeSwal = instance => { + disposeWeakMaps(instance); + // Unset this.params so GC will dispose it (#1569) + // @ts-ignore + delete instance.params; + // Unset globalState props so GC will dispose globalState (#1569) + delete globalState.keydownHandler; + delete globalState.keydownTarget; + // Unset currentInstance + delete globalState.currentInstance; + }; + + /** + * @param {SweetAlert} instance + */ + const disposeWeakMaps = instance => { + // If the current instance is awaiting a promise result, we keep the privateMethods to call them once the promise result is retrieved #2335 + if (instance.isAwaitingPromise) { + unsetWeakMaps(privateProps, instance); + instance.isAwaitingPromise = true; + } else { + unsetWeakMaps(privateMethods, instance); + unsetWeakMaps(privateProps, instance); + + // @ts-ignore + delete instance.isAwaitingPromise; + // Unset instance methods + // @ts-ignore + delete instance.disableButtons; + // @ts-ignore + delete instance.enableButtons; + // @ts-ignore + delete instance.getInput; + // @ts-ignore + delete instance.disableInput; + // @ts-ignore + delete instance.enableInput; + // @ts-ignore + delete instance.hideLoading; + // @ts-ignore + delete instance.disableLoading; + // @ts-ignore + delete instance.showValidationMessage; + // @ts-ignore + delete instance.resetValidationMessage; + // @ts-ignore + delete instance.close; + // @ts-ignore + delete instance.closePopup; + // @ts-ignore + delete instance.closeModal; + // @ts-ignore + delete instance.closeToast; + // @ts-ignore + delete instance.rejectPromise; + // @ts-ignore + delete instance.update; + // @ts-ignore + delete instance._destroy; + } + }; + + /** + * @param {Record>} obj + * @param {SweetAlert} instance + */ + const unsetWeakMaps = (obj, instance) => { + for (const i in obj) { + obj[i].delete(instance); + } + }; + + var instanceMethods = /*#__PURE__*/Object.freeze({ + __proto__: null, + _destroy: _destroy, + close: close, + closeModal: close, + closePopup: close, + closeToast: close, + disableButtons: disableButtons, + disableInput: disableInput, + disableLoading: hideLoading, + enableButtons: enableButtons, + enableInput: enableInput, + getInput: getInput, + handleAwaitingPromise: handleAwaitingPromise, + hideLoading: hideLoading, + rejectPromise: rejectPromise, + resetValidationMessage: resetValidationMessage, + showValidationMessage: showValidationMessage, + update: update + }); + + /** + * @param {SweetAlertOptions} innerParams + * @param {DomCache} domCache + * @param {(dismiss: DismissReason) => void} dismissWith + */ + const handlePopupClick = (innerParams, domCache, dismissWith) => { + if (innerParams.toast) { + handleToastClick(innerParams, domCache, dismissWith); + } else { + // Ignore click events that had mousedown on the popup but mouseup on the container + // This can happen when the user drags a slider + handleModalMousedown(domCache); + + // Ignore click events that had mousedown on the container but mouseup on the popup + handleContainerMousedown(domCache); + handleModalClick(innerParams, domCache, dismissWith); + } + }; + + /** + * @param {SweetAlertOptions} innerParams + * @param {DomCache} domCache + * @param {(dismiss: DismissReason) => void} dismissWith + */ + const handleToastClick = (innerParams, domCache, dismissWith) => { + // Closing toast by internal click + domCache.popup.onclick = () => { + if (innerParams && (isAnyButtonShown(innerParams) || innerParams.timer || innerParams.input)) { + return; + } + dismissWith(DismissReason.close); + }; + }; + + /** + * @param {SweetAlertOptions} innerParams + * @returns {boolean} + */ + const isAnyButtonShown = innerParams => { + return Boolean(innerParams.showConfirmButton || innerParams.showDenyButton || innerParams.showCancelButton || innerParams.showCloseButton); + }; + let ignoreOutsideClick = false; + + /** + * @param {DomCache} domCache + */ + const handleModalMousedown = domCache => { + domCache.popup.onmousedown = () => { + domCache.container.onmouseup = function (e) { + domCache.container.onmouseup = () => {}; + // We only check if the mouseup target is the container because usually it doesn't + // have any other direct children aside of the popup + if (e.target === domCache.container) { + ignoreOutsideClick = true; + } + }; + }; + }; + + /** + * @param {DomCache} domCache + */ + const handleContainerMousedown = domCache => { + domCache.container.onmousedown = e => { + // prevent the modal text from being selected on double click on the container (allowOutsideClick: false) + if (e.target === domCache.container) { + e.preventDefault(); + } + domCache.popup.onmouseup = function (e) { + domCache.popup.onmouseup = () => {}; + // We also need to check if the mouseup target is a child of the popup + if (e.target === domCache.popup || e.target instanceof HTMLElement && domCache.popup.contains(e.target)) { + ignoreOutsideClick = true; + } + }; + }; + }; + + /** + * @param {SweetAlertOptions} innerParams + * @param {DomCache} domCache + * @param {(dismiss: DismissReason) => void} dismissWith + */ + const handleModalClick = (innerParams, domCache, dismissWith) => { + domCache.container.onclick = e => { + if (ignoreOutsideClick) { + ignoreOutsideClick = false; + return; + } + if (e.target === domCache.container && callIfFunction(innerParams.allowOutsideClick)) { + dismissWith(DismissReason.backdrop); + } + }; + }; + + /** + * @param {unknown} elem + * @returns {boolean} + */ + const isJqueryElement = elem => typeof elem === 'object' && elem !== null && 'jquery' in elem; + + /** + * @param {unknown} elem + * @returns {boolean} + */ + const isElement = elem => elem instanceof Element || isJqueryElement(elem); + + /** + * @param {ReadonlyArray} args + * @returns {SweetAlertOptions} + */ + const argsToParams = args => { + /** @type {Record} */ + const params = {}; + if (typeof args[0] === 'object' && !isElement(args[0])) { + Object.assign(params, args[0]); + } else { + ['title', 'html', 'icon'].forEach((name, index) => { + const arg = args[index]; + if (typeof arg === 'string' || isElement(arg)) { + params[name] = arg; + } else if (arg !== undefined) { + error(`Unexpected type of ${name}! Expected "string" or "Element", got ${typeof arg}`); + } + }); + } + return /** @type {SweetAlertOptions} */params; + }; + + /** + * Main method to create a new SweetAlert2 popup + * + * @this {new (...args: any[]) => any} + * @param {...SweetAlertOptions} args + * @returns {Promise} + */ + function fire(...args) { + return new this(...args); + } + + /** + * Returns an extended version of `Swal` containing `params` as defaults. + * Useful for reusing Swal configuration. + * + * For example: + * + * Before: + * const textPromptOptions = { input: 'text', showCancelButton: true } + * const {value: firstName} = await Swal.fire({ ...textPromptOptions, title: 'What is your first name?' }) + * const {value: lastName} = await Swal.fire({ ...textPromptOptions, title: 'What is your last name?' }) + * + * After: + * const TextPrompt = Swal.mixin({ input: 'text', showCancelButton: true }) + * const {value: firstName} = await TextPrompt('What is your first name?') + * const {value: lastName} = await TextPrompt('What is your last name?') + * + * @param {SweetAlertOptions} mixinParams + * @returns {SweetAlert} + * @this {typeof import('../SweetAlert.js').SweetAlert} + */ + function mixin(mixinParams) { + // @ts-ignore: 'this' refers to the SweetAlert constructor + class MixinSwal extends this { + /** + * @param {any} params + * @param {any} priorityMixinParams + */ + _main(params, priorityMixinParams) { + return super._main(params, Object.assign({}, mixinParams, priorityMixinParams)); + } + } + // @ts-ignore + return MixinSwal; + } + + /** + * If `timer` parameter is set, returns number of milliseconds of timer remained. + * Otherwise, returns undefined. + * + * @returns {number | undefined} + */ + const getTimerLeft = () => { + return globalState.timeout && globalState.timeout.getTimerLeft(); + }; + + /** + * Stop timer. Returns number of milliseconds of timer remained. + * If `timer` parameter isn't set, returns undefined. + * + * @returns {number | undefined} + */ + const stopTimer = () => { + if (globalState.timeout) { + stopTimerProgressBar(); + return globalState.timeout.stop(); + } + }; + + /** + * Resume timer. Returns number of milliseconds of timer remained. + * If `timer` parameter isn't set, returns undefined. + * + * @returns {number | undefined} + */ + const resumeTimer = () => { + if (globalState.timeout) { + const remaining = globalState.timeout.start(); + animateTimerProgressBar(remaining); + return remaining; + } + }; + + /** + * Resume timer. Returns number of milliseconds of timer remained. + * If `timer` parameter isn't set, returns undefined. + * + * @returns {number | undefined} + */ + const toggleTimer = () => { + const timer = globalState.timeout; + return timer && (timer.running ? stopTimer() : resumeTimer()); + }; + + /** + * Increase timer. Returns number of milliseconds of an updated timer. + * If `timer` parameter isn't set, returns undefined. + * + * @param {number} ms + * @returns {number | undefined} + */ + const increaseTimer = ms => { + if (globalState.timeout) { + const remaining = globalState.timeout.increase(ms); + animateTimerProgressBar(remaining, true); + return remaining; + } + }; + + /** + * Check if timer is running. Returns true if timer is running + * or false if timer is paused or stopped. + * If `timer` parameter isn't set, returns undefined + * + * @returns {boolean} + */ + const isTimerRunning = () => { + return Boolean(globalState.timeout && globalState.timeout.isRunning()); + }; + + let bodyClickListenerAdded = false; + /** @type {Record} */ + const clickHandlers = {}; + + /** + * @this {any} + * @param {string} attr + */ + function bindClickHandler(attr = 'data-swal-template') { + clickHandlers[attr] = this; + if (!bodyClickListenerAdded) { + document.body.addEventListener('click', bodyClickListener); + bodyClickListenerAdded = true; + } + } + + /** + * @param {MouseEvent} event + */ + const bodyClickListener = event => { + for (let el = /** @type {any} */event.target; el && el !== document; el = el.parentNode) { + for (const attr in clickHandlers) { + const template = el.getAttribute && el.getAttribute(attr); + if (template) { + clickHandlers[attr].fire({ + template + }); + return; + } + } + } + }; + + // Source: https://gist.github.com/mudge/5830382?permalink_comment_id=2691957#gistcomment-2691957 + + class EventEmitter { + constructor() { + /** @type {Events} */ + this.events = {}; + } + + /** + * @param {string} eventName + * @returns {EventHandlers} + */ + _getHandlersByEventName(eventName) { + if (typeof this.events[eventName] === 'undefined') { + // not Set because we need to keep the FIFO order + // https://github.com/sweetalert2/sweetalert2/pull/2763#discussion_r1748990334 + this.events[eventName] = []; + } + return this.events[eventName]; + } + + /** + * @param {string} eventName + * @param {EventHandler} eventHandler + */ + on(eventName, eventHandler) { + const currentHandlers = this._getHandlersByEventName(eventName); + if (!currentHandlers.includes(eventHandler)) { + currentHandlers.push(eventHandler); + } + } + + /** + * @param {string} eventName + * @param {EventHandler} eventHandler + */ + once(eventName, eventHandler) { + /** + * @param {...any} args + */ + const onceFn = (...args) => { + this.removeListener(eventName, onceFn); + // @ts-ignore + eventHandler.apply(this, args); + }; + this.on(eventName, onceFn); + } + + /** + * @param {string} eventName + * @param {...any} args + */ + emit(eventName, ...args) { + this._getHandlersByEventName(eventName).forEach( + /** + * @param {EventHandler} eventHandler + */ + eventHandler => { + try { + // @ts-ignore + eventHandler.apply(this, args); + } catch (error) { + console.error(error); + } + }); + } + + /** + * @param {string} eventName + * @param {EventHandler} eventHandler + */ + removeListener(eventName, eventHandler) { + const currentHandlers = this._getHandlersByEventName(eventName); + const index = currentHandlers.indexOf(eventHandler); + if (index > -1) { + currentHandlers.splice(index, 1); + } + } + + /** + * @param {string} eventName + */ + removeAllListeners(eventName) { + if (this.events[eventName] !== undefined) { + // https://github.com/sweetalert2/sweetalert2/pull/2763#discussion_r1749239222 + this.events[eventName].length = 0; + } + } + reset() { + this.events = {}; + } + } + + globalState.eventEmitter = new EventEmitter(); + + /** + * @param {string} eventName + * @param {EventHandler} eventHandler + */ + const on = (eventName, eventHandler) => { + if (globalState.eventEmitter) { + globalState.eventEmitter.on(eventName, eventHandler); + } + }; + + /** + * @param {string} eventName + * @param {EventHandler} eventHandler + */ + const once = (eventName, eventHandler) => { + if (globalState.eventEmitter) { + globalState.eventEmitter.once(eventName, eventHandler); + } + }; + + /** + * @param {string} [eventName] + * @param {EventHandler} [eventHandler] + */ + const off = (eventName, eventHandler) => { + if (!globalState.eventEmitter) { + return; + } + + // Remove all handlers for all events + if (!eventName) { + globalState.eventEmitter.reset(); + return; + } + if (eventHandler) { + // Remove a specific handler + globalState.eventEmitter.removeListener(eventName, eventHandler); + } else { + // Remove all handlers for a specific event + globalState.eventEmitter.removeAllListeners(eventName); + } + }; + + var staticMethods = /*#__PURE__*/Object.freeze({ + __proto__: null, + argsToParams: argsToParams, + bindClickHandler: bindClickHandler, + clickCancel: clickCancel, + clickConfirm: clickConfirm, + clickDeny: clickDeny, + enableLoading: showLoading, + fire: fire, + getActions: getActions, + getCancelButton: getCancelButton, + getCloseButton: getCloseButton, + getConfirmButton: getConfirmButton, + getContainer: getContainer, + getDenyButton: getDenyButton, + getFocusableElements: getFocusableElements, + getFooter: getFooter, + getHtmlContainer: getHtmlContainer, + getIcon: getIcon, + getIconContent: getIconContent, + getImage: getImage, + getInputLabel: getInputLabel, + getLoader: getLoader, + getPopup: getPopup, + getProgressSteps: getProgressSteps, + getTimerLeft: getTimerLeft, + getTimerProgressBar: getTimerProgressBar, + getTitle: getTitle, + getValidationMessage: getValidationMessage, + increaseTimer: increaseTimer, + isDeprecatedParameter: isDeprecatedParameter, + isLoading: isLoading, + isTimerRunning: isTimerRunning, + isUpdatableParameter: isUpdatableParameter, + isValidParameter: isValidParameter, + isVisible: isVisible, + mixin: mixin, + off: off, + on: on, + once: once, + resumeTimer: resumeTimer, + showLoading: showLoading, + stopTimer: stopTimer, + toggleTimer: toggleTimer + }); + + class Timer { + /** + * @param {() => void} callback + * @param {number} delay + */ + constructor(callback, delay) { + this.callback = callback; + this.remaining = delay; + this.running = false; + this.start(); + } + + /** + * @returns {number} + */ + start() { + if (!this.running) { + this.running = true; + this.started = new Date(); + this.id = setTimeout(this.callback, this.remaining); + } + return this.remaining; + } + + /** + * @returns {number} + */ + stop() { + if (this.started && this.running) { + this.running = false; + clearTimeout(this.id); + this.remaining -= new Date().getTime() - this.started.getTime(); + } + return this.remaining; + } + + /** + * @param {number} n + * @returns {number} + */ + increase(n) { + const running = this.running; + if (running) { + this.stop(); + } + this.remaining += n; + if (running) { + this.start(); + } + return this.remaining; + } + + /** + * @returns {number} + */ + getTimerLeft() { + if (this.running) { + this.stop(); + this.start(); + } + return this.remaining; + } + + /** + * @returns {boolean} + */ + isRunning() { + return this.running; + } + } + + const swalStringParams = ['swal-title', 'swal-html', 'swal-footer']; + + /** + * @param {SweetAlertOptions} params + * @returns {SweetAlertOptions} + */ + const getTemplateParams = params => { + const template = typeof params.template === 'string' ? (/** @type {HTMLTemplateElement} */document.querySelector(params.template)) : params.template; + if (!template) { + return {}; + } + /** @type {DocumentFragment} */ + const templateContent = template.content; + showWarningsForElements(templateContent); + const result = Object.assign(getSwalParams(templateContent), getSwalFunctionParams(templateContent), getSwalButtons(templateContent), getSwalImage(templateContent), getSwalIcon(templateContent), getSwalInput(templateContent), getSwalStringParams(templateContent, swalStringParams)); + return result; + }; + + /** + * @param {DocumentFragment} templateContent + * @returns {Record} + */ + const getSwalParams = templateContent => { + /** @type {Record} */ + const result = {}; + /** @type {HTMLElement[]} */ + const swalParams = Array.from(templateContent.querySelectorAll('swal-param')); + swalParams.forEach(param => { + showWarningsForAttributes(param, ['name', 'value']); + const paramName = /** @type {keyof SweetAlertOptions} */param.getAttribute('name'); + const value = param.getAttribute('value'); + if (!paramName || !value) { + return; + } + if (paramName in defaultParams && typeof defaultParams[(/** @type {keyof typeof defaultParams} */paramName)] === 'boolean') { + result[paramName] = value !== 'false'; + } else if (paramName in defaultParams && typeof defaultParams[(/** @type {keyof typeof defaultParams} */paramName)] === 'object') { + result[paramName] = JSON.parse(value); + } else { + result[paramName] = value; + } + }); + return result; + }; + + /** + * @param {DocumentFragment} templateContent + * @returns {Record void>} + */ + const getSwalFunctionParams = templateContent => { + /** @type {Record void>} */ + const result = {}; + /** @type {HTMLElement[]} */ + const swalFunctions = Array.from(templateContent.querySelectorAll('swal-function-param')); + swalFunctions.forEach(param => { + const paramName = /** @type {keyof SweetAlertOptions} */param.getAttribute('name'); + const value = param.getAttribute('value'); + if (!paramName || !value) { + return; + } + result[paramName] = new Function(`return ${value}`)(); + }); + return result; + }; + + /** + * @param {DocumentFragment} templateContent + * @returns {Record} + */ + const getSwalButtons = templateContent => { + /** @type {Record} */ + const result = {}; + /** @type {HTMLElement[]} */ + const swalButtons = Array.from(templateContent.querySelectorAll('swal-button')); + swalButtons.forEach(button => { + showWarningsForAttributes(button, ['type', 'color', 'aria-label']); + const type = button.getAttribute('type'); + if (!type || !['confirm', 'cancel', 'deny'].includes(type)) { + return; + } + result[`${type}ButtonText`] = button.innerHTML; + result[`show${capitalizeFirstLetter(type)}Button`] = true; + if (button.hasAttribute('color')) { + const color = button.getAttribute('color'); + if (color !== null) { + result[`${type}ButtonColor`] = color; + } + } + if (button.hasAttribute('aria-label')) { + const ariaLabel = button.getAttribute('aria-label'); + if (ariaLabel !== null) { + result[`${type}ButtonAriaLabel`] = ariaLabel; + } + } + }); + return result; + }; + + /** + * @param {DocumentFragment} templateContent + * @returns {Pick} + */ + const getSwalImage = templateContent => { + const result = {}; + /** @type {HTMLElement | null} */ + const image = templateContent.querySelector('swal-image'); + if (image) { + showWarningsForAttributes(image, ['src', 'width', 'height', 'alt']); + if (image.hasAttribute('src')) { + result.imageUrl = image.getAttribute('src') || undefined; + } + if (image.hasAttribute('width')) { + result.imageWidth = image.getAttribute('width') || undefined; + } + if (image.hasAttribute('height')) { + result.imageHeight = image.getAttribute('height') || undefined; + } + if (image.hasAttribute('alt')) { + result.imageAlt = image.getAttribute('alt') || undefined; + } + } + return result; + }; + + /** + * @param {DocumentFragment} templateContent + * @returns {object} + */ + const getSwalIcon = templateContent => { + const result = {}; + /** @type {HTMLElement | null} */ + const icon = templateContent.querySelector('swal-icon'); + if (icon) { + showWarningsForAttributes(icon, ['type', 'color']); + if (icon.hasAttribute('type')) { + result.icon = icon.getAttribute('type'); + } + if (icon.hasAttribute('color')) { + result.iconColor = icon.getAttribute('color'); + } + result.iconHtml = icon.innerHTML; + } + return result; + }; + + /** + * @param {DocumentFragment} templateContent + * @returns {object} + */ + const getSwalInput = templateContent => { + /** @type {Record} */ + const result = {}; + /** @type {HTMLElement | null} */ + const input = templateContent.querySelector('swal-input'); + if (input) { + showWarningsForAttributes(input, ['type', 'label', 'placeholder', 'value']); + result.input = input.getAttribute('type') || 'text'; + if (input.hasAttribute('label')) { + result.inputLabel = input.getAttribute('label'); + } + if (input.hasAttribute('placeholder')) { + result.inputPlaceholder = input.getAttribute('placeholder'); + } + if (input.hasAttribute('value')) { + result.inputValue = input.getAttribute('value'); + } + } + /** @type {HTMLElement[]} */ + const inputOptions = Array.from(templateContent.querySelectorAll('swal-input-option')); + if (inputOptions.length) { + result.inputOptions = {}; + inputOptions.forEach(option => { + showWarningsForAttributes(option, ['value']); + const optionValue = option.getAttribute('value'); + if (!optionValue) { + return; + } + const optionName = option.innerHTML; + result.inputOptions[optionValue] = optionName; + }); + } + return result; + }; + + /** + * @param {DocumentFragment} templateContent + * @param {string[]} paramNames + * @returns {Record} + */ + const getSwalStringParams = (templateContent, paramNames) => { + /** @type {Record} */ + const result = {}; + for (const i in paramNames) { + const paramName = paramNames[i]; + /** @type {HTMLElement | null} */ + const tag = templateContent.querySelector(paramName); + if (tag) { + showWarningsForAttributes(tag, []); + result[paramName.replace(/^swal-/, '')] = tag.innerHTML.trim(); + } + } + return result; + }; + + /** + * @param {DocumentFragment} templateContent + */ + const showWarningsForElements = templateContent => { + const allowedElements = swalStringParams.concat(['swal-param', 'swal-function-param', 'swal-button', 'swal-image', 'swal-icon', 'swal-input', 'swal-input-option']); + Array.from(templateContent.children).forEach(el => { + const tagName = el.tagName.toLowerCase(); + if (!allowedElements.includes(tagName)) { + warn(`Unrecognized element <${tagName}>`); + } + }); + }; + + /** + * @param {HTMLElement} el + * @param {string[]} allowedAttributes + */ + const showWarningsForAttributes = (el, allowedAttributes) => { + Array.from(el.attributes).forEach(attribute => { + if (allowedAttributes.indexOf(attribute.name) === -1) { + warn([`Unrecognized attribute "${attribute.name}" on <${el.tagName.toLowerCase()}>.`, `${allowedAttributes.length ? `Allowed attributes are: ${allowedAttributes.join(', ')}` : 'To set the value, use HTML within the element.'}`]); + } + }); + }; + + const SHOW_CLASS_TIMEOUT = 10; + + /** + * Open popup, add necessary classes and styles, fix scrollbar + * + * @param {SweetAlertOptions} params + */ + const openPopup = params => { + var _globalState$eventEmi, _globalState$eventEmi2; + const container = getContainer(); + const popup = getPopup(); + if (!container || !popup) { + return; + } + if (typeof params.willOpen === 'function') { + params.willOpen(popup); + } + (_globalState$eventEmi = globalState.eventEmitter) === null || _globalState$eventEmi === void 0 || _globalState$eventEmi.emit('willOpen', popup); + const bodyStyles = window.getComputedStyle(document.body); + const initialBodyOverflow = bodyStyles.overflowY; + addClasses(container, popup, params); + + // scrolling is 'hidden' until animation is done, after that 'auto' + setTimeout(() => { + setScrollingVisibility(container, popup); + }, SHOW_CLASS_TIMEOUT); + if (isModal()) { + // Using ternary instead of ?? operator for Webpack 4 compatibility + fixScrollContainer(container, params.scrollbarPadding !== undefined ? params.scrollbarPadding : false, initialBodyOverflow); + setAriaHidden(); + } + if (!isToast() && !globalState.previousActiveElement) { + globalState.previousActiveElement = document.activeElement; + } + if (typeof params.didOpen === 'function') { + const didOpen = params.didOpen; + setTimeout(() => didOpen(popup)); + } + (_globalState$eventEmi2 = globalState.eventEmitter) === null || _globalState$eventEmi2 === void 0 || _globalState$eventEmi2.emit('didOpen', popup); + }; + + /** + * @param {Event} event + */ + const swalOpenAnimationFinished = event => { + const popup = getPopup(); + if (!popup || event.target !== popup) { + return; + } + const container = getContainer(); + if (!container) { + return; + } + popup.removeEventListener('animationend', swalOpenAnimationFinished); + popup.removeEventListener('transitionend', swalOpenAnimationFinished); + container.style.overflowY = 'auto'; + + // no-transition is added in init() in case one swal is opened right after another + removeClass(container, swalClasses['no-transition']); + }; + + /** + * @param {HTMLElement} container + * @param {HTMLElement} popup + */ + const setScrollingVisibility = (container, popup) => { + if (hasCssAnimation(popup)) { + container.style.overflowY = 'hidden'; + popup.addEventListener('animationend', swalOpenAnimationFinished); + popup.addEventListener('transitionend', swalOpenAnimationFinished); + } else { + container.style.overflowY = 'auto'; + } + }; + + /** + * @param {HTMLElement} container + * @param {boolean} scrollbarPadding + * @param {string} initialBodyOverflow + */ + const fixScrollContainer = (container, scrollbarPadding, initialBodyOverflow) => { + iOSfix(); + if (scrollbarPadding && initialBodyOverflow !== 'hidden') { + replaceScrollbarWithPadding(initialBodyOverflow); + } + + // sweetalert2/issues/1247 + setTimeout(() => { + container.scrollTop = 0; + }); + }; + + /** + * @param {HTMLElement} container + * @param {HTMLElement} popup + * @param {SweetAlertOptions} params + */ + const addClasses = (container, popup, params) => { + var _params$showClass; + if ((_params$showClass = params.showClass) !== null && _params$showClass !== void 0 && _params$showClass.backdrop) { + addClass(container, params.showClass.backdrop); + } + if (params.animation) { + // this workaround with opacity is needed for https://github.com/sweetalert2/sweetalert2/issues/2059 + popup.style.setProperty('opacity', '0', 'important'); + show(popup, 'grid'); + setTimeout(() => { + var _params$showClass2; + // Animate popup right after showing it + if ((_params$showClass2 = params.showClass) !== null && _params$showClass2 !== void 0 && _params$showClass2.popup) { + addClass(popup, params.showClass.popup); + } + // and remove the opacity workaround + popup.style.removeProperty('opacity'); + }, SHOW_CLASS_TIMEOUT); // 10ms in order to fix #2062 + } else { + show(popup, 'grid'); + } + addClass([document.documentElement, document.body], swalClasses.shown); + if (params.heightAuto && params.backdrop && !params.toast) { + addClass([document.documentElement, document.body], swalClasses['height-auto']); + } + }; + + var defaultInputValidators = { + /** + * @param {string} string + * @param {string} [validationMessage] + * @returns {Promise} + */ + email: (string, validationMessage) => { + return /^[a-zA-Z0-9.+_'-]+@[a-zA-Z0-9.-]+\.[a-zA-Z0-9-]+$/.test(string) ? Promise.resolve() : Promise.resolve(validationMessage || 'Invalid email address'); + }, + /** + * @param {string} string + * @param {string} [validationMessage] + * @returns {Promise} + */ + url: (string, validationMessage) => { + // taken from https://stackoverflow.com/a/3809435 with a small change from #1306 and #2013 + return /^https?:\/\/(www\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\.[a-z]{2,63}\b([-a-zA-Z0-9@:%_+.~#?&/=]*)$/.test(string) ? Promise.resolve() : Promise.resolve(validationMessage || 'Invalid URL'); + } + }; + + /** + * @param {SweetAlertOptions} params + */ + function setDefaultInputValidators(params) { + // Use default `inputValidator` for supported input types if not provided + if (params.inputValidator) { + return; + } + if (params.input === 'email') { + params.inputValidator = defaultInputValidators['email']; + } + if (params.input === 'url') { + params.inputValidator = defaultInputValidators['url']; + } + } + + /** + * @param {SweetAlertOptions} params + */ + function validateCustomTargetElement(params) { + // Determine if the custom target element is valid + if (!params.target || typeof params.target === 'string' && !document.querySelector(params.target) || typeof params.target !== 'string' && !params.target.appendChild) { + warn('Target parameter is not valid, defaulting to "body"'); + params.target = 'body'; + } + } + + /** + * Set type, text and actions on popup + * + * @param {SweetAlertOptions} params + */ + function setParameters(params) { + setDefaultInputValidators(params); + + // showLoaderOnConfirm && preConfirm + if (params.showLoaderOnConfirm && !params.preConfirm) { + warn('showLoaderOnConfirm is set to true, but preConfirm is not defined.\n' + 'showLoaderOnConfirm should be used together with preConfirm, see usage example:\n' + 'https://sweetalert2.github.io/#ajax-request'); + } + validateCustomTargetElement(params); + + // Replace newlines with
                  in title + if (typeof params.title === 'string') { + params.title = params.title.split('\n').join('
                  '); + } + init(params); + } + + /** @type {SweetAlert} */ + let currentInstance; + var _promise = /*#__PURE__*/new WeakMap(); + class SweetAlert { + /** + * @param {...(SweetAlertOptions | string)} args + * @this {SweetAlert} + */ + constructor(...args) { + /** + * @type {Promise} + */ + _classPrivateFieldInitSpec(this, _promise, /** @type {Promise} */Promise.resolve({ + isConfirmed: false, + isDenied: false, + isDismissed: true + })); + // Prevent run in Node env + if (typeof window === 'undefined') { + return; + } + currentInstance = this; + + // @ts-ignore + const outerParams = Object.freeze(this.constructor.argsToParams(args)); + + /** @type {Readonly} */ + this.params = outerParams; + + /** @type {boolean} */ + this.isAwaitingPromise = false; + _classPrivateFieldSet2(_promise, this, this._main(currentInstance.params)); + } + + /** + * @param {any} userParams + * @param {any} mixinParams + */ + _main(userParams, mixinParams = {}) { + showWarningsForParams(Object.assign({}, mixinParams, userParams)); + if (globalState.currentInstance) { + const swalPromiseResolve = privateMethods.swalPromiseResolve.get(globalState.currentInstance); + const { + isAwaitingPromise + } = globalState.currentInstance; + globalState.currentInstance._destroy(); + if (!isAwaitingPromise) { + swalPromiseResolve({ + isDismissed: true + }); + } + if (isModal()) { + unsetAriaHidden(); + } + } + globalState.currentInstance = currentInstance; + const innerParams = prepareParams(userParams, mixinParams); + setParameters(innerParams); + Object.freeze(innerParams); + + // clear the previous timer + if (globalState.timeout) { + globalState.timeout.stop(); + delete globalState.timeout; + } + + // clear the restore focus timeout + clearTimeout(globalState.restoreFocusTimeout); + const domCache = populateDomCache(currentInstance); + render(currentInstance, innerParams); + privateProps.innerParams.set(currentInstance, innerParams); + return swalPromise(currentInstance, domCache, innerParams); + } + + // `catch` cannot be the name of a module export, so we define our thenable methods here instead + /** + * @param {any} onFulfilled + */ + then(onFulfilled) { + return _classPrivateFieldGet2(_promise, this).then(onFulfilled); + } + + /** + * @param {any} onFinally + */ + finally(onFinally) { + return _classPrivateFieldGet2(_promise, this).finally(onFinally); + } + } + + /** + * @param {SweetAlert} instance + * @param {DomCache} domCache + * @param {SweetAlertOptions} innerParams + * @returns {Promise} + */ + const swalPromise = (instance, domCache, innerParams) => { + return new Promise((resolve, reject) => { + // functions to handle all closings/dismissals + /** + * @param {DismissReason} dismiss + */ + const dismissWith = dismiss => { + instance.close({ + isDismissed: true, + dismiss, + isConfirmed: false, + isDenied: false + }); + }; + privateMethods.swalPromiseResolve.set(instance, resolve); + privateMethods.swalPromiseReject.set(instance, reject); + domCache.confirmButton.onclick = () => { + handleConfirmButtonClick(instance); + }; + domCache.denyButton.onclick = () => { + handleDenyButtonClick(instance); + }; + domCache.cancelButton.onclick = () => { + handleCancelButtonClick(instance, dismissWith); + }; + domCache.closeButton.onclick = () => { + dismissWith(DismissReason.close); + }; + handlePopupClick(innerParams, domCache, dismissWith); + addKeydownHandler(globalState, innerParams, dismissWith); + handleInputOptionsAndValue(instance, innerParams); + openPopup(innerParams); + setupTimer(globalState, innerParams, dismissWith); + initFocus(domCache, innerParams); + + // Scroll container to top on open (#1247, #1946) + setTimeout(() => { + domCache.container.scrollTop = 0; + }); + }); + }; + + /** + * @param {SweetAlertOptions} userParams + * @param {SweetAlertOptions} mixinParams + * @returns {SweetAlertOptions} + */ + const prepareParams = (userParams, mixinParams) => { + const templateParams = getTemplateParams(userParams); + const params = Object.assign({}, defaultParams, mixinParams, templateParams, userParams); // precedence is described in #2131 + params.showClass = Object.assign({}, defaultParams.showClass, params.showClass); + params.hideClass = Object.assign({}, defaultParams.hideClass, params.hideClass); + if (params.animation === false) { + params.showClass = { + backdrop: 'swal2-noanimation' + }; + params.hideClass = {}; + } + return params; + }; + + /** + * @param {SweetAlert} instance + * @returns {DomCache} + */ + const populateDomCache = instance => { + const domCache = /** @type {DomCache} */{ + popup: (/** @type {HTMLElement} */getPopup()), + container: (/** @type {HTMLElement} */getContainer()), + actions: (/** @type {HTMLElement} */getActions()), + confirmButton: (/** @type {HTMLElement} */getConfirmButton()), + denyButton: (/** @type {HTMLElement} */getDenyButton()), + cancelButton: (/** @type {HTMLElement} */getCancelButton()), + loader: (/** @type {HTMLElement} */getLoader()), + closeButton: (/** @type {HTMLElement} */getCloseButton()), + validationMessage: (/** @type {HTMLElement} */getValidationMessage()), + progressSteps: (/** @type {HTMLElement} */getProgressSteps()) + }; + privateProps.domCache.set(instance, domCache); + return domCache; + }; + + /** + * @param {GlobalState} globalState + * @param {SweetAlertOptions} innerParams + * @param {(dismiss: DismissReason) => void} dismissWith + */ + const setupTimer = (globalState, innerParams, dismissWith) => { + const timerProgressBar = getTimerProgressBar(); + hide(timerProgressBar); + if (innerParams.timer) { + globalState.timeout = new Timer(() => { + dismissWith('timer'); + delete globalState.timeout; + }, innerParams.timer); + if (innerParams.timerProgressBar && timerProgressBar) { + show(timerProgressBar); + applyCustomClass(timerProgressBar, innerParams, 'timerProgressBar'); + setTimeout(() => { + if (globalState.timeout && globalState.timeout.running) { + // timer can be already stopped or unset at this point + animateTimerProgressBar(/** @type {number} */innerParams.timer); + } + }); + } + } + }; + + /** + * Initialize focus in the popup: + * + * 1. If `toast` is `true`, don't steal focus from the document. + * 2. Else if there is an [autofocus] element, focus it. + * 3. Else if `focusConfirm` is `true` and confirm button is visible, focus it. + * 4. Else if `focusDeny` is `true` and deny button is visible, focus it. + * 5. Else if `focusCancel` is `true` and cancel button is visible, focus it. + * 6. Else focus the first focusable element in a popup (if any). + * + * @param {DomCache} domCache + * @param {SweetAlertOptions} innerParams + */ + const initFocus = (domCache, innerParams) => { + if (innerParams.toast) { + return; + } + // TODO: this is dumb, remove `allowEnterKey` param in the next major version + if (!callIfFunction(innerParams.allowEnterKey)) { + warnAboutDeprecation('allowEnterKey'); + blurActiveElement(); + return; + } + if (focusAutofocus(domCache)) { + return; + } + if (focusButton(domCache, innerParams)) { + return; + } + setFocus(-1, 1); + }; + + /** + * @param {DomCache} domCache + * @returns {boolean} + */ + const focusAutofocus = domCache => { + const autofocusElements = Array.from(domCache.popup.querySelectorAll('[autofocus]')); + for (const autofocusElement of autofocusElements) { + if (autofocusElement instanceof HTMLElement && isVisible$1(autofocusElement)) { + autofocusElement.focus(); + return true; + } + } + return false; + }; + + /** + * @param {DomCache} domCache + * @param {SweetAlertOptions} innerParams + * @returns {boolean} + */ + const focusButton = (domCache, innerParams) => { + if (innerParams.focusDeny && isVisible$1(domCache.denyButton)) { + domCache.denyButton.focus(); + return true; + } + if (innerParams.focusCancel && isVisible$1(domCache.cancelButton)) { + domCache.cancelButton.focus(); + return true; + } + if (innerParams.focusConfirm && isVisible$1(domCache.confirmButton)) { + domCache.confirmButton.focus(); + return true; + } + return false; + }; + const blurActiveElement = () => { + if (document.activeElement instanceof HTMLElement && typeof document.activeElement.blur === 'function') { + document.activeElement.blur(); + } + }; + + // Assign instance methods from src/instanceMethods/*.js to prototype + SweetAlert.prototype.disableButtons = disableButtons; + SweetAlert.prototype.enableButtons = enableButtons; + SweetAlert.prototype.getInput = getInput; + SweetAlert.prototype.disableInput = disableInput; + SweetAlert.prototype.enableInput = enableInput; + SweetAlert.prototype.hideLoading = hideLoading; + SweetAlert.prototype.disableLoading = hideLoading; + SweetAlert.prototype.showValidationMessage = showValidationMessage; + SweetAlert.prototype.resetValidationMessage = resetValidationMessage; + SweetAlert.prototype.close = close; + SweetAlert.prototype.closePopup = close; + SweetAlert.prototype.closeModal = close; + SweetAlert.prototype.closeToast = close; + SweetAlert.prototype.rejectPromise = rejectPromise; + SweetAlert.prototype.update = update; + SweetAlert.prototype._destroy = _destroy; + + // Assign static methods from src/staticMethods/*.js to constructor + Object.assign(SweetAlert, staticMethods); + + // Proxy to instance methods to constructor, for now, for backwards compatibility + Object.keys(instanceMethods).forEach(key => { + /** + * @param {...(SweetAlertOptions | string | undefined)} args + * @returns {SweetAlertResult | Promise | undefined} + */ + // @ts-ignore: Dynamic property assignment for backwards compatibility + SweetAlert[key] = function (...args) { + // @ts-ignore + if (currentInstance && currentInstance[key]) { + // @ts-ignore + return currentInstance[key](...args); + } + return undefined; + }; + }); + SweetAlert.DismissReason = DismissReason; + SweetAlert.version = '11.26.18'; + + const Swal = SweetAlert; + // @ts-ignore + Swal.default = Swal; + + return Swal; + +})); +if (typeof this !== 'undefined' && this.Sweetalert2){this.swal = this.sweetAlert = this.Swal = this.SweetAlert = this.Sweetalert2} diff --git a/public/assets/sweetalert2/dist/sweetalert2.min.css b/public/assets/sweetalert2/dist/sweetalert2.min.css new file mode 100644 index 0000000..d760784 --- /dev/null +++ b/public/assets/sweetalert2/dist/sweetalert2.min.css @@ -0,0 +1 @@ +:root{--swal2-outline: 0 0 0 3px rgba(100, 150, 200, 0.5);--swal2-container-padding: 0.625em;--swal2-backdrop: rgba(0, 0, 0, 0.4);--swal2-backdrop-transition: background-color 0.15s;--swal2-width: 32em;--swal2-padding: 0 0 1.25em;--swal2-border: none;--swal2-border-radius: 0.3125rem;--swal2-background: white;--swal2-color: #545454;--swal2-show-animation: swal2-show 0.3s;--swal2-hide-animation: swal2-hide 0.15s forwards;--swal2-icon-zoom: 1;--swal2-icon-animations: true;--swal2-title-padding: 0.8em 1em 0;--swal2-html-container-padding: 1em 1.6em 0.3em;--swal2-input-border: 1px solid #d9d9d9;--swal2-input-border-radius: 0.1875em;--swal2-input-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.06), 0 0 0 3px transparent;--swal2-input-background: transparent;--swal2-input-transition: border-color 0.2s, box-shadow 0.2s;--swal2-input-hover-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.06), 0 0 0 3px transparent;--swal2-input-focus-border: 1px solid #b4dbed;--swal2-input-focus-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.06), 0 0 0 3px rgba(100, 150, 200, 0.5);--swal2-progress-step-background: #add8e6;--swal2-validation-message-background: #f0f0f0;--swal2-validation-message-color: #666;--swal2-footer-border-color: #eee;--swal2-footer-background: transparent;--swal2-footer-color: inherit;--swal2-timer-progress-bar-background: rgba(0, 0, 0, 0.3);--swal2-close-button-position: initial;--swal2-close-button-inset: auto;--swal2-close-button-font-size: 2.5em;--swal2-close-button-color: #ccc;--swal2-close-button-transition: color 0.2s, box-shadow 0.2s;--swal2-close-button-outline: initial;--swal2-close-button-box-shadow: inset 0 0 0 3px transparent;--swal2-close-button-focus-box-shadow: inset var(--swal2-outline);--swal2-close-button-hover-transform: none;--swal2-actions-justify-content: center;--swal2-actions-width: auto;--swal2-actions-margin: 1.25em auto 0;--swal2-actions-padding: 0;--swal2-actions-border-radius: 0;--swal2-actions-background: transparent;--swal2-action-button-transition: background-color 0.2s, box-shadow 0.2s;--swal2-action-button-hover: black 10%;--swal2-action-button-active: black 10%;--swal2-confirm-button-box-shadow: none;--swal2-confirm-button-border-radius: 0.25em;--swal2-confirm-button-background-color: #7066e0;--swal2-confirm-button-color: #fff;--swal2-deny-button-box-shadow: none;--swal2-deny-button-border-radius: 0.25em;--swal2-deny-button-background-color: #dc3741;--swal2-deny-button-color: #fff;--swal2-cancel-button-box-shadow: none;--swal2-cancel-button-border-radius: 0.25em;--swal2-cancel-button-background-color: #6e7881;--swal2-cancel-button-color: #fff;--swal2-toast-show-animation: swal2-toast-show 0.5s;--swal2-toast-hide-animation: swal2-toast-hide 0.1s forwards;--swal2-toast-border: none;--swal2-toast-box-shadow: 0 0 1px hsl(0deg 0% 0% / 0.075), 0 1px 2px hsl(0deg 0% 0% / 0.075), 1px 2px 4px hsl(0deg 0% 0% / 0.075), 1px 3px 8px hsl(0deg 0% 0% / 0.075), 2px 4px 16px hsl(0deg 0% 0% / 0.075)}[data-swal2-theme=dark]{--swal2-dark-theme-black: #19191a;--swal2-dark-theme-white: #e1e1e1;--swal2-background: var(--swal2-dark-theme-black);--swal2-color: var(--swal2-dark-theme-white);--swal2-footer-border-color: #555;--swal2-input-background: color-mix(in srgb, var(--swal2-dark-theme-black), var(--swal2-dark-theme-white) 10%);--swal2-validation-message-background: color-mix( in srgb, var(--swal2-dark-theme-black), var(--swal2-dark-theme-white) 10% );--swal2-validation-message-color: var(--swal2-dark-theme-white);--swal2-timer-progress-bar-background: rgba(255, 255, 255, 0.7)}@media(prefers-color-scheme: dark){[data-swal2-theme=auto]{--swal2-dark-theme-black: #19191a;--swal2-dark-theme-white: #e1e1e1;--swal2-background: var(--swal2-dark-theme-black);--swal2-color: var(--swal2-dark-theme-white);--swal2-footer-border-color: #555;--swal2-input-background: color-mix(in srgb, var(--swal2-dark-theme-black), var(--swal2-dark-theme-white) 10%);--swal2-validation-message-background: color-mix( in srgb, var(--swal2-dark-theme-black), var(--swal2-dark-theme-white) 10% );--swal2-validation-message-color: var(--swal2-dark-theme-white);--swal2-timer-progress-bar-background: rgba(255, 255, 255, 0.7)}}body.swal2-shown:not(.swal2-no-backdrop,.swal2-toast-shown){overflow:hidden}body.swal2-height-auto{height:auto !important}body.swal2-no-backdrop .swal2-container{background-color:rgba(0,0,0,0) !important;pointer-events:none}body.swal2-no-backdrop .swal2-container .swal2-popup{pointer-events:all}body.swal2-no-backdrop .swal2-container .swal2-modal{box-shadow:0 0 10px var(--swal2-backdrop)}body.swal2-toast-shown .swal2-container{box-sizing:border-box;width:360px;max-width:100%;background-color:rgba(0,0,0,0);pointer-events:none}body.swal2-toast-shown .swal2-container.swal2-top{inset:0 auto auto 50%;transform:translateX(-50%)}body.swal2-toast-shown .swal2-container.swal2-top-end,body.swal2-toast-shown .swal2-container.swal2-top-right{inset:0 0 auto auto}body.swal2-toast-shown .swal2-container.swal2-top-start,body.swal2-toast-shown .swal2-container.swal2-top-left{inset:0 auto auto 0}body.swal2-toast-shown .swal2-container.swal2-center-start,body.swal2-toast-shown .swal2-container.swal2-center-left{inset:50% auto auto 0;transform:translateY(-50%)}body.swal2-toast-shown .swal2-container.swal2-center{inset:50% auto auto 50%;transform:translate(-50%, -50%)}body.swal2-toast-shown .swal2-container.swal2-center-end,body.swal2-toast-shown .swal2-container.swal2-center-right{inset:50% 0 auto auto;transform:translateY(-50%)}body.swal2-toast-shown .swal2-container.swal2-bottom-start,body.swal2-toast-shown .swal2-container.swal2-bottom-left{inset:auto auto 0 0}body.swal2-toast-shown .swal2-container.swal2-bottom{inset:auto auto 0 50%;transform:translateX(-50%)}body.swal2-toast-shown .swal2-container.swal2-bottom-end,body.swal2-toast-shown .swal2-container.swal2-bottom-right{inset:auto 0 0 auto}@media print{body.swal2-shown:not(.swal2-no-backdrop,.swal2-toast-shown){overflow-y:scroll !important}body.swal2-shown:not(.swal2-no-backdrop,.swal2-toast-shown)>[aria-hidden=true]{display:none}body.swal2-shown:not(.swal2-no-backdrop,.swal2-toast-shown) .swal2-container{position:static !important}}div:where(.swal2-container){display:grid;position:fixed;z-index:1060;inset:0;box-sizing:border-box;grid-template-areas:"top-start top top-end" "center-start center center-end" "bottom-start bottom-center bottom-end";grid-template-rows:minmax(min-content, auto) minmax(min-content, auto) minmax(min-content, auto);height:100%;padding:var(--swal2-container-padding);overflow-x:hidden;transition:var(--swal2-backdrop-transition);-webkit-overflow-scrolling:touch}div:where(.swal2-container).swal2-backdrop-show,div:where(.swal2-container).swal2-noanimation{background:var(--swal2-backdrop)}div:where(.swal2-container).swal2-backdrop-hide{background:rgba(0,0,0,0) !important}div:where(.swal2-container).swal2-top-start,div:where(.swal2-container).swal2-center-start,div:where(.swal2-container).swal2-bottom-start{grid-template-columns:minmax(0, 1fr) auto auto}div:where(.swal2-container).swal2-top,div:where(.swal2-container).swal2-center,div:where(.swal2-container).swal2-bottom{grid-template-columns:auto minmax(0, 1fr) auto}div:where(.swal2-container).swal2-top-end,div:where(.swal2-container).swal2-center-end,div:where(.swal2-container).swal2-bottom-end{grid-template-columns:auto auto minmax(0, 1fr)}div:where(.swal2-container).swal2-top-start>.swal2-popup{align-self:start}div:where(.swal2-container).swal2-top>.swal2-popup{grid-column:2;place-self:start center}div:where(.swal2-container).swal2-top-end>.swal2-popup,div:where(.swal2-container).swal2-top-right>.swal2-popup{grid-column:3;place-self:start end}div:where(.swal2-container).swal2-center-start>.swal2-popup,div:where(.swal2-container).swal2-center-left>.swal2-popup{grid-row:2;align-self:center}div:where(.swal2-container).swal2-center>.swal2-popup{grid-column:2;grid-row:2;place-self:center center}div:where(.swal2-container).swal2-center-end>.swal2-popup,div:where(.swal2-container).swal2-center-right>.swal2-popup{grid-column:3;grid-row:2;place-self:center end}div:where(.swal2-container).swal2-bottom-start>.swal2-popup,div:where(.swal2-container).swal2-bottom-left>.swal2-popup{grid-column:1;grid-row:3;align-self:end}div:where(.swal2-container).swal2-bottom>.swal2-popup{grid-column:2;grid-row:3;place-self:end center}div:where(.swal2-container).swal2-bottom-end>.swal2-popup,div:where(.swal2-container).swal2-bottom-right>.swal2-popup{grid-column:3;grid-row:3;place-self:end end}div:where(.swal2-container).swal2-grow-row>.swal2-popup,div:where(.swal2-container).swal2-grow-fullscreen>.swal2-popup{grid-column:1/4;width:100%}div:where(.swal2-container).swal2-grow-column>.swal2-popup,div:where(.swal2-container).swal2-grow-fullscreen>.swal2-popup{grid-row:1/4;align-self:stretch}div:where(.swal2-container).swal2-no-transition{transition:none !important}div:where(.swal2-container)[popover]{width:auto;border:0}div:where(.swal2-container) div:where(.swal2-popup){display:none;position:relative;box-sizing:border-box;grid-template-columns:minmax(0, 100%);width:var(--swal2-width);max-width:100%;padding:var(--swal2-padding);border:var(--swal2-border);border-radius:var(--swal2-border-radius);background:var(--swal2-background);color:var(--swal2-color);font-family:inherit;font-size:1rem;container-name:swal2-popup}div:where(.swal2-container) div:where(.swal2-popup):focus{outline:none}div:where(.swal2-container) div:where(.swal2-popup).swal2-loading{overflow-y:hidden}div:where(.swal2-container) div:where(.swal2-popup).swal2-draggable{cursor:grab}div:where(.swal2-container) div:where(.swal2-popup).swal2-draggable div:where(.swal2-icon){cursor:grab}div:where(.swal2-container) div:where(.swal2-popup).swal2-dragging{cursor:grabbing}div:where(.swal2-container) div:where(.swal2-popup).swal2-dragging div:where(.swal2-icon){cursor:grabbing}div:where(.swal2-container) h2:where(.swal2-title){position:relative;max-width:100%;margin:0;padding:var(--swal2-title-padding);color:inherit;font-size:1.875em;font-weight:600;text-align:center;text-transform:none;overflow-wrap:break-word;cursor:initial}div:where(.swal2-container) div:where(.swal2-actions){display:flex;z-index:1;box-sizing:border-box;flex-wrap:wrap;align-items:center;justify-content:var(--swal2-actions-justify-content);width:var(--swal2-actions-width);margin:var(--swal2-actions-margin);padding:var(--swal2-actions-padding);border-radius:var(--swal2-actions-border-radius);background:var(--swal2-actions-background)}div:where(.swal2-container) div:where(.swal2-loader){display:none;align-items:center;justify-content:center;width:2.2em;height:2.2em;margin:0 1.875em;animation:swal2-rotate-loading 1.5s linear 0s infinite normal;border-width:.25em;border-style:solid;border-radius:100%;border-color:#2778c4 rgba(0,0,0,0) #2778c4 rgba(0,0,0,0)}div:where(.swal2-container) button:where(.swal2-styled){margin:.3125em;padding:.625em 1.1em;transition:var(--swal2-action-button-transition);border:none;box-shadow:0 0 0 3px rgba(0,0,0,0);font-weight:500}div:where(.swal2-container) button:where(.swal2-styled):not([disabled]){cursor:pointer}div:where(.swal2-container) button:where(.swal2-styled):where(.swal2-confirm){border-radius:var(--swal2-confirm-button-border-radius);background:initial;background-color:var(--swal2-confirm-button-background-color);box-shadow:var(--swal2-confirm-button-box-shadow);color:var(--swal2-confirm-button-color);font-size:1em}div:where(.swal2-container) button:where(.swal2-styled):where(.swal2-confirm):hover{background-color:color-mix(in srgb, var(--swal2-confirm-button-background-color), var(--swal2-action-button-hover))}div:where(.swal2-container) button:where(.swal2-styled):where(.swal2-confirm):active{background-color:color-mix(in srgb, var(--swal2-confirm-button-background-color), var(--swal2-action-button-active))}div:where(.swal2-container) button:where(.swal2-styled):where(.swal2-deny){border-radius:var(--swal2-deny-button-border-radius);background:initial;background-color:var(--swal2-deny-button-background-color);box-shadow:var(--swal2-deny-button-box-shadow);color:var(--swal2-deny-button-color);font-size:1em}div:where(.swal2-container) button:where(.swal2-styled):where(.swal2-deny):hover{background-color:color-mix(in srgb, var(--swal2-deny-button-background-color), var(--swal2-action-button-hover))}div:where(.swal2-container) button:where(.swal2-styled):where(.swal2-deny):active{background-color:color-mix(in srgb, var(--swal2-deny-button-background-color), var(--swal2-action-button-active))}div:where(.swal2-container) button:where(.swal2-styled):where(.swal2-cancel){border-radius:var(--swal2-cancel-button-border-radius);background:initial;background-color:var(--swal2-cancel-button-background-color);box-shadow:var(--swal2-cancel-button-box-shadow);color:var(--swal2-cancel-button-color);font-size:1em}div:where(.swal2-container) button:where(.swal2-styled):where(.swal2-cancel):hover{background-color:color-mix(in srgb, var(--swal2-cancel-button-background-color), var(--swal2-action-button-hover))}div:where(.swal2-container) button:where(.swal2-styled):where(.swal2-cancel):active{background-color:color-mix(in srgb, var(--swal2-cancel-button-background-color), var(--swal2-action-button-active))}div:where(.swal2-container) button:where(.swal2-styled):focus-visible{outline:none;box-shadow:var(--swal2-action-button-focus-box-shadow)}div:where(.swal2-container) button:where(.swal2-styled)[disabled]:not(.swal2-loading){opacity:.4}div:where(.swal2-container) button:where(.swal2-styled)::-moz-focus-inner{border:0}div:where(.swal2-container) div:where(.swal2-footer){margin:1em 0 0;padding:1em 1em 0;border-top:1px solid var(--swal2-footer-border-color);background:var(--swal2-footer-background);color:var(--swal2-footer-color);font-size:1em;text-align:center;cursor:initial}div:where(.swal2-container) .swal2-timer-progress-bar-container{position:absolute;right:0;bottom:0;left:0;grid-column:auto !important;overflow:hidden;border-bottom-right-radius:var(--swal2-border-radius);border-bottom-left-radius:var(--swal2-border-radius)}div:where(.swal2-container) div:where(.swal2-timer-progress-bar){width:100%;height:.25em;background:var(--swal2-timer-progress-bar-background)}div:where(.swal2-container) img:where(.swal2-image){max-width:100%;margin:2em auto 1em;cursor:initial}div:where(.swal2-container) button:where(.swal2-close){position:var(--swal2-close-button-position);inset:var(--swal2-close-button-inset);z-index:2;align-items:center;justify-content:center;width:1.2em;height:1.2em;margin-top:0;margin-right:0;margin-bottom:-1.2em;padding:0;overflow:hidden;transition:var(--swal2-close-button-transition);border:none;border-radius:var(--swal2-border-radius);outline:var(--swal2-close-button-outline);background:rgba(0,0,0,0);color:var(--swal2-close-button-color);font-family:monospace;font-size:var(--swal2-close-button-font-size);cursor:pointer;justify-self:end}div:where(.swal2-container) button:where(.swal2-close):hover{transform:var(--swal2-close-button-hover-transform);background:rgba(0,0,0,0);color:#f27474}div:where(.swal2-container) button:where(.swal2-close):focus-visible{outline:none;box-shadow:var(--swal2-close-button-focus-box-shadow)}div:where(.swal2-container) button:where(.swal2-close)::-moz-focus-inner{border:0}div:where(.swal2-container) div:where(.swal2-html-container){z-index:1;justify-content:center;margin:0;padding:var(--swal2-html-container-padding);overflow:auto;color:inherit;font-size:1.125em;font-weight:normal;line-height:normal;text-align:center;overflow-wrap:break-word;word-break:break-word;cursor:initial}div:where(.swal2-container) input:where(.swal2-input),div:where(.swal2-container) input:where(.swal2-file),div:where(.swal2-container) textarea:where(.swal2-textarea),div:where(.swal2-container) select:where(.swal2-select),div:where(.swal2-container) div:where(.swal2-radio),div:where(.swal2-container) label:where(.swal2-checkbox){margin:1em 2em 3px}div:where(.swal2-container) input:where(.swal2-input),div:where(.swal2-container) input:where(.swal2-file),div:where(.swal2-container) textarea:where(.swal2-textarea){box-sizing:border-box;width:auto;transition:var(--swal2-input-transition);border:var(--swal2-input-border);border-radius:var(--swal2-input-border-radius);background:var(--swal2-input-background);box-shadow:var(--swal2-input-box-shadow);color:inherit;font-size:1.125em}div:where(.swal2-container) input:where(.swal2-input).swal2-inputerror,div:where(.swal2-container) input:where(.swal2-file).swal2-inputerror,div:where(.swal2-container) textarea:where(.swal2-textarea).swal2-inputerror{border-color:#f27474 !important;box-shadow:0 0 2px #f27474 !important}div:where(.swal2-container) input:where(.swal2-input):hover,div:where(.swal2-container) input:where(.swal2-file):hover,div:where(.swal2-container) textarea:where(.swal2-textarea):hover{box-shadow:var(--swal2-input-hover-box-shadow)}div:where(.swal2-container) input:where(.swal2-input):focus,div:where(.swal2-container) input:where(.swal2-file):focus,div:where(.swal2-container) textarea:where(.swal2-textarea):focus{border:var(--swal2-input-focus-border);outline:none;box-shadow:var(--swal2-input-focus-box-shadow)}div:where(.swal2-container) input:where(.swal2-input)::placeholder,div:where(.swal2-container) input:where(.swal2-file)::placeholder,div:where(.swal2-container) textarea:where(.swal2-textarea)::placeholder{color:#ccc}div:where(.swal2-container) .swal2-range{margin:1em 2em 3px;background:var(--swal2-background)}div:where(.swal2-container) .swal2-range input{width:80%}div:where(.swal2-container) .swal2-range output{width:20%;color:inherit;font-weight:600;text-align:center}div:where(.swal2-container) .swal2-range input,div:where(.swal2-container) .swal2-range output{height:2.625em;padding:0;font-size:1.125em;line-height:2.625em}div:where(.swal2-container) .swal2-input{height:2.625em;padding:0 .75em}div:where(.swal2-container) .swal2-file{width:75%;margin-right:auto;margin-left:auto;background:var(--swal2-input-background);font-size:1.125em}div:where(.swal2-container) .swal2-textarea{height:6.75em;padding:.75em}div:where(.swal2-container) .swal2-select{min-width:50%;max-width:100%;padding:.375em .625em;background:var(--swal2-input-background);color:inherit;font-size:1.125em}div:where(.swal2-container) .swal2-radio,div:where(.swal2-container) .swal2-checkbox{align-items:center;justify-content:center;background:var(--swal2-background);color:inherit}div:where(.swal2-container) .swal2-radio label,div:where(.swal2-container) .swal2-checkbox label{margin:0 .6em;font-size:1.125em}div:where(.swal2-container) .swal2-radio input,div:where(.swal2-container) .swal2-checkbox input{flex-shrink:0;margin:0 .4em}div:where(.swal2-container) label:where(.swal2-input-label){display:flex;justify-content:center;margin:1em auto 0}div:where(.swal2-container) div:where(.swal2-validation-message){align-items:center;justify-content:center;margin:1em 0 0;padding:.625em;overflow:hidden;background:var(--swal2-validation-message-background);color:var(--swal2-validation-message-color);font-size:1em;font-weight:300}div:where(.swal2-container) div:where(.swal2-validation-message)::before{content:"!";display:inline-block;width:1.5em;min-width:1.5em;height:1.5em;margin:0 .625em;border-radius:50%;background-color:#f27474;color:#fff;font-weight:600;line-height:1.5em;text-align:center}div:where(.swal2-container) .swal2-progress-steps{flex-wrap:wrap;align-items:center;max-width:100%;margin:1.25em auto;padding:0;background:rgba(0,0,0,0);font-weight:600}div:where(.swal2-container) .swal2-progress-steps li{display:inline-block;position:relative}div:where(.swal2-container) .swal2-progress-steps .swal2-progress-step{z-index:20;flex-shrink:0;width:2em;height:2em;border-radius:2em;background:#2778c4;color:#fff;line-height:2em;text-align:center}div:where(.swal2-container) .swal2-progress-steps .swal2-progress-step.swal2-active-progress-step{background:#2778c4}div:where(.swal2-container) .swal2-progress-steps .swal2-progress-step.swal2-active-progress-step~.swal2-progress-step{background:var(--swal2-progress-step-background);color:#fff}div:where(.swal2-container) .swal2-progress-steps .swal2-progress-step.swal2-active-progress-step~.swal2-progress-step-line{background:var(--swal2-progress-step-background)}div:where(.swal2-container) .swal2-progress-steps .swal2-progress-step-line{z-index:10;flex-shrink:0;width:2.5em;height:.4em;margin:0 -1px;background:#2778c4}div:where(.swal2-icon){position:relative;box-sizing:content-box;justify-content:center;width:5em;height:5em;margin:2.5em auto .6em;zoom:var(--swal2-icon-zoom);border:.25em solid rgba(0,0,0,0);border-radius:50%;border-color:#000;font-family:inherit;line-height:5em;cursor:default;user-select:none}div:where(.swal2-icon) .swal2-icon-content{display:flex;align-items:center;font-size:3.75em}div:where(.swal2-icon).swal2-error{border-color:#f27474;color:#f27474}div:where(.swal2-icon).swal2-error .swal2-x-mark{position:relative;flex-grow:1}div:where(.swal2-icon).swal2-error [class^=swal2-x-mark-line]{display:block;position:absolute;top:2.3125em;width:2.9375em;height:.3125em;border-radius:.125em;background-color:#f27474}div:where(.swal2-icon).swal2-error [class^=swal2-x-mark-line][class$=left]{left:1.0625em;transform:rotate(45deg)}div:where(.swal2-icon).swal2-error [class^=swal2-x-mark-line][class$=right]{right:1em;transform:rotate(-45deg)}@container swal2-popup style(--swal2-icon-animations:true){div:where(.swal2-icon).swal2-error.swal2-icon-show{animation:swal2-animate-error-icon .5s}div:where(.swal2-icon).swal2-error.swal2-icon-show .swal2-x-mark{animation:swal2-animate-error-x-mark .5s}}div:where(.swal2-icon).swal2-warning{border-color:#f8bb86;color:#f8bb86}@container swal2-popup style(--swal2-icon-animations:true){div:where(.swal2-icon).swal2-warning.swal2-icon-show{animation:swal2-animate-error-icon .5s}div:where(.swal2-icon).swal2-warning.swal2-icon-show .swal2-icon-content{animation:swal2-animate-i-mark .5s}}div:where(.swal2-icon).swal2-info{border-color:#3fc3ee;color:#3fc3ee}@container swal2-popup style(--swal2-icon-animations:true){div:where(.swal2-icon).swal2-info.swal2-icon-show{animation:swal2-animate-error-icon .5s}div:where(.swal2-icon).swal2-info.swal2-icon-show .swal2-icon-content{animation:swal2-animate-i-mark .8s}}div:where(.swal2-icon).swal2-question{border-color:#87adbd;color:#87adbd}@container swal2-popup style(--swal2-icon-animations:true){div:where(.swal2-icon).swal2-question.swal2-icon-show{animation:swal2-animate-error-icon .5s}div:where(.swal2-icon).swal2-question.swal2-icon-show .swal2-icon-content{animation:swal2-animate-question-mark .8s}}div:where(.swal2-icon).swal2-success{border-color:#a5dc86;color:#a5dc86}div:where(.swal2-icon).swal2-success [class^=swal2-success-circular-line]{position:absolute;width:3.75em;height:7.5em;border-radius:50%}div:where(.swal2-icon).swal2-success [class^=swal2-success-circular-line][class$=left]{top:-0.4375em;left:-2.0635em;transform:rotate(-45deg);transform-origin:3.75em 3.75em;border-radius:7.5em 0 0 7.5em}div:where(.swal2-icon).swal2-success [class^=swal2-success-circular-line][class$=right]{top:-0.6875em;left:1.875em;transform:rotate(-45deg);transform-origin:0 3.75em;border-radius:0 7.5em 7.5em 0}div:where(.swal2-icon).swal2-success .swal2-success-ring{position:absolute;z-index:2;top:-0.25em;left:-0.25em;box-sizing:content-box;width:100%;height:100%;border:.25em solid rgba(165,220,134,.3);border-radius:50%}div:where(.swal2-icon).swal2-success .swal2-success-fix{position:absolute;z-index:1;top:.5em;left:1.625em;width:.4375em;height:5.625em;transform:rotate(-45deg)}div:where(.swal2-icon).swal2-success [class^=swal2-success-line]{display:block;position:absolute;z-index:2;height:.3125em;border-radius:.125em;background-color:#a5dc86}div:where(.swal2-icon).swal2-success [class^=swal2-success-line][class$=tip]{top:2.875em;left:.8125em;width:1.5625em;transform:rotate(45deg)}div:where(.swal2-icon).swal2-success [class^=swal2-success-line][class$=long]{top:2.375em;right:.5em;width:2.9375em;transform:rotate(-45deg)}@container swal2-popup style(--swal2-icon-animations:true){div:where(.swal2-icon).swal2-success.swal2-icon-show .swal2-success-line-tip{animation:swal2-animate-success-line-tip .75s}div:where(.swal2-icon).swal2-success.swal2-icon-show .swal2-success-line-long{animation:swal2-animate-success-line-long .75s}div:where(.swal2-icon).swal2-success.swal2-icon-show .swal2-success-circular-line-right{animation:swal2-rotate-success-circular-line 4.25s ease-in}}[class^=swal2]{-webkit-tap-highlight-color:rgba(0,0,0,0)}.swal2-show{animation:var(--swal2-show-animation)}.swal2-hide{animation:var(--swal2-hide-animation)}.swal2-noanimation{transition:none}.swal2-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}.swal2-rtl .swal2-close{margin-right:initial;margin-left:0}.swal2-rtl .swal2-timer-progress-bar{right:0;left:auto}.swal2-toast{box-sizing:border-box;grid-column:1/4 !important;grid-row:1/4 !important;grid-template-columns:min-content auto min-content;padding:1em;overflow-y:hidden;border:var(--swal2-toast-border);background:var(--swal2-background);box-shadow:var(--swal2-toast-box-shadow);pointer-events:all}.swal2-toast>*{grid-column:2}.swal2-toast h2:where(.swal2-title){margin:.5em 1em;padding:0;font-size:1em;text-align:initial}.swal2-toast .swal2-loading{justify-content:center}.swal2-toast input:where(.swal2-input){height:2em;margin:.5em;font-size:1em}.swal2-toast .swal2-validation-message{font-size:1em}.swal2-toast div:where(.swal2-footer){margin:.5em 0 0;padding:.5em 0 0;font-size:.8em}.swal2-toast button:where(.swal2-close){grid-column:3/3;grid-row:1/99;align-self:center;width:.8em;height:.8em;margin:0;font-size:2em}.swal2-toast div:where(.swal2-html-container){margin:.5em 1em;padding:0;overflow:initial;font-size:1em;text-align:initial}.swal2-toast div:where(.swal2-html-container):empty{padding:0}.swal2-toast .swal2-loader{grid-column:1;grid-row:1/99;align-self:center;width:2em;height:2em;margin:.25em}.swal2-toast .swal2-icon{grid-column:1;grid-row:1/99;align-self:center;width:2em;min-width:2em;height:2em;margin:0 .5em 0 0}.swal2-toast .swal2-icon .swal2-icon-content{display:flex;align-items:center;font-size:1.8em;font-weight:bold}.swal2-toast .swal2-icon.swal2-success .swal2-success-ring{width:2em;height:2em}.swal2-toast .swal2-icon.swal2-error [class^=swal2-x-mark-line]{top:.875em;width:1.375em}.swal2-toast .swal2-icon.swal2-error [class^=swal2-x-mark-line][class$=left]{left:.3125em}.swal2-toast .swal2-icon.swal2-error [class^=swal2-x-mark-line][class$=right]{right:.3125em}.swal2-toast div:where(.swal2-actions){justify-content:flex-start;height:auto;margin:0;margin-top:.5em;padding:0 .5em}.swal2-toast button:where(.swal2-styled){margin:.25em .5em;padding:.4em .6em;font-size:1em}.swal2-toast .swal2-success{border-color:#a5dc86}.swal2-toast .swal2-success [class^=swal2-success-circular-line]{position:absolute;width:1.6em;height:3em;border-radius:50%}.swal2-toast .swal2-success [class^=swal2-success-circular-line][class$=left]{top:-0.8em;left:-0.5em;transform:rotate(-45deg);transform-origin:2em 2em;border-radius:4em 0 0 4em}.swal2-toast .swal2-success [class^=swal2-success-circular-line][class$=right]{top:-0.25em;left:.9375em;transform-origin:0 1.5em;border-radius:0 4em 4em 0}.swal2-toast .swal2-success .swal2-success-ring{width:2em;height:2em}.swal2-toast .swal2-success .swal2-success-fix{top:0;left:.4375em;width:.4375em;height:2.6875em}.swal2-toast .swal2-success [class^=swal2-success-line]{height:.3125em}.swal2-toast .swal2-success [class^=swal2-success-line][class$=tip]{top:1.125em;left:.1875em;width:.75em}.swal2-toast .swal2-success [class^=swal2-success-line][class$=long]{top:.9375em;right:.1875em;width:1.375em}@container swal2-popup style(--swal2-icon-animations:true){.swal2-toast .swal2-success.swal2-icon-show .swal2-success-line-tip{animation:swal2-toast-animate-success-line-tip .75s}.swal2-toast .swal2-success.swal2-icon-show .swal2-success-line-long{animation:swal2-toast-animate-success-line-long .75s}}.swal2-toast.swal2-show{animation:var(--swal2-toast-show-animation)}.swal2-toast.swal2-hide{animation:var(--swal2-toast-hide-animation)}@keyframes swal2-show{0%{transform:translate3d(0, -50px, 0) scale(0.9);opacity:0}100%{transform:translate3d(0, 0, 0) scale(1);opacity:1}}@keyframes swal2-hide{0%{transform:translate3d(0, 0, 0) scale(1);opacity:1}100%{transform:translate3d(0, -50px, 0) scale(0.9);opacity:0}}@keyframes swal2-animate-success-line-tip{0%{top:1.1875em;left:.0625em;width:0}54%{top:1.0625em;left:.125em;width:0}70%{top:2.1875em;left:-0.375em;width:3.125em}84%{top:3em;left:1.3125em;width:1.0625em}100%{top:2.8125em;left:.8125em;width:1.5625em}}@keyframes swal2-animate-success-line-long{0%{top:3.375em;right:2.875em;width:0}65%{top:3.375em;right:2.875em;width:0}84%{top:2.1875em;right:0;width:3.4375em}100%{top:2.375em;right:.5em;width:2.9375em}}@keyframes swal2-rotate-success-circular-line{0%{transform:rotate(-45deg)}5%{transform:rotate(-45deg)}12%{transform:rotate(-405deg)}100%{transform:rotate(-405deg)}}@keyframes swal2-animate-error-x-mark{0%{margin-top:1.625em;transform:scale(0.4);opacity:0}50%{margin-top:1.625em;transform:scale(0.4);opacity:0}80%{margin-top:-0.375em;transform:scale(1.15)}100%{margin-top:0;transform:scale(1);opacity:1}}@keyframes swal2-animate-error-icon{0%{transform:rotateX(100deg);opacity:0}100%{transform:rotateX(0deg);opacity:1}}@keyframes swal2-rotate-loading{0%{transform:rotate(0deg)}100%{transform:rotate(360deg)}}@keyframes swal2-animate-question-mark{0%{transform:rotateY(-360deg)}100%{transform:rotateY(0)}}@keyframes swal2-animate-i-mark{0%{transform:rotateZ(45deg);opacity:0}25%{transform:rotateZ(-25deg);opacity:.4}50%{transform:rotateZ(15deg);opacity:.8}75%{transform:rotateZ(-5deg);opacity:1}100%{transform:rotateX(0);opacity:1}}@keyframes swal2-toast-show{0%{transform:translateY(-0.625em) rotateZ(2deg)}33%{transform:translateY(0) rotateZ(-2deg)}66%{transform:translateY(0.3125em) rotateZ(2deg)}100%{transform:translateY(0) rotateZ(0deg)}}@keyframes swal2-toast-hide{100%{transform:rotateZ(1deg);opacity:0}}@keyframes swal2-toast-animate-success-line-tip{0%{top:.5625em;left:.0625em;width:0}54%{top:.125em;left:.125em;width:0}70%{top:.625em;left:-0.25em;width:1.625em}84%{top:1.0625em;left:.75em;width:.5em}100%{top:1.125em;left:.1875em;width:.75em}}@keyframes swal2-toast-animate-success-line-long{0%{top:1.625em;right:1.375em;width:0}65%{top:1.25em;right:.9375em;width:0}84%{top:.9375em;right:0;width:1.125em}100%{top:.9375em;right:.1875em;width:1.375em}} diff --git a/public/assets/sweetalert2/dist/sweetalert2.min.js b/public/assets/sweetalert2/dist/sweetalert2.min.js new file mode 100644 index 0000000..6c50453 --- /dev/null +++ b/public/assets/sweetalert2/dist/sweetalert2.min.js @@ -0,0 +1,5 @@ +/*! +* sweetalert2 v11.26.18 +* Released under the MIT License. +*/ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).Sweetalert2=t()}(this,function(){"use strict";function e(e,t,n){if("function"==typeof e?e===t:e.has(t))return arguments.length<3?t:n;throw new TypeError("Private element is not present on this object")}function t(t,n){return t.get(e(t,n))}function n(e,t,n){(function(e,t){if(t.has(e))throw new TypeError("Cannot initialize the same private elements twice on an object")})(e,t),t.set(e,n)}const o={},i=e=>new Promise(t=>{if(!e)return t();const n=window.scrollX,i=window.scrollY;o.restoreFocusTimeout=setTimeout(()=>{o.previousActiveElement instanceof HTMLElement?(o.previousActiveElement.focus(),o.previousActiveElement=null):document.body&&document.body.focus(),t()},100),window.scrollTo(n,i)}),s="swal2-",r=["container","shown","height-auto","iosfix","popup","modal","no-backdrop","no-transition","toast","toast-shown","show","hide","close","title","html-container","actions","confirm","deny","cancel","footer","icon","icon-content","image","input","file","range","select","radio","checkbox","label","textarea","inputerror","input-label","validation-message","progress-steps","active-progress-step","progress-step","progress-step-line","loader","loading","styled","top","top-start","top-end","top-left","top-right","center","center-start","center-end","center-left","center-right","bottom","bottom-start","bottom-end","bottom-left","bottom-right","grow-row","grow-column","grow-fullscreen","rtl","timer-progress-bar","timer-progress-bar-container","scrollbar-measure","icon-success","icon-warning","icon-info","icon-question","icon-error","draggable","dragging"].reduce((e,t)=>(e[t]=s+t,e),{}),a=["success","warning","info","question","error"].reduce((e,t)=>(e[t]=s+t,e),{}),l="SweetAlert2:",c=e=>e.charAt(0).toUpperCase()+e.slice(1),u=e=>{console.warn(`${l} ${"object"==typeof e?e.join(" "):e}`)},d=e=>{console.error(`${l} ${e}`)},p=[],m=(e,t=null)=>{var n;n=`"${e}" is deprecated and will be removed in the next major release.${t?` Use "${t}" instead.`:""}`,p.includes(n)||(p.push(n),u(n))},h=e=>"function"==typeof e?e():e,g=e=>e&&"function"==typeof e.toPromise,f=e=>g(e)?e.toPromise():Promise.resolve(e),b=e=>e&&Promise.resolve(e)===e,y=()=>document.body.querySelector(`.${r.container}`),v=e=>{const t=y();return t?t.querySelector(e):null},w=e=>v(`.${e}`),C=()=>w(r.popup),A=()=>w(r.icon),E=()=>w(r.title),k=()=>w(r["html-container"]),B=()=>w(r.image),$=()=>w(r["progress-steps"]),L=()=>w(r["validation-message"]),P=()=>v(`.${r.actions} .${r.confirm}`),x=()=>v(`.${r.actions} .${r.cancel}`),T=()=>v(`.${r.actions} .${r.deny}`),S=()=>v(`.${r.loader}`),O=()=>w(r.actions),M=()=>w(r.footer),j=()=>w(r["timer-progress-bar"]),H=()=>w(r.close),I=()=>{const e=C();if(!e)return[];const t=e.querySelectorAll('[tabindex]:not([tabindex="-1"]):not([tabindex="0"])'),n=Array.from(t).sort((e,t)=>{const n=parseInt(e.getAttribute("tabindex")||"0"),o=parseInt(t.getAttribute("tabindex")||"0");return n>o?1:n"-1"!==e.getAttribute("tabindex"));return[...new Set(n.concat(i))].filter(e=>ee(e))},D=()=>N(document.body,r.shown)&&!N(document.body,r["toast-shown"])&&!N(document.body,r["no-backdrop"]),V=()=>{const e=C();return!!e&&N(e,r.toast)},q=(e,t)=>{if(e.textContent="",t){const n=(new DOMParser).parseFromString(t,"text/html"),o=n.querySelector("head");o&&Array.from(o.childNodes).forEach(t=>{e.appendChild(t)});const i=n.querySelector("body");i&&Array.from(i.childNodes).forEach(t=>{t instanceof HTMLVideoElement||t instanceof HTMLAudioElement?e.appendChild(t.cloneNode(!0)):e.appendChild(t)})}},N=(e,t)=>{if(!t)return!1;const n=t.split(/\s+/);for(let t=0;t{if(((e,t)=>{Array.from(e.classList).forEach(n=>{Object.values(r).includes(n)||Object.values(a).includes(n)||Object.values(t.showClass||{}).includes(n)||e.classList.remove(n)})})(e,t),!t.customClass)return;const o=t.customClass[n];o&&("string"==typeof o||o.forEach?z(e,o):u(`Invalid type of customClass.${n}! Expected string or iterable object, got "${typeof o}"`))},R=(e,t)=>{if(!t)return null;switch(t){case"select":case"textarea":case"file":return e.querySelector(`.${r.popup} > .${r[t]}`);case"checkbox":return e.querySelector(`.${r.popup} > .${r.checkbox} input`);case"radio":return e.querySelector(`.${r.popup} > .${r.radio} input:checked`)||e.querySelector(`.${r.popup} > .${r.radio} input:first-child`);case"range":return e.querySelector(`.${r.popup} > .${r.range} input`);default:return e.querySelector(`.${r.popup} > .${r.input}`)}},F=e=>{if(e.focus(),"file"!==e.type){const t=e.value;e.value="",e.value=t}},U=(e,t,n)=>{e&&t&&("string"==typeof t&&(t=t.split(/\s+/).filter(Boolean)),t.forEach(t=>{Array.isArray(e)?e.forEach(e=>{n?e.classList.add(t):e.classList.remove(t)}):n?e.classList.add(t):e.classList.remove(t)}))},z=(e,t)=>{U(e,t,!0)},W=(e,t)=>{U(e,t,!1)},K=(e,t)=>{const n=Array.from(e.children);for(let e=0;e{n===`${parseInt(`${n}`)}`&&(n=parseInt(n)),n||0===parseInt(`${n}`)?e.style.setProperty(t,"number"==typeof n?`${n}px`:n):e.style.removeProperty(t)},X=(e,t="flex")=>{e&&(e.style.display=t)},Z=e=>{e&&(e.style.display="none")},J=(e,t="block")=>{e&&new MutationObserver(()=>{Q(e,e.innerHTML,t)}).observe(e,{childList:!0,subtree:!0})},G=(e,t,n,o)=>{const i=e.querySelector(t);i&&i.style.setProperty(n,o)},Q=(e,t,n="flex")=>{t?X(e,n):Z(e)},ee=e=>Boolean(e&&(e.offsetWidth||e.offsetHeight||e.getClientRects().length)),te=e=>Boolean(e.scrollHeight>e.clientHeight),ne=e=>{const t=window.getComputedStyle(e),n=parseFloat(t.getPropertyValue("animation-duration")||"0"),o=parseFloat(t.getPropertyValue("transition-duration")||"0");return n>0||o>0},oe=(e,t=!1)=>{const n=j();n&&ee(n)&&(t&&(n.style.transition="none",n.style.width="100%"),setTimeout(()=>{n.style.transition=`width ${e/1e3}s linear`,n.style.width="0%"},10))},ie=`\n
                  \n \n
                    \n
                    \n \n

                    \n
                    \n \n \n
                    \n \n \n
                    \n \n
                    \n \n \n
                    \n
                    \n
                    \n \n \n \n
                    \n
                    \n
                    \n
                    \n
                    \n
                    \n`.replace(/(^|\n)\s*/g,""),se=()=>{o.currentInstance&&o.currentInstance.resetValidationMessage()},re=e=>{const t=(()=>{const e=y();return!!e&&(e.remove(),W([document.documentElement,document.body],[r["no-backdrop"],r["toast-shown"],r["has-column"]]),!0)})();if("undefined"==typeof window||"undefined"==typeof document)return void d("SweetAlert2 requires document to initialize");const n=document.createElement("div");n.className=r.container,t&&z(n,r["no-transition"]),q(n,ie),n.dataset.swal2Theme=e.theme;const i=(e=>{if("string"==typeof e){const t=document.querySelector(e);if(!t)throw new Error(`Target element "${e}" not found`);return t}return e})(e.target||"body");i.appendChild(n),e.topLayer&&(n.setAttribute("popover",""),n.showPopover()),(e=>{const t=C();t&&(t.setAttribute("role",e.toast?"alert":"dialog"),t.setAttribute("aria-live",e.toast?"polite":"assertive"),e.toast||t.setAttribute("aria-modal","true"))})(e),(e=>{"rtl"===window.getComputedStyle(e).direction&&(z(y(),r.rtl),o.isRTL=!0)})(i),(()=>{const e=C();if(!e)return;const t=K(e,r.input),n=K(e,r.file),o=e.querySelector(`.${r.range} input`),i=e.querySelector(`.${r.range} output`),s=K(e,r.select),a=e.querySelector(`.${r.checkbox} input`),l=K(e,r.textarea);t&&(t.oninput=se),n&&(n.onchange=se),s&&(s.onchange=se),a&&(a.onchange=se),l&&(l.oninput=se),o&&i&&(o.oninput=()=>{se(),i.value=o.value},o.onchange=()=>{se(),i.value=o.value})})()},ae=(e,t)=>{e instanceof HTMLElement?t.appendChild(e):"object"==typeof e?le(e,t):e&&q(t,e)},le=(e,t)=>{"jquery"in e?ce(t,e):q(t,e.toString())},ce=(e,t)=>{if(e.textContent="",0 in t)for(let n=0;n in t;n++)e.appendChild(t[n].cloneNode(!0));else e.appendChild(t.cloneNode(!0))},ue=(e,t)=>{const n=O(),o=S();n&&o&&(t.showConfirmButton||t.showDenyButton||t.showCancelButton?X(n):Z(n),_(n,t,"actions"),function(e,t,n){const o=P(),i=T(),s=x();if(!o||!i||!s)return;pe(o,"confirm",n),pe(i,"deny",n),pe(s,"cancel",n),function(e,t,n,o){if(!o.buttonsStyling)return void W([e,t,n],r.styled);z([e,t,n],r.styled),o.confirmButtonColor&&e.style.setProperty("--swal2-confirm-button-background-color",o.confirmButtonColor);o.denyButtonColor&&t.style.setProperty("--swal2-deny-button-background-color",o.denyButtonColor);o.cancelButtonColor&&n.style.setProperty("--swal2-cancel-button-background-color",o.cancelButtonColor);de(e),de(t),de(n)}(o,i,s,n),n.reverseButtons&&(n.toast?(e.insertBefore(s,o),e.insertBefore(i,o)):(e.insertBefore(s,t),e.insertBefore(i,t),e.insertBefore(o,t)))}(n,o,t),q(o,t.loaderHtml||""),_(o,t,"loader"))};function de(e){const t=window.getComputedStyle(e);if(t.getPropertyValue("--swal2-action-button-focus-box-shadow"))return;const n=t.backgroundColor.replace(/rgba?\((\d+), (\d+), (\d+).*/,"rgba($1, $2, $3, 0.5)");e.style.setProperty("--swal2-action-button-focus-box-shadow",t.getPropertyValue("--swal2-outline").replace(/ rgba\(.*/,` ${n}`))}function pe(e,t,n){const o=c(t);Q(e,n[`show${o}Button`],"inline-block"),q(e,n[`${t}ButtonText`]||""),e.setAttribute("aria-label",n[`${t}ButtonAriaLabel`]||""),e.className=r[t],_(e,n,`${t}Button`)}const me=(e,t)=>{const n=y();n&&(!function(e,t){"string"==typeof t?e.style.background=t:t||z([document.documentElement,document.body],r["no-backdrop"])}(n,t.backdrop),function(e,t){if(!t)return;t in r?z(e,r[t]):(u('The "position" parameter is not valid, defaulting to "center"'),z(e,r.center))}(n,t.position),function(e,t){if(!t)return;z(e,r[`grow-${t}`])}(n,t.grow),_(n,t,"container"))};var he={innerParams:new WeakMap,domCache:new WeakMap};const ge=["input","file","range","select","radio","checkbox","textarea"],fe=e=>{if(!e.input)return;if(!Ee[e.input])return void d(`Unexpected type of input! Expected ${Object.keys(Ee).join(" | ")}, got "${e.input}"`);const t=Ce(e.input);if(!t)return;const n=Ee[e.input](t,e);X(t),e.inputAutoFocus&&setTimeout(()=>{F(n)})},be=(e,t)=>{const n=C();if(!n)return;const o=R(n,e);if(o){(e=>{for(let t=0;t{if(!e.input)return;const t=Ce(e.input);t&&_(t,e,"input")},ve=(e,t)=>{!e.placeholder&&t.inputPlaceholder&&(e.placeholder=t.inputPlaceholder)},we=(e,t,n)=>{if(n.inputLabel){const o=document.createElement("label"),i=r["input-label"];o.setAttribute("for",e.id),o.className=i,"object"==typeof n.customClass&&z(o,n.customClass.inputLabel),o.innerText=n.inputLabel,t.insertAdjacentElement("beforebegin",o)}},Ce=e=>{const t=C();if(t)return K(t,r[e]||r.input)},Ae=(e,t)=>{["string","number"].includes(typeof t)?e.value=`${t}`:b(t)||u(`Unexpected type of inputValue! Expected "string", "number" or "Promise", got "${typeof t}"`)},Ee={};Ee.text=Ee.email=Ee.password=Ee.number=Ee.tel=Ee.url=Ee.search=Ee.date=Ee["datetime-local"]=Ee.time=Ee.week=Ee.month=(e,t)=>{const n=e;return Ae(n,t.inputValue),we(n,n,t),ve(n,t),n.type=t.input,n},Ee.file=(e,t)=>{const n=e;return we(n,n,t),ve(n,t),n},Ee.range=(e,t)=>{const n=e,o=n.querySelector("input"),i=n.querySelector("output");return o&&(Ae(o,t.inputValue),o.type=t.input,we(o,e,t)),i&&Ae(i,t.inputValue),e},Ee.select=(e,t)=>{const n=e;if(n.textContent="",t.inputPlaceholder){const e=document.createElement("option");q(e,t.inputPlaceholder),e.value="",e.disabled=!0,e.selected=!0,n.appendChild(e)}return we(n,n,t),n},Ee.radio=e=>(e.textContent="",e),Ee.checkbox=(e,t)=>{const n=C();if(!n)throw new Error("Popup not found");const o=R(n,"checkbox");if(!o)throw new Error("Checkbox input not found");o.value="1",o.checked=Boolean(t.inputValue);const i=e.querySelector("span");if(i){const e=t.inputPlaceholder||t.inputLabel;e&&q(i,e)}return o},Ee.textarea=(e,t)=>{const n=e;Ae(n,t.inputValue),ve(n,t),we(n,n,t);return setTimeout(()=>{if("MutationObserver"in window){const e=C();if(!e)return;const o=parseInt(window.getComputedStyle(e).width);new MutationObserver(()=>{if(!document.body.contains(n))return;const e=n.offsetWidth+(i=n,parseInt(window.getComputedStyle(i).marginLeft)+parseInt(window.getComputedStyle(i).marginRight));var i;const s=C();s&&(e>o?s.style.width=`${e}px`:Y(s,"width",t.width))}).observe(n,{attributes:!0,attributeFilter:["style"]})}}),n};const ke=(e,t)=>{const n=k();n&&(J(n),_(n,t,"htmlContainer"),t.html?(ae(t.html,n),X(n,"block")):t.text?(n.textContent=t.text,X(n,"block")):Z(n),((e,t)=>{const n=C();if(!n)return;const o=he.innerParams.get(e),i=!o||t.input!==o.input;ge.forEach(e=>{const o=K(n,r[e]);o&&(be(e,t.inputAttributes),o.className=r[e],i&&Z(o))}),t.input&&(i&&fe(t),ye(t))})(e,t))},Be=(e,t)=>{for(const[n,o]of Object.entries(a))t.icon!==n&&W(e,o);z(e,t.icon&&a[t.icon]),Pe(e,t),$e(),_(e,t,"icon")},$e=()=>{const e=C();if(!e)return;const t=window.getComputedStyle(e).getPropertyValue("background-color"),n=e.querySelectorAll("[class^=swal2-success-circular-line], .swal2-success-fix");for(let e=0;e{if(!t.icon&&!t.iconHtml)return;let n=e.innerHTML,o="";if(t.iconHtml)o=xe(t.iconHtml);else if("success"===t.icon)o=(e=>`\n ${e.animation?'
                    ':""}\n \n
                    \n ${e.animation?'
                    ':""}\n ${e.animation?'
                    ':""}\n`)(t),n=n.replace(/ style=".*?"/g,"");else if("error"===t.icon)o='\n \n \n \n \n';else if(t.icon){o=xe({question:"?",warning:"!",info:"i"}[t.icon])}n.trim()!==o.trim()&&q(e,o)},Pe=(e,t)=>{if(t.iconColor){e.style.color=t.iconColor,e.style.borderColor=t.iconColor;for(const n of[".swal2-success-line-tip",".swal2-success-line-long",".swal2-x-mark-line-left",".swal2-x-mark-line-right"])G(e,n,"background-color",t.iconColor);G(e,".swal2-success-ring","border-color",t.iconColor)}},xe=e=>`
                    ${e}
                    `;let Te=!1,Se=0,Oe=0,Me=0,je=0;const He=e=>{const t=C();if(!t)return;const n=A();if(e.target===t||n&&n.contains(e.target)){Te=!0;const n=Ve(e);Se=n.clientX,Oe=n.clientY,Me=parseInt(t.style.insetInlineStart)||0,je=parseInt(t.style.insetBlockStart)||0,z(t,"swal2-dragging")}},Ie=e=>{const t=C();if(t&&Te){let{clientX:n,clientY:i}=Ve(e);const s=n-Se;t.style.insetInlineStart=`${Me+(o.isRTL?-s:s)}px`,t.style.insetBlockStart=`${je+(i-Oe)}px`}},De=()=>{const e=C();Te=!1,W(e,"swal2-dragging")},Ve=e=>{let t=0,n=0;return e.type.startsWith("mouse")?(t=e.clientX,n=e.clientY):e.type.startsWith("touch")&&(t=e.touches[0].clientX,n=e.touches[0].clientY),{clientX:t,clientY:n}},qe=(e,t)=>{const n=y(),o=C();if(n&&o){if(t.toast){Y(n,"width",t.width),o.style.width="100%";const e=S();e&&o.insertBefore(e,A())}else Y(o,"width",t.width);Y(o,"padding",t.padding),t.color&&(o.style.color=t.color),t.background&&(o.style.background=t.background),Z(L()),Ne(o,t),t.draggable&&!t.toast?(z(o,r.draggable),(e=>{e.addEventListener("mousedown",He),document.body.addEventListener("mousemove",Ie),e.addEventListener("mouseup",De),e.addEventListener("touchstart",He),document.body.addEventListener("touchmove",Ie),e.addEventListener("touchend",De)})(o)):(W(o,r.draggable),(e=>{e.removeEventListener("mousedown",He),document.body.removeEventListener("mousemove",Ie),e.removeEventListener("mouseup",De),e.removeEventListener("touchstart",He),document.body.removeEventListener("touchmove",Ie),e.removeEventListener("touchend",De)})(o))}},Ne=(e,t)=>{const n=t.showClass||{};e.className=`${r.popup} ${ee(e)?n.popup:""}`,t.toast?(z([document.documentElement,document.body],r["toast-shown"]),z(e,r.toast)):z(e,r.modal),_(e,t,"popup"),"string"==typeof t.customClass&&z(e,t.customClass),t.icon&&z(e,r[`icon-${t.icon}`])},_e=e=>{const t=document.createElement("li");return z(t,r["progress-step"]),q(t,e),t},Re=e=>{const t=document.createElement("li");return z(t,r["progress-step-line"]),e.progressStepsDistance&&Y(t,"width",e.progressStepsDistance),t},Fe=(e,t)=>{var n;qe(0,t),me(0,t),((e,t)=>{const n=$();if(!n)return;const{progressSteps:o,currentProgressStep:i}=t;o&&0!==o.length&&void 0!==i?(X(n),n.textContent="",i>=o.length&&u("Invalid currentProgressStep parameter, it should be less than progressSteps.length (currentProgressStep like JS arrays starts from 0)"),o.forEach((e,s)=>{const a=_e(e);if(n.appendChild(a),s===i&&z(a,r["active-progress-step"]),s!==o.length-1){const e=Re(t);n.appendChild(e)}})):Z(n)})(0,t),((e,t)=>{const n=he.innerParams.get(e),o=A();if(!o)return;if(n&&t.icon===n.icon)return Le(o,t),void Be(o,t);if(!t.icon&&!t.iconHtml)return void Z(o);if(t.icon&&-1===Object.keys(a).indexOf(t.icon))return d(`Unknown icon! Expected "success", "error", "warning", "info" or "question", got "${t.icon}"`),void Z(o);X(o),Le(o,t),Be(o,t),z(o,t.showClass&&t.showClass.icon),window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change",$e)})(e,t),((e,t)=>{const n=B();n&&(t.imageUrl?(X(n,""),n.setAttribute("src",t.imageUrl),n.setAttribute("alt",t.imageAlt||""),Y(n,"width",t.imageWidth),Y(n,"height",t.imageHeight),n.className=r.image,_(n,t,"image")):Z(n))})(0,t),((e,t)=>{const n=E();n&&(J(n),Q(n,Boolean(t.title||t.titleText),"block"),t.title&&ae(t.title,n),t.titleText&&(n.innerText=t.titleText),_(n,t,"title"))})(0,t),((e,t)=>{const n=H();n&&(q(n,t.closeButtonHtml||""),_(n,t,"closeButton"),Q(n,t.showCloseButton),n.setAttribute("aria-label",t.closeButtonAriaLabel||""))})(0,t),ke(e,t),ue(0,t),((e,t)=>{const n=M();n&&(J(n),Q(n,Boolean(t.footer),"block"),t.footer&&ae(t.footer,n),_(n,t,"footer"))})(0,t);const i=C();"function"==typeof t.didRender&&i&&t.didRender(i),null===(n=o.eventEmitter)||void 0===n||n.emit("didRender",i)},Ue=()=>{var e;return null===(e=P())||void 0===e?void 0:e.click()},ze=Object.freeze({cancel:"cancel",backdrop:"backdrop",close:"close",esc:"esc",timer:"timer"}),We=e=>{if(e.keydownTarget&&e.keydownHandlerAdded&&e.keydownHandler){const t=e.keydownHandler;e.keydownTarget.removeEventListener("keydown",t,{capture:e.keydownListenerCapture}),e.keydownHandlerAdded=!1}},Ke=(e,t)=>{var n;const o=I();if(o.length)return-2===(e+=t)&&(e=o.length-1),e===o.length?e=0:-1===e&&(e=o.length-1),void o[e].focus();null===(n=C())||void 0===n||n.focus()},Ye=["ArrowRight","ArrowDown"],Xe=["ArrowLeft","ArrowUp"],Ze=(e,t,n)=>{e&&(t.isComposing||229===t.keyCode||(e.stopKeydownPropagation&&t.stopPropagation(),"Enter"===t.key?Je(t,e):"Tab"===t.key?Ge(t):[...Ye,...Xe].includes(t.key)?Qe(t.key):"Escape"===t.key&&et(t,e,n)))},Je=(e,t)=>{if(!h(t.allowEnterKey))return;const n=C();if(!n||!t.input)return;const o=R(n,t.input);if(e.target&&o&&e.target instanceof HTMLElement&&e.target.outerHTML===o.outerHTML){if(["textarea","file"].includes(t.input))return;Ue(),e.preventDefault()}},Ge=e=>{const t=e.target,n=I();let o=-1;for(let e=0;e{const t=O(),n=P(),o=T(),i=x();if(!(t&&n&&o&&i))return;const s=[n,o,i];if(document.activeElement instanceof HTMLElement&&!s.includes(document.activeElement))return;const r=Ye.includes(e)?"nextElementSibling":"previousElementSibling";let a=document.activeElement;if(a){for(let e=0;e{e.preventDefault(),h(t.allowEscapeKey)&&n(ze.esc)};var tt={swalPromiseResolve:new WeakMap,swalPromiseReject:new WeakMap};const nt=()=>{Array.from(document.body.children).forEach(e=>{e.hasAttribute("data-previous-aria-hidden")?(e.setAttribute("aria-hidden",e.getAttribute("data-previous-aria-hidden")||""),e.removeAttribute("data-previous-aria-hidden")):e.removeAttribute("aria-hidden")})},ot="undefined"!=typeof window&&Boolean(window.GestureEvent),it=()=>{const e=y();if(!e)return;let t;e.ontouchstart=e=>{t=st(e)},e.ontouchmove=e=>{t&&(e.preventDefault(),e.stopPropagation())}},st=e=>{const t=e.target,n=y(),o=k();return!(!n||!o)&&(!rt(e)&&!at(e)&&(t===n||!(te(n)||!(t instanceof HTMLElement)||((e,t)=>{let n=e;for(;n&&n!==t;){if(te(n))return!0;n=n.parentElement}return!1})(t,o)||"INPUT"===t.tagName||"TEXTAREA"===t.tagName||te(o)&&o.contains(t))))},rt=e=>Boolean(e.touches&&e.touches.length&&"stylus"===e.touches[0].touchType),at=e=>e.touches&&e.touches.length>1;let lt=null;const ct=e=>{null===lt&&(document.body.scrollHeight>window.innerHeight||"scroll"===e)&&(lt=parseInt(window.getComputedStyle(document.body).getPropertyValue("padding-right")),document.body.style.paddingRight=`${lt+(()=>{const e=document.createElement("div");e.className=r["scrollbar-measure"],document.body.appendChild(e);const t=e.getBoundingClientRect().width-e.clientWidth;return document.body.removeChild(e),t})()}px`)};function ut(e,t,n,s){V()?yt(e,s):(i(n).then(()=>yt(e,s)),We(o)),ot?(t.setAttribute("style","display:none !important"),t.removeAttribute("class"),t.innerHTML=""):t.remove(),D()&&(null!==lt&&(document.body.style.paddingRight=`${lt}px`,lt=null),(()=>{if(N(document.body,r.iosfix)){const e=parseInt(document.body.style.top,10);W(document.body,r.iosfix),document.body.style.top="",document.body.scrollTop=-1*e}})(),nt()),W([document.documentElement,document.body],[r.shown,r["height-auto"],r["no-backdrop"],r["toast-shown"]])}function dt(e){e=gt(e);const t=tt.swalPromiseResolve.get(this),n=pt(this);this.isAwaitingPromise?e.isDismissed||(ht(this),t(e)):n&&t(e)}const pt=e=>{const t=C();if(!t)return!1;const n=he.innerParams.get(e);if(!n||N(t,n.hideClass.popup))return!1;W(t,n.showClass.popup),z(t,n.hideClass.popup);const o=y();return W(o,n.showClass.backdrop),z(o,n.hideClass.backdrop),ft(e,t,n),!0};function mt(e){const t=tt.swalPromiseReject.get(this);ht(this),t&&t(e)}const ht=e=>{e.isAwaitingPromise&&(delete e.isAwaitingPromise,he.innerParams.get(e)||e._destroy())},gt=e=>void 0===e?{isConfirmed:!1,isDenied:!1,isDismissed:!0}:Object.assign({isConfirmed:!1,isDenied:!1,isDismissed:!1},e),ft=(e,t,n)=>{var i;const s=y(),r=ne(t);"function"==typeof n.willClose&&n.willClose(t),null===(i=o.eventEmitter)||void 0===i||i.emit("willClose",t),r&&s?bt(e,t,s,Boolean(n.returnFocus),n.didClose):s&&ut(e,s,Boolean(n.returnFocus),n.didClose)},bt=(e,t,n,i,s)=>{o.swalCloseEventFinishedCallback=ut.bind(null,e,n,i,s);const r=function(e){var n;e.target===t&&(null===(n=o.swalCloseEventFinishedCallback)||void 0===n||n.call(o),delete o.swalCloseEventFinishedCallback,t.removeEventListener("animationend",r),t.removeEventListener("transitionend",r))};t.addEventListener("animationend",r),t.addEventListener("transitionend",r)},yt=(e,t)=>{setTimeout(()=>{var n;"function"==typeof t&&t.bind(e.params)(),null===(n=o.eventEmitter)||void 0===n||n.emit("didClose"),e._destroy&&e._destroy()})},vt=e=>{let t=C();if(t||new Qn,t=C(),!t)return;const n=S();V()?Z(A()):wt(t,e),X(n),t.setAttribute("data-loading","true"),t.setAttribute("aria-busy","true"),t.focus()},wt=(e,t)=>{const n=O(),o=S();n&&o&&(!t&&ee(P())&&(t=P()),X(n),t&&(Z(t),o.setAttribute("data-button-to-replace",t.className),n.insertBefore(o,t)),z([e,n],r.loading))},Ct=e=>e.checked?1:0,At=e=>e.checked?e.value:null,Et=e=>e.files&&e.files.length?null!==e.getAttribute("multiple")?e.files:e.files[0]:null,kt=(e,t)=>{const n=C();if(!n)return;const o=e=>{"select"===t.input?function(e,t,n){const o=K(e,r.select);if(!o)return;const i=(e,t,o)=>{const i=document.createElement("option");i.value=o,q(i,t),i.selected=Lt(o,n.inputValue),e.appendChild(i)};t.forEach(e=>{const t=e[0],n=e[1];if(Array.isArray(n)){const e=document.createElement("optgroup");e.label=t,e.disabled=!1,o.appendChild(e),n.forEach(t=>i(e,t[1],t[0]))}else i(o,n,t)}),o.focus()}(n,$t(e),t):"radio"===t.input&&function(e,t,n){const o=K(e,r.radio);if(!o)return;t.forEach(e=>{const t=e[0],i=e[1],s=document.createElement("input"),a=document.createElement("label");s.type="radio",s.name=r.radio,s.value=t,Lt(t,n.inputValue)&&(s.checked=!0);const l=document.createElement("span");q(l,i),l.className=r.label,a.appendChild(s),a.appendChild(l),o.appendChild(a)});const i=o.querySelectorAll("input");i.length&&i[0].focus()}(n,$t(e),t)};g(t.inputOptions)||b(t.inputOptions)?(vt(P()),f(t.inputOptions).then(t=>{e.hideLoading(),o(t)})):"object"==typeof t.inputOptions?o(t.inputOptions):d("Unexpected type of inputOptions! Expected object, Map or Promise, got "+typeof t.inputOptions)},Bt=(e,t)=>{const n=e.getInput();n&&(Z(n),f(t.inputValue).then(o=>{n.value="number"===t.input?`${parseFloat(o)||0}`:`${o}`,X(n),n.focus(),e.hideLoading()}).catch(t=>{d(`Error in inputValue promise: ${t}`),n.value="",X(n),n.focus(),e.hideLoading()}))};const $t=e=>{const t=[];return e instanceof Map?e.forEach((e,n)=>{let o=e;"object"==typeof o&&(o=$t(o)),t.push([n,o])}):Object.keys(e).forEach(n=>{let o=e[n];"object"==typeof o&&(o=$t(o)),t.push([n,o])}),t},Lt=(e,t)=>Boolean(t)&&null!=t&&t.toString()===e.toString(),Pt=(e,t)=>{const n=he.innerParams.get(e);if(!n.input)return void d(`The "input" parameter is needed to be set when using returnInputValueOn${c(t)}`);const o=e.getInput(),i=((e,t)=>{const n=e.getInput();if(!n)return null;switch(t.input){case"checkbox":return Ct(n);case"radio":return At(n);case"file":return Et(n);default:return t.inputAutoTrim?n.value.trim():n.value}})(e,n);n.inputValidator?xt(e,i,t):o&&!o.checkValidity()?(e.enableButtons(),e.showValidationMessage(n.validationMessage||o.validationMessage)):"deny"===t?Tt(e,i):Mt(e,i)},xt=(e,t,n)=>{const o=he.innerParams.get(e);e.disableInput();Promise.resolve().then(()=>f(o.inputValidator(t,o.validationMessage))).then(o=>{e.enableButtons(),e.enableInput(),o?e.showValidationMessage(o):"deny"===n?Tt(e,t):Mt(e,t)})},Tt=(e,t)=>{const n=he.innerParams.get(e);if(n.showLoaderOnDeny&&vt(T()),n.preDeny){e.isAwaitingPromise=!0;Promise.resolve().then(()=>f(n.preDeny(t,n.validationMessage))).then(n=>{!1===n?(e.hideLoading(),ht(e)):e.close({isDenied:!0,value:void 0===n?t:n})}).catch(t=>Ot(e,t))}else e.close({isDenied:!0,value:t})},St=(e,t)=>{e.close({isConfirmed:!0,value:t})},Ot=(e,t)=>{e.rejectPromise(t)},Mt=(e,t)=>{const n=he.innerParams.get(e);if(n.showLoaderOnConfirm&&vt(),n.preConfirm){e.resetValidationMessage(),e.isAwaitingPromise=!0;Promise.resolve().then(()=>f(n.preConfirm(t,n.validationMessage))).then(n=>{ee(L())||!1===n?(e.hideLoading(),ht(e)):St(e,void 0===n?t:n)}).catch(t=>Ot(e,t))}else St(e,t)};function jt(){const e=he.innerParams.get(this);if(!e)return;const t=he.domCache.get(this);Z(t.loader),V()?e.icon&&X(A()):Ht(t),W([t.popup,t.actions],r.loading),t.popup.removeAttribute("aria-busy"),t.popup.removeAttribute("data-loading"),t.confirmButton.disabled=!1,t.denyButton.disabled=!1,t.cancelButton.disabled=!1}const Ht=e=>{const t=e.loader.getAttribute("data-button-to-replace"),n=t?e.popup.getElementsByClassName(t):[];n.length?X(n[0],"inline-block"):ee(P())||ee(T())||ee(x())||Z(e.actions)};function It(){const e=he.innerParams.get(this),t=he.domCache.get(this);return t?R(t.popup,e.input):null}function Dt(e,t,n){const o=he.domCache.get(e);t.forEach(e=>{o[e].disabled=n})}function Vt(e,t){const n=C();if(n&&e)if("radio"===e.type){const e=n.querySelectorAll(`[name="${r.radio}"]`);for(let n=0;nObject.prototype.hasOwnProperty.call(zt,e),Zt=e=>-1!==Wt.indexOf(e),Jt=e=>Kt[e],Gt=e=>{Xt(e)||u(`Unknown parameter "${e}"`)},Qt=e=>{Yt.includes(e)&&u(`The parameter "${e}" is incompatible with toasts`)},en=e=>{const t=Jt(e);t&&m(e,t)},tn=e=>{!1===e.backdrop&&e.allowOutsideClick&&u('"allowOutsideClick" parameter requires `backdrop` parameter to be set to `true`'),e.theme&&!["light","dark","auto","minimal","borderless","bootstrap-4","bootstrap-4-light","bootstrap-4-dark","bootstrap-5","bootstrap-5-light","bootstrap-5-dark","material-ui","material-ui-light","material-ui-dark","embed-iframe","bulma","bulma-light","bulma-dark"].includes(e.theme)&&u(`Invalid theme "${e.theme}"`);for(const t in e)Gt(t),e.toast&&Qt(t),en(t)};function nn(e){const t=y(),n=C(),o=he.innerParams.get(this);if(!n||N(n,o.hideClass.popup))return void u("You're trying to update the closed or closing popup, that won't work. Use the update() method in preConfirm parameter or show a new popup.");const i=on(e),s=Object.assign({},o,i);tn(s),t&&(t.dataset.swal2Theme=s.theme),Fe(this,s),he.innerParams.set(this,s),Object.defineProperties(this,{params:{value:Object.assign({},this.params,e),writable:!1,enumerable:!0}})}const on=e=>{const t={};return Object.keys(e).forEach(n=>{if(Zt(n)){const o=e;t[n]=o[n]}else u(`Invalid parameter to update: ${n}`)}),t};function sn(){var e;const t=he.domCache.get(this),n=he.innerParams.get(this);n?(t.popup&&o.swalCloseEventFinishedCallback&&(o.swalCloseEventFinishedCallback(),delete o.swalCloseEventFinishedCallback),"function"==typeof n.didDestroy&&n.didDestroy(),null===(e=o.eventEmitter)||void 0===e||e.emit("didDestroy"),rn(this)):an(this)}const rn=e=>{an(e),delete e.params,delete o.keydownHandler,delete o.keydownTarget,delete o.currentInstance},an=e=>{e.isAwaitingPromise?(ln(he,e),e.isAwaitingPromise=!0):(ln(tt,e),ln(he,e),delete e.isAwaitingPromise,delete e.disableButtons,delete e.enableButtons,delete e.getInput,delete e.disableInput,delete e.enableInput,delete e.hideLoading,delete e.disableLoading,delete e.showValidationMessage,delete e.resetValidationMessage,delete e.close,delete e.closePopup,delete e.closeModal,delete e.closeToast,delete e.rejectPromise,delete e.update,delete e._destroy)},ln=(e,t)=>{for(const n in e)e[n].delete(t)};var cn=Object.freeze({__proto__:null,_destroy:sn,close:dt,closeModal:dt,closePopup:dt,closeToast:dt,disableButtons:Nt,disableInput:Rt,disableLoading:jt,enableButtons:qt,enableInput:_t,getInput:It,handleAwaitingPromise:ht,hideLoading:jt,rejectPromise:mt,resetValidationMessage:Ut,showValidationMessage:Ft,update:nn});const un=(e,t,n)=>{t.popup.onclick=()=>{e&&(dn(e)||e.timer||e.input)||n(ze.close)}},dn=e=>Boolean(e.showConfirmButton||e.showDenyButton||e.showCancelButton||e.showCloseButton);let pn=!1;const mn=e=>{e.popup.onmousedown=()=>{e.container.onmouseup=function(t){e.container.onmouseup=()=>{},t.target===e.container&&(pn=!0)}}},hn=e=>{e.container.onmousedown=t=>{t.target===e.container&&t.preventDefault(),e.popup.onmouseup=function(t){e.popup.onmouseup=()=>{},(t.target===e.popup||t.target instanceof HTMLElement&&e.popup.contains(t.target))&&(pn=!0)}}},gn=(e,t,n)=>{t.container.onclick=o=>{pn?pn=!1:o.target===t.container&&h(e.allowOutsideClick)&&n(ze.backdrop)}},fn=e=>e instanceof Element||(e=>"object"==typeof e&&null!==e&&"jquery"in e)(e);const bn=()=>{if(o.timeout)return(()=>{const e=j();if(!e)return;const t=parseInt(window.getComputedStyle(e).width);e.style.removeProperty("transition"),e.style.width="100%";const n=t/parseInt(window.getComputedStyle(e).width)*100;e.style.width=`${n}%`})(),o.timeout.stop()},yn=()=>{if(o.timeout){const e=o.timeout.start();return oe(e),e}};let vn=!1;const wn={};const Cn=e=>{for(let t=e.target;t&&t!==document;t=t.parentNode)for(const e in wn){const n=t.getAttribute&&t.getAttribute(e);if(n)return void wn[e].fire({template:n})}};o.eventEmitter=new class{constructor(){this.events={}}_getHandlersByEventName(e){return void 0===this.events[e]&&(this.events[e]=[]),this.events[e]}on(e,t){const n=this._getHandlersByEventName(e);n.includes(t)||n.push(t)}once(e,t){const n=(...o)=>{this.removeListener(e,n),t.apply(this,o)};this.on(e,n)}emit(e,...t){this._getHandlersByEventName(e).forEach(e=>{try{e.apply(this,t)}catch(e){console.error(e)}})}removeListener(e,t){const n=this._getHandlersByEventName(e),o=n.indexOf(t);o>-1&&n.splice(o,1)}removeAllListeners(e){void 0!==this.events[e]&&(this.events[e].length=0)}reset(){this.events={}}};var An=Object.freeze({__proto__:null,argsToParams:e=>{const t={};return"object"!=typeof e[0]||fn(e[0])?["title","html","icon"].forEach((n,o)=>{const i=e[o];"string"==typeof i||fn(i)?t[n]=i:void 0!==i&&d(`Unexpected type of ${n}! Expected "string" or "Element", got ${typeof i}`)}):Object.assign(t,e[0]),t},bindClickHandler:function(e="data-swal-template"){wn[e]=this,vn||(document.body.addEventListener("click",Cn),vn=!0)},clickCancel:()=>{var e;return null===(e=x())||void 0===e?void 0:e.click()},clickConfirm:Ue,clickDeny:()=>{var e;return null===(e=T())||void 0===e?void 0:e.click()},enableLoading:vt,fire:function(...e){return new this(...e)},getActions:O,getCancelButton:x,getCloseButton:H,getConfirmButton:P,getContainer:y,getDenyButton:T,getFocusableElements:I,getFooter:M,getHtmlContainer:k,getIcon:A,getIconContent:()=>w(r["icon-content"]),getImage:B,getInputLabel:()=>w(r["input-label"]),getLoader:S,getPopup:C,getProgressSteps:$,getTimerLeft:()=>o.timeout&&o.timeout.getTimerLeft(),getTimerProgressBar:j,getTitle:E,getValidationMessage:L,increaseTimer:e=>{if(o.timeout){const t=o.timeout.increase(e);return oe(t,!0),t}},isDeprecatedParameter:Jt,isLoading:()=>{const e=C();return!!e&&e.hasAttribute("data-loading")},isTimerRunning:()=>Boolean(o.timeout&&o.timeout.isRunning()),isUpdatableParameter:Zt,isValidParameter:Xt,isVisible:()=>ee(C()),mixin:function(e){return class extends(this){_main(t,n){return super._main(t,Object.assign({},e,n))}}},off:(e,t)=>{o.eventEmitter&&(e?t?o.eventEmitter.removeListener(e,t):o.eventEmitter.removeAllListeners(e):o.eventEmitter.reset())},on:(e,t)=>{o.eventEmitter&&o.eventEmitter.on(e,t)},once:(e,t)=>{o.eventEmitter&&o.eventEmitter.once(e,t)},resumeTimer:yn,showLoading:vt,stopTimer:bn,toggleTimer:()=>{const e=o.timeout;return e&&(e.running?bn():yn())}});class En{constructor(e,t){this.callback=e,this.remaining=t,this.running=!1,this.start()}start(){return this.running||(this.running=!0,this.started=new Date,this.id=setTimeout(this.callback,this.remaining)),this.remaining}stop(){return this.started&&this.running&&(this.running=!1,clearTimeout(this.id),this.remaining-=(new Date).getTime()-this.started.getTime()),this.remaining}increase(e){const t=this.running;return t&&this.stop(),this.remaining+=e,t&&this.start(),this.remaining}getTimerLeft(){return this.running&&(this.stop(),this.start()),this.remaining}isRunning(){return this.running}}const kn=["swal-title","swal-html","swal-footer"],Bn=e=>{const t={};return Array.from(e.querySelectorAll("swal-param")).forEach(e=>{Mn(e,["name","value"]);const n=e.getAttribute("name"),o=e.getAttribute("value");n&&o&&(t[n]=n in zt&&"boolean"==typeof zt[n]?"false"!==o:n in zt&&"object"==typeof zt[n]?JSON.parse(o):o)}),t},$n=e=>{const t={};return Array.from(e.querySelectorAll("swal-function-param")).forEach(e=>{const n=e.getAttribute("name"),o=e.getAttribute("value");n&&o&&(t[n]=new Function(`return ${o}`)())}),t},Ln=e=>{const t={};return Array.from(e.querySelectorAll("swal-button")).forEach(e=>{Mn(e,["type","color","aria-label"]);const n=e.getAttribute("type");if(n&&["confirm","cancel","deny"].includes(n)){if(t[`${n}ButtonText`]=e.innerHTML,t[`show${c(n)}Button`]=!0,e.hasAttribute("color")){const o=e.getAttribute("color");null!==o&&(t[`${n}ButtonColor`]=o)}if(e.hasAttribute("aria-label")){const o=e.getAttribute("aria-label");null!==o&&(t[`${n}ButtonAriaLabel`]=o)}}}),t},Pn=e=>{const t={},n=e.querySelector("swal-image");return n&&(Mn(n,["src","width","height","alt"]),n.hasAttribute("src")&&(t.imageUrl=n.getAttribute("src")||void 0),n.hasAttribute("width")&&(t.imageWidth=n.getAttribute("width")||void 0),n.hasAttribute("height")&&(t.imageHeight=n.getAttribute("height")||void 0),n.hasAttribute("alt")&&(t.imageAlt=n.getAttribute("alt")||void 0)),t},xn=e=>{const t={},n=e.querySelector("swal-icon");return n&&(Mn(n,["type","color"]),n.hasAttribute("type")&&(t.icon=n.getAttribute("type")),n.hasAttribute("color")&&(t.iconColor=n.getAttribute("color")),t.iconHtml=n.innerHTML),t},Tn=e=>{const t={},n=e.querySelector("swal-input");n&&(Mn(n,["type","label","placeholder","value"]),t.input=n.getAttribute("type")||"text",n.hasAttribute("label")&&(t.inputLabel=n.getAttribute("label")),n.hasAttribute("placeholder")&&(t.inputPlaceholder=n.getAttribute("placeholder")),n.hasAttribute("value")&&(t.inputValue=n.getAttribute("value")));const o=Array.from(e.querySelectorAll("swal-input-option"));return o.length&&(t.inputOptions={},o.forEach(e=>{Mn(e,["value"]);const n=e.getAttribute("value");if(!n)return;const o=e.innerHTML;t.inputOptions[n]=o})),t},Sn=(e,t)=>{const n={};for(const o in t){const i=t[o],s=e.querySelector(i);s&&(Mn(s,[]),n[i.replace(/^swal-/,"")]=s.innerHTML.trim())}return n},On=e=>{const t=kn.concat(["swal-param","swal-function-param","swal-button","swal-image","swal-icon","swal-input","swal-input-option"]);Array.from(e.children).forEach(e=>{const n=e.tagName.toLowerCase();t.includes(n)||u(`Unrecognized element <${n}>`)})},Mn=(e,t)=>{Array.from(e.attributes).forEach(n=>{-1===t.indexOf(n.name)&&u([`Unrecognized attribute "${n.name}" on <${e.tagName.toLowerCase()}>.`,""+(t.length?`Allowed attributes are: ${t.join(", ")}`:"To set the value, use HTML within the element.")])})},jn=e=>{var t,n;const i=y(),s=C();if(!i||!s)return;"function"==typeof e.willOpen&&e.willOpen(s),null===(t=o.eventEmitter)||void 0===t||t.emit("willOpen",s);const r=window.getComputedStyle(document.body).overflowY;if(Vn(i,s,e),setTimeout(()=>{In(i,s)},10),D()&&(Dn(i,void 0!==e.scrollbarPadding&&e.scrollbarPadding,r),(()=>{const e=y();Array.from(document.body.children).forEach(t=>{t.contains(e)||(t.hasAttribute("aria-hidden")&&t.setAttribute("data-previous-aria-hidden",t.getAttribute("aria-hidden")||""),t.setAttribute("aria-hidden","true"))})})()),V()||o.previousActiveElement||(o.previousActiveElement=document.activeElement),"function"==typeof e.didOpen){const t=e.didOpen;setTimeout(()=>t(s))}null===(n=o.eventEmitter)||void 0===n||n.emit("didOpen",s)},Hn=e=>{const t=C();if(!t||e.target!==t)return;const n=y();n&&(t.removeEventListener("animationend",Hn),t.removeEventListener("transitionend",Hn),n.style.overflowY="auto",W(n,r["no-transition"]))},In=(e,t)=>{ne(t)?(e.style.overflowY="hidden",t.addEventListener("animationend",Hn),t.addEventListener("transitionend",Hn)):e.style.overflowY="auto"},Dn=(e,t,n)=>{(()=>{if(ot&&!N(document.body,r.iosfix)){const e=document.body.scrollTop;document.body.style.top=-1*e+"px",z(document.body,r.iosfix),it()}})(),t&&"hidden"!==n&&ct(n),setTimeout(()=>{e.scrollTop=0})},Vn=(e,t,n)=>{var o;null!==(o=n.showClass)&&void 0!==o&&o.backdrop&&z(e,n.showClass.backdrop),n.animation?(t.style.setProperty("opacity","0","important"),X(t,"grid"),setTimeout(()=>{var e;null!==(e=n.showClass)&&void 0!==e&&e.popup&&z(t,n.showClass.popup),t.style.removeProperty("opacity")},10)):X(t,"grid"),z([document.documentElement,document.body],r.shown),n.heightAuto&&n.backdrop&&!n.toast&&z([document.documentElement,document.body],r["height-auto"])};var qn=(e,t)=>/^[a-zA-Z0-9.+_'-]+@[a-zA-Z0-9.-]+\.[a-zA-Z0-9-]+$/.test(e)?Promise.resolve():Promise.resolve(t||"Invalid email address"),Nn=(e,t)=>/^https?:\/\/(www\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\.[a-z]{2,63}\b([-a-zA-Z0-9@:%_+.~#?&/=]*)$/.test(e)?Promise.resolve():Promise.resolve(t||"Invalid URL");function _n(e){!function(e){e.inputValidator||("email"===e.input&&(e.inputValidator=qn),"url"===e.input&&(e.inputValidator=Nn))}(e),e.showLoaderOnConfirm&&!e.preConfirm&&u("showLoaderOnConfirm is set to true, but preConfirm is not defined.\nshowLoaderOnConfirm should be used together with preConfirm, see usage example:\nhttps://sweetalert2.github.io/#ajax-request"),function(e){(!e.target||"string"==typeof e.target&&!document.querySelector(e.target)||"string"!=typeof e.target&&!e.target.appendChild)&&(u('Target parameter is not valid, defaulting to "body"'),e.target="body")}(e),"string"==typeof e.title&&(e.title=e.title.split("\n").join("
                    ")),re(e)}let Rn;var Fn=new WeakMap;class Un{constructor(...t){if(n(this,Fn,Promise.resolve({isConfirmed:!1,isDenied:!1,isDismissed:!0})),"undefined"==typeof window)return;Rn=this;const o=Object.freeze(this.constructor.argsToParams(t));var i,s,r;this.params=o,this.isAwaitingPromise=!1,i=Fn,s=this,r=this._main(Rn.params),i.set(e(i,s),r)}_main(e,t={}){if(tn(Object.assign({},t,e)),o.currentInstance){const e=tt.swalPromiseResolve.get(o.currentInstance),{isAwaitingPromise:t}=o.currentInstance;o.currentInstance._destroy(),t||e({isDismissed:!0}),D()&&nt()}o.currentInstance=Rn;const n=Wn(e,t);_n(n),Object.freeze(n),o.timeout&&(o.timeout.stop(),delete o.timeout),clearTimeout(o.restoreFocusTimeout);const i=Kn(Rn);return Fe(Rn,n),he.innerParams.set(Rn,n),zn(Rn,i,n)}then(e){return t(Fn,this).then(e)}finally(e){return t(Fn,this).finally(e)}}const zn=(e,t,n)=>new Promise((i,s)=>{const r=t=>{e.close({isDismissed:!0,dismiss:t,isConfirmed:!1,isDenied:!1})};tt.swalPromiseResolve.set(e,i),tt.swalPromiseReject.set(e,s),t.confirmButton.onclick=()=>{(e=>{const t=he.innerParams.get(e);e.disableButtons(),t.input?Pt(e,"confirm"):Mt(e,!0)})(e)},t.denyButton.onclick=()=>{(e=>{const t=he.innerParams.get(e);e.disableButtons(),t.returnInputValueOnDeny?Pt(e,"deny"):Tt(e,!1)})(e)},t.cancelButton.onclick=()=>{((e,t)=>{e.disableButtons(),t(ze.cancel)})(e,r)},t.closeButton.onclick=()=>{r(ze.close)},((e,t,n)=>{e.toast?un(e,t,n):(mn(t),hn(t),gn(e,t,n))})(n,t,r),((e,t,n)=>{if(We(e),!t.toast){const o=e=>Ze(t,e,n);e.keydownHandler=o;const i=t.keydownListenerCapture?window:C();if(i){e.keydownTarget=i,e.keydownListenerCapture=t.keydownListenerCapture;const n=o;e.keydownTarget.addEventListener("keydown",n,{capture:e.keydownListenerCapture}),e.keydownHandlerAdded=!0}}})(o,n,r),((e,t)=>{"select"===t.input||"radio"===t.input?kt(e,t):["text","email","number","tel","textarea"].some(e=>e===t.input)&&(g(t.inputValue)||b(t.inputValue))&&(vt(P()),Bt(e,t))})(e,n),jn(n),Yn(o,n,r),Xn(t,n),setTimeout(()=>{t.container.scrollTop=0})}),Wn=(e,t)=>{const n=(e=>{const t="string"==typeof e.template?document.querySelector(e.template):e.template;if(!t)return{};const n=t.content;return On(n),Object.assign(Bn(n),$n(n),Ln(n),Pn(n),xn(n),Tn(n),Sn(n,kn))})(e),o=Object.assign({},zt,t,n,e);return o.showClass=Object.assign({},zt.showClass,o.showClass),o.hideClass=Object.assign({},zt.hideClass,o.hideClass),!1===o.animation&&(o.showClass={backdrop:"swal2-noanimation"},o.hideClass={}),o},Kn=e=>{const t={popup:C(),container:y(),actions:O(),confirmButton:P(),denyButton:T(),cancelButton:x(),loader:S(),closeButton:H(),validationMessage:L(),progressSteps:$()};return he.domCache.set(e,t),t},Yn=(e,t,n)=>{const o=j();Z(o),t.timer&&(e.timeout=new En(()=>{n("timer"),delete e.timeout},t.timer),t.timerProgressBar&&o&&(X(o),_(o,t,"timerProgressBar"),setTimeout(()=>{e.timeout&&e.timeout.running&&oe(t.timer)})))},Xn=(e,t)=>{if(!t.toast)return h(t.allowEnterKey)?void(Zn(e)||Jn(e,t)||Ke(-1,1)):(m("allowEnterKey"),void Gn())},Zn=e=>{const t=Array.from(e.popup.querySelectorAll("[autofocus]"));for(const e of t)if(e instanceof HTMLElement&&ee(e))return e.focus(),!0;return!1},Jn=(e,t)=>t.focusDeny&&ee(e.denyButton)?(e.denyButton.focus(),!0):t.focusCancel&&ee(e.cancelButton)?(e.cancelButton.focus(),!0):!(!t.focusConfirm||!ee(e.confirmButton))&&(e.confirmButton.focus(),!0),Gn=()=>{document.activeElement instanceof HTMLElement&&"function"==typeof document.activeElement.blur&&document.activeElement.blur()};Un.prototype.disableButtons=Nt,Un.prototype.enableButtons=qt,Un.prototype.getInput=It,Un.prototype.disableInput=Rt,Un.prototype.enableInput=_t,Un.prototype.hideLoading=jt,Un.prototype.disableLoading=jt,Un.prototype.showValidationMessage=Ft,Un.prototype.resetValidationMessage=Ut,Un.prototype.close=dt,Un.prototype.closePopup=dt,Un.prototype.closeModal=dt,Un.prototype.closeToast=dt,Un.prototype.rejectPromise=mt,Un.prototype.update=nn,Un.prototype._destroy=sn,Object.assign(Un,An),Object.keys(cn).forEach(e=>{Un[e]=function(...t){if(Rn&&Rn[e])return Rn[e](...t)}}),Un.DismissReason=ze,Un.version="11.26.18";const Qn=Un;return Qn.default=Qn,Qn}),void 0!==this&&this.Sweetalert2&&(this.swal=this.sweetAlert=this.Swal=this.SweetAlert=this.Sweetalert2); diff --git a/public/assets/sweetalert2/package.json b/public/assets/sweetalert2/package.json new file mode 100644 index 0000000..fff1154 --- /dev/null +++ b/public/assets/sweetalert2/package.json @@ -0,0 +1,87 @@ +{ + "name": "sweetalert2", + "version": "11.26.18", + "repository": { + "type": "git", + "url": "git+https://github.com/sweetalert2/sweetalert2.git" + }, + "homepage": "https://sweetalert2.github.io/", + "description": "A beautiful, responsive, customizable and accessible (WAI-ARIA) replacement for JavaScript's popup boxes, supported fork of sweetalert", + "main": "dist/sweetalert2.all.js", + "browser": "dist/sweetalert2.all.js", + "module": "dist/sweetalert2.esm.all.js", + "types": "sweetalert2.d.ts", + "devDependencies": { + "@babel/core": "^7.19.6", + "@babel/preset-env": "^7.19.4", + "@rollup/plugin-babel": "^6.0.2", + "@rollup/plugin-terser": "^0.4.0", + "@sweetalert2/eslint-config": "^1.0.11", + "@sweetalert2/stylelint-config": "^3.0.0", + "cypress": "^15.0.0", + "eslint": "^9.0.0", + "eslint-plugin-cypress": "^5.0.0", + "eslint-plugin-jsdoc": "^62.0.1", + "eslint-plugin-no-unsanitized": "^4.0.1", + "jquery": "^3.6.1", + "playwright-webkit": "^1.37.1", + "prettier": "^3.0.0", + "rollup": "^4.0.0", + "sass": "^1.83.0", + "stylelint": "^17.0.0", + "typescript": "4.8.4", + "vite": "^7.0.0", + "zx": "^8.0.0" + }, + "devDependenciesComments": { + "typescript": "Do not upgrade TS, tests will verify that types work with the very first version of TS >= 4.8.4" + }, + "files": [ + "dist", + "src", + "themes", + "sweetalert2.d.ts" + ], + "author": "Limon Monte (https://limonte.github.io)", + "contributors": [ + "Matthew Francis Brunetti (https://github.com/zenflow)", + "Morgan Touverey-Quilling (https://github.com/toverux)", + "Giuseppe Verni (https://github.com/gverni)", + "Sam Turrell (https://github.com/samturrell)", + "Joseph Schultz (https://github.com/acupofjose)", + "Johan Fagerberg (https://github.com/birjolaxew)" + ], + "keywords": [ + "sweetalert", + "sweetalert2", + "alert", + "modal", + "popup", + "prompt", + "confirm", + "toast", + "accessible" + ], + "scripts": { + "dev": "vite test/sandbox --open", + "lint": "stylelint src/*.scss themes/*.css && eslint src cypress tools *.js *.ts && prettier --check src/**/*.js cypress/**/*.js *.js", + "build": "zx tools/build.mjs", + "test": "cypress run --headless", + "check-types": "npx -p typescript@latest tsc --noEmit --lib dom,es2018 -p jsconfig.json", + "cypress:open": "cypress open", + "webpack-build": "webpack --config=test/webpack/webpack.config.js" + }, + "funding": { + "type": "individual", + "url": "https://github.com/sponsors/limonte" + }, + "prettier": { + "printWidth": 120, + "semi": false, + "singleQuote": true, + "quoteProps": "consistent", + "trailingComma": "es5" + }, + "bugs": "https://github.com/sweetalert2/sweetalert2/issues", + "license": "MIT" +} diff --git a/public/assets/sweetalert2/src/SweetAlert.js b/public/assets/sweetalert2/src/SweetAlert.js new file mode 100644 index 0000000..fc6ad41 --- /dev/null +++ b/public/assets/sweetalert2/src/SweetAlert.js @@ -0,0 +1,355 @@ +import { handleCancelButtonClick, handleConfirmButtonClick, handleDenyButtonClick } from './buttons-handlers.js' +import globalState from './globalState.js' +import * as instanceMethods from './instanceMethods.js' +import { addKeydownHandler, setFocus } from './keydown-handler.js' +import { handlePopupClick } from './popup-click-handler.js' +import privateMethods from './privateMethods.js' +import privateProps from './privateProps.js' +import * as staticMethods from './staticMethods.js' +import { DismissReason } from './utils/DismissReason.js' +import Timer from './utils/Timer.js' +import { unsetAriaHidden } from './utils/aria.js' +import * as dom from './utils/dom/index.js' +import { handleInputOptionsAndValue } from './utils/dom/inputUtils.js' +import { getTemplateParams } from './utils/getTemplateParams.js' +import { openPopup } from './utils/openPopup.js' +import defaultParams, { showWarningsForParams } from './utils/params.js' +import setParameters from './utils/setParameters.js' +import { callIfFunction, warnAboutDeprecation } from './utils/utils.js' + +/** @type {SweetAlert} */ +let currentInstance + +export class SweetAlert { + /** + * @type {Promise} + */ + #promise = /** @type {Promise} */ (Promise.resolve({ isConfirmed: false, isDenied: false, isDismissed: true })) + + /** + * @param {...(SweetAlertOptions | string)} args + * @this {SweetAlert} + */ + constructor(...args) { + // Prevent run in Node env + if (typeof window === 'undefined') { + return + } + + currentInstance = this + + // @ts-ignore + const outerParams = Object.freeze(this.constructor.argsToParams(args)) + + /** @type {Readonly} */ + this.params = outerParams + + /** @type {boolean} */ + this.isAwaitingPromise = false + + this.#promise = this._main(currentInstance.params) + } + + /** + * @param {any} userParams + * @param {any} mixinParams + */ + _main(userParams, mixinParams = {}) { + showWarningsForParams(Object.assign({}, mixinParams, userParams)) + + if (globalState.currentInstance) { + const swalPromiseResolve = privateMethods.swalPromiseResolve.get(globalState.currentInstance) + const { isAwaitingPromise } = globalState.currentInstance + globalState.currentInstance._destroy() + if (!isAwaitingPromise) { + swalPromiseResolve({ isDismissed: true }) + } + if (dom.isModal()) { + unsetAriaHidden() + } + } + + globalState.currentInstance = currentInstance + + const innerParams = prepareParams(userParams, mixinParams) + setParameters(innerParams) + Object.freeze(innerParams) + + // clear the previous timer + if (globalState.timeout) { + globalState.timeout.stop() + delete globalState.timeout + } + + // clear the restore focus timeout + clearTimeout(globalState.restoreFocusTimeout) + + const domCache = populateDomCache(currentInstance) + + dom.render(currentInstance, innerParams) + + privateProps.innerParams.set(currentInstance, innerParams) + + return swalPromise(currentInstance, domCache, innerParams) + } + + // `catch` cannot be the name of a module export, so we define our thenable methods here instead + /** + * @param {any} onFulfilled + */ + then(onFulfilled) { + return this.#promise.then(onFulfilled) + } + + /** + * @param {any} onFinally + */ + finally(onFinally) { + return this.#promise.finally(onFinally) + } +} + +/** + * @param {SweetAlert} instance + * @param {DomCache} domCache + * @param {SweetAlertOptions} innerParams + * @returns {Promise} + */ +const swalPromise = (instance, domCache, innerParams) => { + return new Promise((resolve, reject) => { + // functions to handle all closings/dismissals + /** + * @param {DismissReason} dismiss + */ + const dismissWith = (dismiss) => { + instance.close({ isDismissed: true, dismiss, isConfirmed: false, isDenied: false }) + } + + privateMethods.swalPromiseResolve.set(instance, resolve) + privateMethods.swalPromiseReject.set(instance, reject) + + domCache.confirmButton.onclick = () => { + handleConfirmButtonClick(instance) + } + + domCache.denyButton.onclick = () => { + handleDenyButtonClick(instance) + } + + domCache.cancelButton.onclick = () => { + handleCancelButtonClick(instance, dismissWith) + } + + domCache.closeButton.onclick = () => { + dismissWith(DismissReason.close) + } + + handlePopupClick(innerParams, domCache, dismissWith) + + addKeydownHandler(globalState, innerParams, dismissWith) + + handleInputOptionsAndValue(instance, innerParams) + + openPopup(innerParams) + + setupTimer(globalState, innerParams, dismissWith) + + initFocus(domCache, innerParams) + + // Scroll container to top on open (#1247, #1946) + setTimeout(() => { + domCache.container.scrollTop = 0 + }) + }) +} + +/** + * @param {SweetAlertOptions} userParams + * @param {SweetAlertOptions} mixinParams + * @returns {SweetAlertOptions} + */ +const prepareParams = (userParams, mixinParams) => { + const templateParams = getTemplateParams(userParams) + const params = Object.assign({}, defaultParams, mixinParams, templateParams, userParams) // precedence is described in #2131 + params.showClass = Object.assign({}, defaultParams.showClass, params.showClass) + params.hideClass = Object.assign({}, defaultParams.hideClass, params.hideClass) + if (params.animation === false) { + params.showClass = { + backdrop: 'swal2-noanimation', + } + params.hideClass = {} + } + return params +} + +/** + * @param {SweetAlert} instance + * @returns {DomCache} + */ +const populateDomCache = (instance) => { + const domCache = /** @type {DomCache} */ ({ + popup: /** @type {HTMLElement} */ (dom.getPopup()), + container: /** @type {HTMLElement} */ (dom.getContainer()), + actions: /** @type {HTMLElement} */ (dom.getActions()), + confirmButton: /** @type {HTMLElement} */ (dom.getConfirmButton()), + denyButton: /** @type {HTMLElement} */ (dom.getDenyButton()), + cancelButton: /** @type {HTMLElement} */ (dom.getCancelButton()), + loader: /** @type {HTMLElement} */ (dom.getLoader()), + closeButton: /** @type {HTMLElement} */ (dom.getCloseButton()), + validationMessage: /** @type {HTMLElement} */ (dom.getValidationMessage()), + progressSteps: /** @type {HTMLElement} */ (dom.getProgressSteps()), + }) + privateProps.domCache.set(instance, domCache) + + return domCache +} + +/** + * @param {GlobalState} globalState + * @param {SweetAlertOptions} innerParams + * @param {(dismiss: DismissReason) => void} dismissWith + */ +const setupTimer = (globalState, innerParams, dismissWith) => { + const timerProgressBar = dom.getTimerProgressBar() + dom.hide(timerProgressBar) + if (innerParams.timer) { + globalState.timeout = new Timer(() => { + dismissWith('timer') + delete globalState.timeout + }, innerParams.timer) + if (innerParams.timerProgressBar && timerProgressBar) { + dom.show(timerProgressBar) + dom.applyCustomClass(timerProgressBar, innerParams, 'timerProgressBar') + setTimeout(() => { + if (globalState.timeout && globalState.timeout.running) { + // timer can be already stopped or unset at this point + dom.animateTimerProgressBar(/** @type {number} */ (innerParams.timer)) + } + }) + } + } +} + +/** + * Initialize focus in the popup: + * + * 1. If `toast` is `true`, don't steal focus from the document. + * 2. Else if there is an [autofocus] element, focus it. + * 3. Else if `focusConfirm` is `true` and confirm button is visible, focus it. + * 4. Else if `focusDeny` is `true` and deny button is visible, focus it. + * 5. Else if `focusCancel` is `true` and cancel button is visible, focus it. + * 6. Else focus the first focusable element in a popup (if any). + * + * @param {DomCache} domCache + * @param {SweetAlertOptions} innerParams + */ +const initFocus = (domCache, innerParams) => { + if (innerParams.toast) { + return + } + // TODO: this is dumb, remove `allowEnterKey` param in the next major version + if (!callIfFunction(innerParams.allowEnterKey)) { + warnAboutDeprecation('allowEnterKey') + blurActiveElement() + return + } + + if (focusAutofocus(domCache)) { + return + } + + if (focusButton(domCache, innerParams)) { + return + } + + setFocus(-1, 1) +} + +/** + * @param {DomCache} domCache + * @returns {boolean} + */ +const focusAutofocus = (domCache) => { + const autofocusElements = Array.from(domCache.popup.querySelectorAll('[autofocus]')) + for (const autofocusElement of autofocusElements) { + if (autofocusElement instanceof HTMLElement && dom.isVisible(autofocusElement)) { + autofocusElement.focus() + return true + } + } + return false +} + +/** + * @param {DomCache} domCache + * @param {SweetAlertOptions} innerParams + * @returns {boolean} + */ +const focusButton = (domCache, innerParams) => { + if (innerParams.focusDeny && dom.isVisible(domCache.denyButton)) { + domCache.denyButton.focus() + return true + } + + if (innerParams.focusCancel && dom.isVisible(domCache.cancelButton)) { + domCache.cancelButton.focus() + return true + } + + if (innerParams.focusConfirm && dom.isVisible(domCache.confirmButton)) { + domCache.confirmButton.focus() + return true + } + + return false +} + +const blurActiveElement = () => { + if (document.activeElement instanceof HTMLElement && typeof document.activeElement.blur === 'function') { + document.activeElement.blur() + } +} + +// Assign instance methods from src/instanceMethods/*.js to prototype +SweetAlert.prototype.disableButtons = instanceMethods.disableButtons +SweetAlert.prototype.enableButtons = instanceMethods.enableButtons +SweetAlert.prototype.getInput = instanceMethods.getInput +SweetAlert.prototype.disableInput = instanceMethods.disableInput +SweetAlert.prototype.enableInput = instanceMethods.enableInput +SweetAlert.prototype.hideLoading = instanceMethods.hideLoading +SweetAlert.prototype.disableLoading = instanceMethods.disableLoading +SweetAlert.prototype.showValidationMessage = instanceMethods.showValidationMessage +SweetAlert.prototype.resetValidationMessage = instanceMethods.resetValidationMessage +SweetAlert.prototype.close = instanceMethods.close +SweetAlert.prototype.closePopup = instanceMethods.closePopup +SweetAlert.prototype.closeModal = instanceMethods.closeModal +SweetAlert.prototype.closeToast = instanceMethods.closeToast +SweetAlert.prototype.rejectPromise = instanceMethods.rejectPromise +SweetAlert.prototype.update = instanceMethods.update +SweetAlert.prototype._destroy = instanceMethods._destroy + +// Assign static methods from src/staticMethods/*.js to constructor +Object.assign(SweetAlert, staticMethods) + +// Proxy to instance methods to constructor, for now, for backwards compatibility +Object.keys(instanceMethods).forEach((key) => { + /** + * @param {...(SweetAlertOptions | string | undefined)} args + * @returns {SweetAlertResult | Promise | undefined} + */ + // @ts-ignore: Dynamic property assignment for backwards compatibility + SweetAlert[key] = function (...args) { + // @ts-ignore + if (currentInstance && currentInstance[key]) { + // @ts-ignore + return currentInstance[key](...args) + } + return undefined + } +}) + +SweetAlert.DismissReason = DismissReason + +SweetAlert.version = '11.26.18' + +export default SweetAlert diff --git a/public/assets/sweetalert2/src/buttons-handlers.js b/public/assets/sweetalert2/src/buttons-handlers.js new file mode 100644 index 0000000..7332138 --- /dev/null +++ b/public/assets/sweetalert2/src/buttons-handlers.js @@ -0,0 +1,177 @@ +import { handleAwaitingPromise } from './instanceMethods/close.js' +import privateProps from './privateProps.js' +import { showLoading } from './staticMethods/showLoading.js' +import { DismissReason } from './utils/DismissReason.js' +import { isVisible } from './utils/dom/domUtils.js' +import { getDenyButton, getValidationMessage } from './utils/dom/getters.js' +import { getInputValue } from './utils/dom/inputUtils.js' +import { asPromise, capitalizeFirstLetter, error } from './utils/utils.js' + +/** + * @param {SweetAlert} instance + */ +export const handleConfirmButtonClick = (instance) => { + const innerParams = privateProps.innerParams.get(instance) + instance.disableButtons() + if (innerParams.input) { + handleConfirmOrDenyWithInput(instance, 'confirm') + } else { + confirm(instance, true) + } +} + +/** + * @param {SweetAlert} instance + */ +export const handleDenyButtonClick = (instance) => { + const innerParams = privateProps.innerParams.get(instance) + instance.disableButtons() + if (innerParams.returnInputValueOnDeny) { + handleConfirmOrDenyWithInput(instance, 'deny') + } else { + deny(instance, false) + } +} + +/** + * @param {SweetAlert} instance + * @param {(dismiss: DismissReason) => void} dismissWith + */ +export const handleCancelButtonClick = (instance, dismissWith) => { + instance.disableButtons() + dismissWith(DismissReason.cancel) +} + +/** + * @param {SweetAlert} instance + * @param {'confirm' | 'deny'} type + */ +const handleConfirmOrDenyWithInput = (instance, type) => { + const innerParams = privateProps.innerParams.get(instance) + if (!innerParams.input) { + error(`The "input" parameter is needed to be set when using returnInputValueOn${capitalizeFirstLetter(type)}`) + return + } + const input = instance.getInput() + const inputValue = getInputValue(instance, innerParams) + if (innerParams.inputValidator) { + handleInputValidator(instance, inputValue, type) + } else if (input && !input.checkValidity()) { + instance.enableButtons() + instance.showValidationMessage(innerParams.validationMessage || input.validationMessage) + } else if (type === 'deny') { + deny(instance, inputValue) + } else { + confirm(instance, inputValue) + } +} + +/** + * @param {SweetAlert} instance + * @param {SweetAlertInputValue} inputValue + * @param {'confirm' | 'deny'} type + */ +const handleInputValidator = (instance, inputValue, type) => { + const innerParams = privateProps.innerParams.get(instance) + instance.disableInput() + const validationPromise = Promise.resolve().then(() => + asPromise(innerParams.inputValidator(inputValue, innerParams.validationMessage)) + ) + validationPromise.then((validationMessage) => { + instance.enableButtons() + instance.enableInput() + if (validationMessage) { + instance.showValidationMessage(validationMessage) + } else if (type === 'deny') { + deny(instance, inputValue) + } else { + confirm(instance, inputValue) + } + }) +} + +/** + * @param {SweetAlert} instance + * @param {*} value + */ +const deny = (instance, value) => { + const innerParams = privateProps.innerParams.get(instance) + + if (innerParams.showLoaderOnDeny) { + showLoading(getDenyButton()) + } + + if (innerParams.preDeny) { + instance.isAwaitingPromise = true // Flagging the instance as awaiting a promise so it's own promise's reject/resolve methods doesn't get destroyed until the result from this preDeny's promise is received + const preDenyPromise = Promise.resolve().then(() => + asPromise(innerParams.preDeny(value, innerParams.validationMessage)) + ) + preDenyPromise + .then((preDenyValue) => { + if (preDenyValue === false) { + instance.hideLoading() + handleAwaitingPromise(instance) + } else { + instance.close( + /** @type SweetAlertResult */ ({ + isDenied: true, + value: typeof preDenyValue === 'undefined' ? value : preDenyValue, + }) + ) + } + }) + .catch((error) => rejectWith(instance, error)) + } else { + instance.close(/** @type SweetAlertResult */ ({ isDenied: true, value })) + } +} + +/** + * @param {SweetAlert} instance + * @param {*} value + */ +const succeedWith = (instance, value) => { + instance.close(/** @type SweetAlertResult */ ({ isConfirmed: true, value })) +} + +/** + * + * @param {SweetAlert} instance + * @param {string} error + */ +const rejectWith = (instance, error) => { + instance.rejectPromise(error) +} + +/** + * + * @param {SweetAlert} instance + * @param {*} value + */ +const confirm = (instance, value) => { + const innerParams = privateProps.innerParams.get(instance) + + if (innerParams.showLoaderOnConfirm) { + showLoading() + } + + if (innerParams.preConfirm) { + instance.resetValidationMessage() + instance.isAwaitingPromise = true // Flagging the instance as awaiting a promise so it's own promise's reject/resolve methods doesn't get destroyed until the result from this preConfirm's promise is received + const preConfirmPromise = Promise.resolve().then(() => + asPromise(innerParams.preConfirm(value, innerParams.validationMessage)) + ) + preConfirmPromise + .then((preConfirmValue) => { + if (isVisible(getValidationMessage()) || preConfirmValue === false) { + instance.hideLoading() + handleAwaitingPromise(instance) + } else { + succeedWith(instance, typeof preConfirmValue === 'undefined' ? value : preConfirmValue) + } + }) + .catch((error) => rejectWith(instance, error)) + } else { + succeedWith(instance, value) + } +} diff --git a/public/assets/sweetalert2/src/constants.js b/public/assets/sweetalert2/src/constants.js new file mode 100644 index 0000000..fda0d51 --- /dev/null +++ b/public/assets/sweetalert2/src/constants.js @@ -0,0 +1 @@ +export const RESTORE_FOCUS_TIMEOUT = 100 diff --git a/public/assets/sweetalert2/src/globalState.js b/public/assets/sweetalert2/src/globalState.js new file mode 100644 index 0000000..f096201 --- /dev/null +++ b/public/assets/sweetalert2/src/globalState.js @@ -0,0 +1,38 @@ +import { RESTORE_FOCUS_TIMEOUT } from './constants.js' + +/** @type {GlobalState} */ +const globalState = {} + +export default globalState + +const focusPreviousActiveElement = () => { + if (globalState.previousActiveElement instanceof HTMLElement) { + globalState.previousActiveElement.focus() + globalState.previousActiveElement = null + } else if (document.body) { + document.body.focus() + } +} + +/** + * Restore previous active (focused) element + * + * @param {boolean} returnFocus + * @returns {Promise} + */ +export const restoreActiveElement = (returnFocus) => { + return new Promise((resolve) => { + if (!returnFocus) { + return resolve() + } + const x = window.scrollX + const y = window.scrollY + + globalState.restoreFocusTimeout = setTimeout(() => { + focusPreviousActiveElement() + resolve() + }, RESTORE_FOCUS_TIMEOUT) // issues/900 + + window.scrollTo(x, y) + }) +} diff --git a/public/assets/sweetalert2/src/instanceMethods.js b/public/assets/sweetalert2/src/instanceMethods.js new file mode 100644 index 0000000..926536c --- /dev/null +++ b/public/assets/sweetalert2/src/instanceMethods.js @@ -0,0 +1,7 @@ +export * from './instanceMethods/hideLoading.js' +export * from './instanceMethods/getInput.js' +export * from './instanceMethods/close.js' +export * from './instanceMethods/enable-disable-elements.js' +export * from './instanceMethods/validation-message.js' +export * from './instanceMethods/update.js' +export * from './instanceMethods/_destroy.js' diff --git a/public/assets/sweetalert2/src/instanceMethods/_destroy.js b/public/assets/sweetalert2/src/instanceMethods/_destroy.js new file mode 100644 index 0000000..a0bb448 --- /dev/null +++ b/public/assets/sweetalert2/src/instanceMethods/_destroy.js @@ -0,0 +1,104 @@ +import globalState from '../globalState.js' +import privateMethods from '../privateMethods.js' +import privateProps from '../privateProps.js' + +/** + * Dispose the current SweetAlert2 instance + * @this {SweetAlert} + */ +export function _destroy() { + const domCache = privateProps.domCache.get(this) + const innerParams = privateProps.innerParams.get(this) + + if (!innerParams) { + disposeWeakMaps(this) // The WeakMaps might have been partly destroyed, we must recall it to dispose any remaining WeakMaps #2335 + return // This instance has already been destroyed + } + + // Check if there is another Swal closing + if (domCache.popup && globalState.swalCloseEventFinishedCallback) { + globalState.swalCloseEventFinishedCallback() + delete globalState.swalCloseEventFinishedCallback + } + + if (typeof innerParams.didDestroy === 'function') { + innerParams.didDestroy() + } + globalState.eventEmitter?.emit('didDestroy') + disposeSwal(this) +} + +/** + * @param {SweetAlert} instance + */ +const disposeSwal = (instance) => { + disposeWeakMaps(instance) + // Unset this.params so GC will dispose it (#1569) + // @ts-ignore + delete instance.params + // Unset globalState props so GC will dispose globalState (#1569) + delete globalState.keydownHandler + delete globalState.keydownTarget + // Unset currentInstance + delete globalState.currentInstance +} + +/** + * @param {SweetAlert} instance + */ +const disposeWeakMaps = (instance) => { + // If the current instance is awaiting a promise result, we keep the privateMethods to call them once the promise result is retrieved #2335 + if (instance.isAwaitingPromise) { + unsetWeakMaps(privateProps, instance) + instance.isAwaitingPromise = true + } else { + unsetWeakMaps(privateMethods, instance) + unsetWeakMaps(privateProps, instance) + + // @ts-ignore + delete instance.isAwaitingPromise + // Unset instance methods + // @ts-ignore + delete instance.disableButtons + // @ts-ignore + delete instance.enableButtons + // @ts-ignore + delete instance.getInput + // @ts-ignore + delete instance.disableInput + // @ts-ignore + delete instance.enableInput + // @ts-ignore + delete instance.hideLoading + // @ts-ignore + delete instance.disableLoading + // @ts-ignore + delete instance.showValidationMessage + // @ts-ignore + delete instance.resetValidationMessage + // @ts-ignore + delete instance.close + // @ts-ignore + delete instance.closePopup + // @ts-ignore + delete instance.closeModal + // @ts-ignore + delete instance.closeToast + // @ts-ignore + delete instance.rejectPromise + // @ts-ignore + delete instance.update + // @ts-ignore + delete instance._destroy + } +} + +/** + * @param {Record>} obj + * @param {SweetAlert} instance + */ +const unsetWeakMaps = (obj, instance) => { + for (const i in obj) { + obj[i].delete(instance) + } +} diff --git a/public/assets/sweetalert2/src/instanceMethods/close.js b/public/assets/sweetalert2/src/instanceMethods/close.js new file mode 100644 index 0000000..c5c36c1 --- /dev/null +++ b/public/assets/sweetalert2/src/instanceMethods/close.js @@ -0,0 +1,229 @@ +import globalState, { restoreActiveElement } from '../globalState.js' +import { removeKeydownHandler } from '../keydown-handler.js' +import privateMethods from '../privateMethods.js' +import privateProps from '../privateProps.js' +import { unsetAriaHidden } from '../utils/aria.js' +import { swalClasses } from '../utils/classes.js' +import * as dom from '../utils/dom/index.js' +import { undoIOSfix } from '../utils/iosFix.js' +import { undoReplaceScrollbarWithPadding } from '../utils/scrollbar.js' +import { isSafariOrIOS } from '../utils/iosFix.js' + +/** + * @param {SweetAlert} instance + * @param {HTMLElement} container + * @param {boolean} returnFocus + * @param {(() => void) | undefined} didClose + */ +function removePopupAndResetState(instance, container, returnFocus, didClose) { + if (dom.isToast()) { + triggerDidCloseAndDispose(instance, didClose) + } else { + restoreActiveElement(returnFocus).then(() => triggerDidCloseAndDispose(instance, didClose)) + removeKeydownHandler(globalState) + } + + // workaround for https://github.com/sweetalert2/sweetalert2/issues/2088 + // for some reason removing the container in Safari will scroll the document to bottom + if (isSafariOrIOS) { + container.setAttribute('style', 'display:none !important') + container.removeAttribute('class') + container.innerHTML = '' + } else { + container.remove() + } + + if (dom.isModal()) { + undoReplaceScrollbarWithPadding() + undoIOSfix() + unsetAriaHidden() + } + + removeBodyClasses() +} + +/** + * Remove SweetAlert2 classes from body + */ +function removeBodyClasses() { + dom.removeClass( + [document.documentElement, document.body], + [swalClasses.shown, swalClasses['height-auto'], swalClasses['no-backdrop'], swalClasses['toast-shown']] + ) +} + +/** + * Instance method to close sweetAlert + * + * @param {SweetAlertResult | undefined} resolveValue + * @this {SweetAlert} + */ +export function close(resolveValue) { + resolveValue = prepareResolveValue(resolveValue) + + const swalPromiseResolve = privateMethods.swalPromiseResolve.get(this) + + const didClose = triggerClosePopup(this) + + if (this.isAwaitingPromise) { + // A swal awaiting for a promise (after a click on Confirm or Deny) cannot be dismissed anymore #2335 + if (!resolveValue.isDismissed) { + handleAwaitingPromise(this) + swalPromiseResolve(resolveValue) + } + } else if (didClose) { + // Resolve Swal promise + swalPromiseResolve(resolveValue) + } +} + +/** + * @param {SweetAlert} instance + * @returns {boolean} + */ +const triggerClosePopup = (instance) => { + const popup = dom.getPopup() + + if (!popup) { + return false + } + + const innerParams = privateProps.innerParams.get(instance) + if (!innerParams || dom.hasClass(popup, innerParams.hideClass.popup)) { + return false + } + + dom.removeClass(popup, innerParams.showClass.popup) + dom.addClass(popup, innerParams.hideClass.popup) + + const backdrop = dom.getContainer() + dom.removeClass(backdrop, innerParams.showClass.backdrop) + dom.addClass(backdrop, innerParams.hideClass.backdrop) + + handlePopupAnimation(instance, popup, innerParams) + + return true +} + +/** + * @param {Error | string} error + * @this {SweetAlert} + */ +export function rejectPromise(error) { + const rejectPromise = privateMethods.swalPromiseReject.get(this) + handleAwaitingPromise(this) + if (rejectPromise) { + // Reject Swal promise + rejectPromise(error) + } +} + +/** + * @param {SweetAlert} instance + */ +export const handleAwaitingPromise = (instance) => { + if (instance.isAwaitingPromise) { + // @ts-ignore + delete instance.isAwaitingPromise + // The instance might have been previously partly destroyed, we must resume the destroy process in this case #2335 + if (!privateProps.innerParams.get(instance)) { + instance._destroy() + } + } +} + +/** + * @param {SweetAlertResult | undefined} resolveValue + * @returns {SweetAlertResult} + */ +const prepareResolveValue = (resolveValue) => { + // When user calls Swal.close() + if (typeof resolveValue === 'undefined') { + return { + isConfirmed: false, + isDenied: false, + isDismissed: true, + } + } + + return Object.assign( + { + isConfirmed: false, + isDenied: false, + isDismissed: false, + }, + resolveValue + ) +} + +/** + * @param {SweetAlert} instance + * @param {HTMLElement} popup + * @param {SweetAlertOptions} innerParams + */ +const handlePopupAnimation = (instance, popup, innerParams) => { + const container = dom.getContainer() + // If animation is supported, animate + const animationIsSupported = dom.hasCssAnimation(popup) + + if (typeof innerParams.willClose === 'function') { + innerParams.willClose(popup) + } + globalState.eventEmitter?.emit('willClose', popup) + + if (animationIsSupported && container) { + animatePopup(instance, popup, container, Boolean(innerParams.returnFocus), innerParams.didClose) + } else if (container) { + // Otherwise, remove immediately + removePopupAndResetState(instance, container, Boolean(innerParams.returnFocus), innerParams.didClose) + } +} + +/** + * @param {SweetAlert} instance + * @param {HTMLElement} popup + * @param {HTMLElement} container + * @param {boolean} returnFocus + * @param {(() => void) | undefined} didClose + */ +const animatePopup = (instance, popup, container, returnFocus, didClose) => { + globalState.swalCloseEventFinishedCallback = removePopupAndResetState.bind( + null, + instance, + container, + returnFocus, + didClose + ) + /** + * @param {AnimationEvent | TransitionEvent} e + */ + const swalCloseAnimationFinished = function (e) { + if (e.target === popup) { + globalState.swalCloseEventFinishedCallback?.() + delete globalState.swalCloseEventFinishedCallback + popup.removeEventListener('animationend', swalCloseAnimationFinished) + popup.removeEventListener('transitionend', swalCloseAnimationFinished) + } + } + popup.addEventListener('animationend', swalCloseAnimationFinished) + popup.addEventListener('transitionend', swalCloseAnimationFinished) +} + +/** + * @param {SweetAlert} instance + * @param {(() => void) | undefined} didClose + */ +const triggerDidCloseAndDispose = (instance, didClose) => { + setTimeout(() => { + if (typeof didClose === 'function') { + didClose.bind(instance.params)() + } + globalState.eventEmitter?.emit('didClose') + // instance might have been destroyed already + if (instance._destroy) { + instance._destroy() + } + }) +} + +export { close as closePopup, close as closeModal, close as closeToast } diff --git a/public/assets/sweetalert2/src/instanceMethods/enable-disable-elements.js b/public/assets/sweetalert2/src/instanceMethods/enable-disable-elements.js new file mode 100644 index 0000000..c8e005a --- /dev/null +++ b/public/assets/sweetalert2/src/instanceMethods/enable-disable-elements.js @@ -0,0 +1,67 @@ +import * as dom from '../utils/dom/index.js' +import privateProps from '../privateProps.js' +import { swalClasses } from '../utils/classes.js' + +/** + * @param {SweetAlert} instance + * @param {string[]} buttons + * @param {boolean} disabled + */ +function setButtonsDisabled(instance, buttons, disabled) { + const domCache = privateProps.domCache.get(instance) + buttons.forEach((button) => { + domCache[button].disabled = disabled + }) +} + +/** + * @param {HTMLInputElement | null} input + * @param {boolean} disabled + */ +function setInputDisabled(input, disabled) { + const popup = dom.getPopup() + if (!popup || !input) { + return + } + if (input.type === 'radio') { + /** @type {NodeListOf} */ + const radios = popup.querySelectorAll(`[name="${swalClasses.radio}"]`) + for (let i = 0; i < radios.length; i++) { + radios[i].disabled = disabled + } + } else { + input.disabled = disabled + } +} + +/** + * Enable all the buttons + * @this {SweetAlert} + */ +export function enableButtons() { + setButtonsDisabled(this, ['confirmButton', 'denyButton', 'cancelButton'], false) +} + +/** + * Disable all the buttons + * @this {SweetAlert} + */ +export function disableButtons() { + setButtonsDisabled(this, ['confirmButton', 'denyButton', 'cancelButton'], true) +} + +/** + * Enable the input field + * @this {SweetAlert} + */ +export function enableInput() { + setInputDisabled(this.getInput(), false) +} + +/** + * Disable the input field + * @this {SweetAlert} + */ +export function disableInput() { + setInputDisabled(this.getInput(), true) +} diff --git a/public/assets/sweetalert2/src/instanceMethods/getInput.js b/public/assets/sweetalert2/src/instanceMethods/getInput.js new file mode 100644 index 0000000..74617fa --- /dev/null +++ b/public/assets/sweetalert2/src/instanceMethods/getInput.js @@ -0,0 +1,17 @@ +import privateProps from '../privateProps.js' +import * as dom from '../utils/dom/index.js' + +/** + * Gets the input DOM node, this method works with input parameter. + * + * @returns {HTMLInputElement | null} + * @this {SweetAlert} + */ +export function getInput() { + const innerParams = privateProps.innerParams.get(this) + const domCache = privateProps.domCache.get(this) + if (!domCache) { + return null + } + return dom.getInput(domCache.popup, innerParams.input) +} diff --git a/public/assets/sweetalert2/src/instanceMethods/hideLoading.js b/public/assets/sweetalert2/src/instanceMethods/hideLoading.js new file mode 100644 index 0000000..767f3e0 --- /dev/null +++ b/public/assets/sweetalert2/src/instanceMethods/hideLoading.js @@ -0,0 +1,45 @@ +import privateProps from '../privateProps.js' +import { swalClasses } from '../utils/classes.js' +import * as dom from '../utils/dom/index.js' + +/** + * Hides loader and shows back the button which was hidden by .showLoading() + * @this {SweetAlert} + */ +function hideLoading() { + // do nothing if popup is closed + const innerParams = privateProps.innerParams.get(this) + if (!innerParams) { + return + } + const domCache = privateProps.domCache.get(this) + dom.hide(domCache.loader) + if (dom.isToast()) { + if (innerParams.icon) { + dom.show(dom.getIcon()) + } + } else { + showRelatedButton(domCache) + } + dom.removeClass([domCache.popup, domCache.actions], swalClasses.loading) + domCache.popup.removeAttribute('aria-busy') + domCache.popup.removeAttribute('data-loading') + domCache.confirmButton.disabled = false + domCache.denyButton.disabled = false + domCache.cancelButton.disabled = false +} + +/** + * @param {DomCache} domCache + */ +const showRelatedButton = (domCache) => { + const dataButtonToReplace = domCache.loader.getAttribute('data-button-to-replace') + const buttonToReplace = dataButtonToReplace ? domCache.popup.getElementsByClassName(dataButtonToReplace) : [] + if (buttonToReplace.length) { + dom.show(/** @type {HTMLElement} */ (buttonToReplace[0]), 'inline-block') + } else if (dom.allButtonsAreHidden()) { + dom.hide(domCache.actions) + } +} + +export { hideLoading, hideLoading as disableLoading } diff --git a/public/assets/sweetalert2/src/instanceMethods/update.js b/public/assets/sweetalert2/src/instanceMethods/update.js new file mode 100644 index 0000000..f5469a4 --- /dev/null +++ b/public/assets/sweetalert2/src/instanceMethods/update.js @@ -0,0 +1,60 @@ +import * as dom from '../../src/utils/dom/index.js' +import { isUpdatableParameter, showWarningsForParams } from '../../src/utils/params.js' +import { warn } from '../../src/utils/utils.js' +import privateProps from '../privateProps.js' + +/** + * Updates popup parameters. + * + * @this {any} + * @param {SweetAlertOptions} params + */ +export function update(params) { + const container = dom.getContainer() + const popup = dom.getPopup() + const innerParams = privateProps.innerParams.get(this) + + if (!popup || dom.hasClass(popup, innerParams.hideClass.popup)) { + warn( + `You're trying to update the closed or closing popup, that won't work. Use the update() method in preConfirm parameter or show a new popup.` + ) + return + } + + const validUpdatableParams = filterValidParams(params) + + const updatedParams = Object.assign({}, innerParams, validUpdatableParams) + showWarningsForParams(updatedParams) + + if (container) { + container.dataset['swal2Theme'] = updatedParams.theme + } + dom.render(this, updatedParams) + + privateProps.innerParams.set(this, updatedParams) + Object.defineProperties(this, { + params: { + value: Object.assign({}, this.params, params), + writable: false, + enumerable: true, + }, + }) +} + +/** + * @param {SweetAlertOptions} params + * @returns {SweetAlertOptions} + */ +const filterValidParams = (params) => { + /** @type {Record} */ + const validUpdatableParams = {} + Object.keys(params).forEach((param) => { + if (isUpdatableParameter(param)) { + const typedParams = /** @type {Record} */ (params) + validUpdatableParams[param] = typedParams[param] + } else { + warn(`Invalid parameter to update: ${param}`) + } + }) + return validUpdatableParams +} diff --git a/public/assets/sweetalert2/src/instanceMethods/validation-message.js b/public/assets/sweetalert2/src/instanceMethods/validation-message.js new file mode 100644 index 0000000..52619b8 --- /dev/null +++ b/public/assets/sweetalert2/src/instanceMethods/validation-message.js @@ -0,0 +1,47 @@ +import privateProps from '../privateProps.js' +import { swalClasses } from '../utils/classes.js' +import * as dom from '../utils/dom/index.js' + +/** + * Show block with validation message + * + * @param {string} error + * @this {SweetAlert} + */ +export function showValidationMessage(error) { + const domCache = privateProps.domCache.get(this) + const params = privateProps.innerParams.get(this) + dom.setInnerHtml(domCache.validationMessage, error) + domCache.validationMessage.className = swalClasses['validation-message'] + if (params.customClass && params.customClass.validationMessage) { + dom.addClass(domCache.validationMessage, params.customClass.validationMessage) + } + dom.show(domCache.validationMessage) + + const input = this.getInput() + if (input) { + input.setAttribute('aria-invalid', 'true') + input.setAttribute('aria-describedby', swalClasses['validation-message']) + dom.focusInput(input) + dom.addClass(input, swalClasses.inputerror) + } +} + +/** + * Hide block with validation message + * + * @this {SweetAlert} + */ +export function resetValidationMessage() { + const domCache = privateProps.domCache.get(this) + if (domCache.validationMessage) { + dom.hide(domCache.validationMessage) + } + + const input = this.getInput() + if (input) { + input.removeAttribute('aria-invalid') + input.removeAttribute('aria-describedby') + dom.removeClass(input, swalClasses.inputerror) + } +} diff --git a/public/assets/sweetalert2/src/keydown-handler.js b/public/assets/sweetalert2/src/keydown-handler.js new file mode 100644 index 0000000..a96a9eb --- /dev/null +++ b/public/assets/sweetalert2/src/keydown-handler.js @@ -0,0 +1,222 @@ +import { clickConfirm } from './staticMethods/dom.js' +import { DismissReason } from './utils/DismissReason.js' +import * as dom from './utils/dom/index.js' +import { callIfFunction } from './utils/utils.js' + +/** + * @param {GlobalState} globalState + */ +export const removeKeydownHandler = (globalState) => { + if (globalState.keydownTarget && globalState.keydownHandlerAdded && globalState.keydownHandler) { + const handler = /** @type {EventListenerOrEventListenerObject} */ (/** @type {unknown} */ (globalState.keydownHandler)) + globalState.keydownTarget.removeEventListener('keydown', handler, { + capture: globalState.keydownListenerCapture, + }) + globalState.keydownHandlerAdded = false + } +} + +/** + * @param {GlobalState} globalState + * @param {SweetAlertOptions} innerParams + * @param {(dismiss: DismissReason) => void} dismissWith + */ +export const addKeydownHandler = (globalState, innerParams, dismissWith) => { + removeKeydownHandler(globalState) + if (!innerParams.toast) { + /** @type {(this: HTMLElement, event: KeyboardEvent) => void} */ + const handler = (e) => keydownHandler(innerParams, e, dismissWith) + globalState.keydownHandler = handler + const target = innerParams.keydownListenerCapture ? window : dom.getPopup() + if (target) { + globalState.keydownTarget = target + globalState.keydownListenerCapture = innerParams.keydownListenerCapture + const eventHandler = /** @type {EventListenerOrEventListenerObject} */ (/** @type {unknown} */ (handler)) + globalState.keydownTarget.addEventListener('keydown', eventHandler, { + capture: globalState.keydownListenerCapture, + }) + globalState.keydownHandlerAdded = true + } + } +} + +/** + * @param {number} index + * @param {number} increment + */ +export const setFocus = (index, increment) => { + const focusableElements = dom.getFocusableElements() + // search for visible elements and select the next possible match + if (focusableElements.length) { + index = index + increment + + // shift + tab when .swal2-popup is focused + if (index === -2) { + index = focusableElements.length - 1 + } + + // rollover to first item + if (index === focusableElements.length) { + index = 0 + + // go to last item + } else if (index === -1) { + index = focusableElements.length - 1 + } + + focusableElements[index].focus() + return + } + // no visible focusable elements, focus the popup + dom.getPopup()?.focus() +} + +const arrowKeysNextButton = ['ArrowRight', 'ArrowDown'] + +const arrowKeysPreviousButton = ['ArrowLeft', 'ArrowUp'] + +/** + * @param {SweetAlertOptions} innerParams + * @param {KeyboardEvent} event + * @param {(dismiss: DismissReason) => void} dismissWith + */ +const keydownHandler = (innerParams, event, dismissWith) => { + if (!innerParams) { + return // This instance has already been destroyed + } + + // Ignore keydown during IME composition + // https://developer.mozilla.org/en-US/docs/Web/API/Document/keydown_event#ignoring_keydown_during_ime_composition + // https://github.com/sweetalert2/sweetalert2/issues/720 + // https://github.com/sweetalert2/sweetalert2/issues/2406 + if (event.isComposing || event.keyCode === 229) { + return + } + + if (innerParams.stopKeydownPropagation) { + event.stopPropagation() + } + + // ENTER + if (event.key === 'Enter') { + handleEnter(event, innerParams) + } + + // TAB + else if (event.key === 'Tab') { + handleTab(event) + } + + // ARROWS - switch focus between buttons + else if ([...arrowKeysNextButton, ...arrowKeysPreviousButton].includes(event.key)) { + handleArrows(event.key) + } + + // ESC + else if (event.key === 'Escape') { + handleEsc(event, innerParams, dismissWith) + } +} + +/** + * @param {KeyboardEvent} event + * @param {SweetAlertOptions} innerParams + */ +const handleEnter = (event, innerParams) => { + // https://github.com/sweetalert2/sweetalert2/issues/2386 + if (!callIfFunction(innerParams.allowEnterKey)) { + return + } + + const popup = dom.getPopup() + if (!popup || !innerParams.input) { + return + } + + const input = dom.getInput(popup, innerParams.input) + + if (event.target && input && event.target instanceof HTMLElement && event.target.outerHTML === input.outerHTML) { + if (['textarea', 'file'].includes(innerParams.input)) { + return // do not submit + } + + clickConfirm() + event.preventDefault() + } +} + +/** + * @param {KeyboardEvent} event + */ +const handleTab = (event) => { + const targetElement = event.target + + const focusableElements = dom.getFocusableElements() + let btnIndex = -1 + for (let i = 0; i < focusableElements.length; i++) { + if (targetElement === focusableElements[i]) { + btnIndex = i + break + } + } + + // Cycle to the next button + if (!event.shiftKey) { + setFocus(btnIndex, 1) + } + + // Cycle to the prev button + else { + setFocus(btnIndex, -1) + } + + event.stopPropagation() + event.preventDefault() +} + +/** + * @param {string} key + */ +const handleArrows = (key) => { + const actions = dom.getActions() + const confirmButton = dom.getConfirmButton() + const denyButton = dom.getDenyButton() + const cancelButton = dom.getCancelButton() + if (!actions || !confirmButton || !denyButton || !cancelButton) { + return + } + /** @type HTMLElement[] */ + const buttons = [confirmButton, denyButton, cancelButton] + if (document.activeElement instanceof HTMLElement && !buttons.includes(document.activeElement)) { + return + } + const sibling = arrowKeysNextButton.includes(key) ? 'nextElementSibling' : 'previousElementSibling' + let buttonToFocus = document.activeElement + if (!buttonToFocus) { + return + } + for (let i = 0; i < actions.children.length; i++) { + buttonToFocus = buttonToFocus[sibling] + if (!buttonToFocus) { + return + } + if (buttonToFocus instanceof HTMLButtonElement && dom.isVisible(buttonToFocus)) { + break + } + } + if (buttonToFocus instanceof HTMLButtonElement) { + buttonToFocus.focus() + } +} + +/** + * @param {KeyboardEvent} event + * @param {SweetAlertOptions} innerParams + * @param {(dismiss: DismissReason) => void} dismissWith + */ +const handleEsc = (event, innerParams, dismissWith) => { + event.preventDefault() + if (callIfFunction(innerParams.allowEscapeKey)) { + dismissWith(DismissReason.esc) + } +} diff --git a/public/assets/sweetalert2/src/popup-click-handler.js b/public/assets/sweetalert2/src/popup-click-handler.js new file mode 100644 index 0000000..0dacb4c --- /dev/null +++ b/public/assets/sweetalert2/src/popup-click-handler.js @@ -0,0 +1,104 @@ +import { DismissReason } from './utils/DismissReason.js' +import { callIfFunction } from './utils/utils.js' + +/** + * @param {SweetAlertOptions} innerParams + * @param {DomCache} domCache + * @param {(dismiss: DismissReason) => void} dismissWith + */ +export const handlePopupClick = (innerParams, domCache, dismissWith) => { + if (innerParams.toast) { + handleToastClick(innerParams, domCache, dismissWith) + } else { + // Ignore click events that had mousedown on the popup but mouseup on the container + // This can happen when the user drags a slider + handleModalMousedown(domCache) + + // Ignore click events that had mousedown on the container but mouseup on the popup + handleContainerMousedown(domCache) + + handleModalClick(innerParams, domCache, dismissWith) + } +} + +/** + * @param {SweetAlertOptions} innerParams + * @param {DomCache} domCache + * @param {(dismiss: DismissReason) => void} dismissWith + */ +const handleToastClick = (innerParams, domCache, dismissWith) => { + // Closing toast by internal click + domCache.popup.onclick = () => { + if (innerParams && (isAnyButtonShown(innerParams) || innerParams.timer || innerParams.input)) { + return + } + dismissWith(DismissReason.close) + } +} + +/** + * @param {SweetAlertOptions} innerParams + * @returns {boolean} + */ +const isAnyButtonShown = (innerParams) => { + return Boolean( + innerParams.showConfirmButton || + innerParams.showDenyButton || + innerParams.showCancelButton || + innerParams.showCloseButton + ) +} + +let ignoreOutsideClick = false + +/** + * @param {DomCache} domCache + */ +const handleModalMousedown = (domCache) => { + domCache.popup.onmousedown = () => { + domCache.container.onmouseup = function (e) { + domCache.container.onmouseup = () => {} + // We only check if the mouseup target is the container because usually it doesn't + // have any other direct children aside of the popup + if (e.target === domCache.container) { + ignoreOutsideClick = true + } + } + } +} + +/** + * @param {DomCache} domCache + */ +const handleContainerMousedown = (domCache) => { + domCache.container.onmousedown = (e) => { + // prevent the modal text from being selected on double click on the container (allowOutsideClick: false) + if (e.target === domCache.container) { + e.preventDefault() + } + domCache.popup.onmouseup = function (e) { + domCache.popup.onmouseup = () => {} + // We also need to check if the mouseup target is a child of the popup + if (e.target === domCache.popup || (e.target instanceof HTMLElement && domCache.popup.contains(e.target))) { + ignoreOutsideClick = true + } + } + } +} + +/** + * @param {SweetAlertOptions} innerParams + * @param {DomCache} domCache + * @param {(dismiss: DismissReason) => void} dismissWith + */ +const handleModalClick = (innerParams, domCache, dismissWith) => { + domCache.container.onclick = (e) => { + if (ignoreOutsideClick) { + ignoreOutsideClick = false + return + } + if (e.target === domCache.container && callIfFunction(innerParams.allowOutsideClick)) { + dismissWith(DismissReason.backdrop) + } + } +} diff --git a/public/assets/sweetalert2/src/privateMethods.js b/public/assets/sweetalert2/src/privateMethods.js new file mode 100644 index 0000000..0637a2b --- /dev/null +++ b/public/assets/sweetalert2/src/privateMethods.js @@ -0,0 +1,14 @@ +/** + * This module contains `WeakMap`s for each effectively-"private property" that a `Swal` has. + * For example, to set the private property "foo" of `this` to "bar", you can `privateProps.foo.set(this, 'bar')` + * This is the approach that Babel will probably take to implement private methods/fields + * https://github.com/tc39/proposal-private-methods + * https://github.com/babel/babel/pull/7555 + * Once we have the changes from that PR in Babel, and our core class fits reasonable in *one module* + * then we can use that language feature. + */ + +export default { + swalPromiseResolve: new WeakMap(), + swalPromiseReject: new WeakMap(), +} diff --git a/public/assets/sweetalert2/src/privateProps.js b/public/assets/sweetalert2/src/privateProps.js new file mode 100644 index 0000000..6470194 --- /dev/null +++ b/public/assets/sweetalert2/src/privateProps.js @@ -0,0 +1,14 @@ +/** + * This module contains `WeakMap`s for each effectively-"private property" that a `Swal` has. + * For example, to set the private property "foo" of `this` to "bar", you can `privateProps.foo.set(this, 'bar')` + * This is the approach that Babel will probably take to implement private methods/fields + * https://github.com/tc39/proposal-private-methods + * https://github.com/babel/babel/pull/7555 + * Once we have the changes from that PR in Babel, and our core class fits reasonable in *one module* + * then we can use that language feature. + */ + +export default { + innerParams: new WeakMap(), + domCache: new WeakMap(), +} diff --git a/public/assets/sweetalert2/src/staticMethods.js b/public/assets/sweetalert2/src/staticMethods.js new file mode 100644 index 0000000..5a04ee0 --- /dev/null +++ b/public/assets/sweetalert2/src/staticMethods.js @@ -0,0 +1,9 @@ +export * from './staticMethods/argsToParams.js' +export * from './staticMethods/dom.js' +export * from './staticMethods/fire.js' +export * from './staticMethods/mixin.js' +export * from './staticMethods/showLoading.js' +export * from './staticMethods/timer.js' +export * from './staticMethods/bindClickHandler.js' +export * from './staticMethods/eventHandlers.js' +export { isValidParameter, isUpdatableParameter, isDeprecatedParameter } from './utils/params.js' diff --git a/public/assets/sweetalert2/src/staticMethods/argsToParams.js b/public/assets/sweetalert2/src/staticMethods/argsToParams.js new file mode 100644 index 0000000..cadda4e --- /dev/null +++ b/public/assets/sweetalert2/src/staticMethods/argsToParams.js @@ -0,0 +1,35 @@ +import { error } from '../utils/utils.js' + +/** + * @param {unknown} elem + * @returns {boolean} + */ +const isJqueryElement = (elem) => typeof elem === 'object' && elem !== null && 'jquery' in elem + +/** + * @param {unknown} elem + * @returns {boolean} + */ +const isElement = (elem) => elem instanceof Element || isJqueryElement(elem) + +/** + * @param {ReadonlyArray} args + * @returns {SweetAlertOptions} + */ +export const argsToParams = (args) => { + /** @type {Record} */ + const params = {} + if (typeof args[0] === 'object' && !isElement(args[0])) { + Object.assign(params, args[0]) + } else { + ;['title', 'html', 'icon'].forEach((name, index) => { + const arg = args[index] + if (typeof arg === 'string' || isElement(arg)) { + params[name] = arg + } else if (arg !== undefined) { + error(`Unexpected type of ${name}! Expected "string" or "Element", got ${typeof arg}`) + } + }) + } + return /** @type {SweetAlertOptions} */ (params) +} diff --git a/public/assets/sweetalert2/src/staticMethods/bindClickHandler.js b/public/assets/sweetalert2/src/staticMethods/bindClickHandler.js new file mode 100644 index 0000000..be08964 --- /dev/null +++ b/public/assets/sweetalert2/src/staticMethods/bindClickHandler.js @@ -0,0 +1,31 @@ +let bodyClickListenerAdded = false +/** @type {Record} */ +const clickHandlers = {} + +/** + * @this {any} + * @param {string} attr + */ +export function bindClickHandler(attr = 'data-swal-template') { + clickHandlers[attr] = this + + if (!bodyClickListenerAdded) { + document.body.addEventListener('click', bodyClickListener) + bodyClickListenerAdded = true + } +} + +/** + * @param {MouseEvent} event + */ +const bodyClickListener = (event) => { + for (let el = /** @type {any} */ (event.target); el && el !== document; el = el.parentNode) { + for (const attr in clickHandlers) { + const template = el.getAttribute && el.getAttribute(attr) + if (template) { + clickHandlers[attr].fire({ template }) + return + } + } + } +} diff --git a/public/assets/sweetalert2/src/staticMethods/dom.js b/public/assets/sweetalert2/src/staticMethods/dom.js new file mode 100644 index 0000000..0e2c1f4 --- /dev/null +++ b/public/assets/sweetalert2/src/staticMethods/dom.js @@ -0,0 +1,47 @@ +import * as domUtils from '../utils/dom/domUtils.js' +import * as dom from '../utils/dom/index.js' + +export { + getContainer, + getPopup, + getTitle, + getHtmlContainer, + getImage, + getIcon, + getIconContent, + getInputLabel, + getCloseButton, + getActions, + getConfirmButton, + getDenyButton, + getCancelButton, + getLoader, + getFooter, + getTimerProgressBar, + getFocusableElements, + getValidationMessage, + getProgressSteps, + isLoading, +} from '../utils/dom/index.js' + +/* + * Global function to determine if SweetAlert2 popup is shown + */ +export const isVisible = () => { + return domUtils.isVisible(dom.getPopup()) +} + +/* + * Global function to click 'Confirm' button + */ +export const clickConfirm = () => dom.getConfirmButton()?.click() + +/* + * Global function to click 'Deny' button + */ +export const clickDeny = () => dom.getDenyButton()?.click() + +/* + * Global function to click 'Cancel' button + */ +export const clickCancel = () => dom.getCancelButton()?.click() diff --git a/public/assets/sweetalert2/src/staticMethods/eventHandlers.js b/public/assets/sweetalert2/src/staticMethods/eventHandlers.js new file mode 100644 index 0000000..180b8d5 --- /dev/null +++ b/public/assets/sweetalert2/src/staticMethods/eventHandlers.js @@ -0,0 +1,48 @@ +import globalState from '../globalState.js' +import EventEmitter from '../utils/EventEmitter.js' + +globalState.eventEmitter = new EventEmitter() + +/** + * @param {string} eventName + * @param {EventHandler} eventHandler + */ +export const on = (eventName, eventHandler) => { + if (globalState.eventEmitter) { + globalState.eventEmitter.on(eventName, eventHandler) + } +} + +/** + * @param {string} eventName + * @param {EventHandler} eventHandler + */ +export const once = (eventName, eventHandler) => { + if (globalState.eventEmitter) { + globalState.eventEmitter.once(eventName, eventHandler) + } +} + +/** + * @param {string} [eventName] + * @param {EventHandler} [eventHandler] + */ +export const off = (eventName, eventHandler) => { + if (!globalState.eventEmitter) { + return + } + + // Remove all handlers for all events + if (!eventName) { + globalState.eventEmitter.reset() + return + } + + if (eventHandler) { + // Remove a specific handler + globalState.eventEmitter.removeListener(eventName, eventHandler) + } else { + // Remove all handlers for a specific event + globalState.eventEmitter.removeAllListeners(eventName) + } +} diff --git a/public/assets/sweetalert2/src/staticMethods/fire.js b/public/assets/sweetalert2/src/staticMethods/fire.js new file mode 100644 index 0000000..f0e720f --- /dev/null +++ b/public/assets/sweetalert2/src/staticMethods/fire.js @@ -0,0 +1,10 @@ +/** + * Main method to create a new SweetAlert2 popup + * + * @this {new (...args: any[]) => any} + * @param {...SweetAlertOptions} args + * @returns {Promise} + */ +export function fire(...args) { + return new this(...args) +} diff --git a/public/assets/sweetalert2/src/staticMethods/mixin.js b/public/assets/sweetalert2/src/staticMethods/mixin.js new file mode 100644 index 0000000..8ab81e2 --- /dev/null +++ b/public/assets/sweetalert2/src/staticMethods/mixin.js @@ -0,0 +1,34 @@ +/** + * Returns an extended version of `Swal` containing `params` as defaults. + * Useful for reusing Swal configuration. + * + * For example: + * + * Before: + * const textPromptOptions = { input: 'text', showCancelButton: true } + * const {value: firstName} = await Swal.fire({ ...textPromptOptions, title: 'What is your first name?' }) + * const {value: lastName} = await Swal.fire({ ...textPromptOptions, title: 'What is your last name?' }) + * + * After: + * const TextPrompt = Swal.mixin({ input: 'text', showCancelButton: true }) + * const {value: firstName} = await TextPrompt('What is your first name?') + * const {value: lastName} = await TextPrompt('What is your last name?') + * + * @param {SweetAlertOptions} mixinParams + * @returns {SweetAlert} + * @this {typeof import('../SweetAlert.js').SweetAlert} + */ +export function mixin(mixinParams) { + // @ts-ignore: 'this' refers to the SweetAlert constructor + class MixinSwal extends this { + /** + * @param {any} params + * @param {any} priorityMixinParams + */ + _main(params, priorityMixinParams) { + return super._main(params, Object.assign({}, mixinParams, priorityMixinParams)) + } + } + // @ts-ignore + return MixinSwal +} diff --git a/public/assets/sweetalert2/src/staticMethods/showLoading.js b/public/assets/sweetalert2/src/staticMethods/showLoading.js new file mode 100644 index 0000000..1a4c4e6 --- /dev/null +++ b/public/assets/sweetalert2/src/staticMethods/showLoading.js @@ -0,0 +1,58 @@ +import Swal from '../sweetalert2.js' +import { swalClasses } from '../utils/classes.js' +import * as dom from '../utils/dom/index.js' + +/** + * Shows loader (spinner), this is useful with AJAX requests. + * By default the loader be shown instead of the "Confirm" button. + * + * @param {HTMLButtonElement | null} [buttonToReplace] + */ +const showLoading = (buttonToReplace) => { + let popup = dom.getPopup() + if (!popup) { + new Swal() + } + popup = dom.getPopup() + if (!popup) { + return + } + const loader = dom.getLoader() + + if (dom.isToast()) { + dom.hide(dom.getIcon()) + } else { + replaceButton(popup, buttonToReplace) + } + dom.show(loader) + + popup.setAttribute('data-loading', 'true') + popup.setAttribute('aria-busy', 'true') + popup.focus() +} + +/** + * @param {HTMLElement} popup + * @param {HTMLButtonElement | null} [buttonToReplace] + */ +const replaceButton = (popup, buttonToReplace) => { + const actions = dom.getActions() + const loader = dom.getLoader() + if (!actions || !loader) { + return + } + + if (!buttonToReplace && dom.isVisible(dom.getConfirmButton())) { + buttonToReplace = dom.getConfirmButton() + } + + dom.show(actions) + if (buttonToReplace) { + dom.hide(buttonToReplace) + loader.setAttribute('data-button-to-replace', buttonToReplace.className) + actions.insertBefore(loader, buttonToReplace) + } + dom.addClass([popup, actions], swalClasses.loading) +} + +export { showLoading, showLoading as enableLoading } diff --git a/public/assets/sweetalert2/src/staticMethods/timer.js b/public/assets/sweetalert2/src/staticMethods/timer.js new file mode 100644 index 0000000..7165233 --- /dev/null +++ b/public/assets/sweetalert2/src/staticMethods/timer.js @@ -0,0 +1,76 @@ +import globalState from '../globalState.js' +import { animateTimerProgressBar, stopTimerProgressBar } from '../utils/dom/domUtils.js' + +/** + * If `timer` parameter is set, returns number of milliseconds of timer remained. + * Otherwise, returns undefined. + * + * @returns {number | undefined} + */ +export const getTimerLeft = () => { + return globalState.timeout && globalState.timeout.getTimerLeft() +} + +/** + * Stop timer. Returns number of milliseconds of timer remained. + * If `timer` parameter isn't set, returns undefined. + * + * @returns {number | undefined} + */ +export const stopTimer = () => { + if (globalState.timeout) { + stopTimerProgressBar() + return globalState.timeout.stop() + } +} + +/** + * Resume timer. Returns number of milliseconds of timer remained. + * If `timer` parameter isn't set, returns undefined. + * + * @returns {number | undefined} + */ +export const resumeTimer = () => { + if (globalState.timeout) { + const remaining = globalState.timeout.start() + animateTimerProgressBar(remaining) + return remaining + } +} + +/** + * Resume timer. Returns number of milliseconds of timer remained. + * If `timer` parameter isn't set, returns undefined. + * + * @returns {number | undefined} + */ +export const toggleTimer = () => { + const timer = globalState.timeout + return timer && (timer.running ? stopTimer() : resumeTimer()) +} + +/** + * Increase timer. Returns number of milliseconds of an updated timer. + * If `timer` parameter isn't set, returns undefined. + * + * @param {number} ms + * @returns {number | undefined} + */ +export const increaseTimer = (ms) => { + if (globalState.timeout) { + const remaining = globalState.timeout.increase(ms) + animateTimerProgressBar(remaining, true) + return remaining + } +} + +/** + * Check if timer is running. Returns true if timer is running + * or false if timer is paused or stopped. + * If `timer` parameter isn't set, returns undefined + * + * @returns {boolean} + */ +export const isTimerRunning = () => { + return Boolean(globalState.timeout && globalState.timeout.isRunning()) +} diff --git a/public/assets/sweetalert2/src/sweetalert2.js b/public/assets/sweetalert2/src/sweetalert2.js new file mode 100644 index 0000000..25adb1a --- /dev/null +++ b/public/assets/sweetalert2/src/sweetalert2.js @@ -0,0 +1,7 @@ +import SweetAlert from './SweetAlert.js' + +const Swal = SweetAlert +// @ts-ignore +Swal.default = Swal + +export default Swal diff --git a/public/assets/sweetalert2/src/sweetalert2.scss b/public/assets/sweetalert2/src/sweetalert2.scss new file mode 100644 index 0000000..d9c90dc --- /dev/null +++ b/public/assets/sweetalert2/src/sweetalert2.scss @@ -0,0 +1,1793 @@ +// SweetAlert2 +// github.com/sweetalert2/sweetalert2 + +// CSS Variables +:root { + --swal2-outline: 0 0 0 3px rgba(100, 150, 200, 0.5); + + // CONTAINER + --swal2-container-padding: 0.625em; + + // BACKDROP + --swal2-backdrop: rgba(0, 0, 0, 0.4); + --swal2-backdrop-transition: background-color 0.15s; + + // POPUP + --swal2-width: 32em; + --swal2-padding: 0 0 1.25em; + --swal2-border: none; + --swal2-border-radius: 0.3125rem; + --swal2-background: white; + --swal2-color: #545454; + + // ANIMATIONS + --swal2-show-animation: swal2-show 0.3s; + --swal2-hide-animation: swal2-hide 0.15s forwards; + + // ICONS + --swal2-icon-zoom: 1; + --swal2-icon-animations: true; + + // TITLE + --swal2-title-padding: 0.8em 1em 0; + + // HTML CONTAINER + --swal2-html-container-padding: 1em 1.6em 0.3em; + + // INPUT + --swal2-input-border: 1px solid #d9d9d9; + --swal2-input-border-radius: 0.1875em; + --swal2-input-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.06), 0 0 0 3px transparent; + --swal2-input-background: transparent; + --swal2-input-transition: border-color 0.2s, box-shadow 0.2s; + + // INPUT:HOVER + --swal2-input-hover-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.06), 0 0 0 3px transparent; + + // INPUT:FOCUS + --swal2-input-focus-border: 1px solid #b4dbed; + --swal2-input-focus-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.06), 0 0 0 3px rgba(100, 150, 200, 0.5); + + // PROGRESS STEPS + --swal2-progress-step-background: #add8e6; + + // VALIDATION MESSAGE + --swal2-validation-message-background: #f0f0f0; + --swal2-validation-message-color: #666; + + // FOOTER + --swal2-footer-border-color: #eee; + --swal2-footer-background: transparent; + --swal2-footer-color: inherit; + + // TIMER PROGRESS BAR + --swal2-timer-progress-bar-background: rgba(0, 0, 0, 0.3); + + // CLOSE BUTTON + --swal2-close-button-position: initial; + --swal2-close-button-inset: auto; + --swal2-close-button-font-size: 2.5em; + --swal2-close-button-color: #ccc; + --swal2-close-button-transition: color 0.2s, box-shadow 0.2s; + --swal2-close-button-outline: initial; + --swal2-close-button-box-shadow: inset 0 0 0 3px transparent; + --swal2-close-button-focus-box-shadow: inset var(--swal2-outline); + + // CLOSE BUTTON:HOVER + --swal2-close-button-hover-transform: none; + + // ACTIONS + --swal2-actions-justify-content: center; + --swal2-actions-width: auto; + --swal2-actions-margin: 1.25em auto 0; + --swal2-actions-padding: 0; + --swal2-actions-border-radius: 0; + --swal2-actions-background: transparent; + + // COMMON VARIABLES FOR ALL ACTION BUTTONS + --swal2-action-button-transition: background-color 0.2s, box-shadow 0.2s; + --swal2-action-button-hover: black 10%; + --swal2-action-button-active: black 10%; + + // CONFIRM BUTTON + --swal2-confirm-button-box-shadow: none; + --swal2-confirm-button-border-radius: 0.25em; + --swal2-confirm-button-background-color: #7066e0; + --swal2-confirm-button-color: #fff; + + // DENY BUTTON + --swal2-deny-button-box-shadow: none; + --swal2-deny-button-border-radius: 0.25em; + --swal2-deny-button-background-color: #dc3741; + --swal2-deny-button-color: #fff; + + // CANCEL BUTTON + --swal2-cancel-button-box-shadow: none; + --swal2-cancel-button-border-radius: 0.25em; + --swal2-cancel-button-background-color: #6e7881; + --swal2-cancel-button-color: #fff; + + // TOASTS + --swal2-toast-show-animation: swal2-toast-show 0.5s; + --swal2-toast-hide-animation: swal2-toast-hide 0.1s forwards; + --swal2-toast-border: none; + --swal2-toast-box-shadow: + 0 0 1px hsl(0deg 0% 0% / 0.075), 0 1px 2px hsl(0deg 0% 0% / 0.075), 1px 2px 4px hsl(0deg 0% 0% / 0.075), + 1px 3px 8px hsl(0deg 0% 0% / 0.075), 2px 4px 16px hsl(0deg 0% 0% / 0.075); +} + +// DARK THEME +@mixin dark-theme { + --swal2-dark-theme-black: #19191a; + --swal2-dark-theme-white: #e1e1e1; + + // POPUP + --swal2-background: var(--swal2-dark-theme-black); + --swal2-color: var(--swal2-dark-theme-white); + --swal2-footer-border-color: #555; + + // INPUT + --swal2-input-background: color-mix(in srgb, var(--swal2-dark-theme-black), var(--swal2-dark-theme-white) 10%); + + // VALIDATION MESSAGE + --swal2-validation-message-background: color-mix( + in srgb, + var(--swal2-dark-theme-black), + var(--swal2-dark-theme-white) 10% + ); + --swal2-validation-message-color: var(--swal2-dark-theme-white); + + // TIMER PROGRESS BAR + --swal2-timer-progress-bar-background: rgba(255, 255, 255, 0.7); +} + +[data-swal2-theme='dark'] { + @include dark-theme; +} + +// AUTO THEME, based on prefers-color-scheme +@media (prefers-color-scheme: dark) { + [data-swal2-theme='auto'] { + @include dark-theme; + } +} + +$swal2-outline-color: rgba(100, 150, 200, 0.5) !default; + +// CONTAINER +$swal2-container-padding: var(--swal2-container-padding) !default; + +// BACKDROP +$swal2-backdrop: var(--swal2-backdrop) !default; +$swal2-backdrop-transition: var(--swal2-backdrop-transition) !default; + +// POPUP +$swal2-width: var(--swal2-width) !default; +$swal2-padding: var(--swal2-padding) !default; +$swal2-border: var(--swal2-border) !default; +$swal2-border-radius: var(--swal2-border-radius) !default; +$swal2-background: var(--swal2-background) !default; +$swal2-color: var(--swal2-color) !default; + +// ANIMATIONS +$swal2-show-animation: var(--swal2-show-animation) !default; +$swal2-hide-animation: var(--swal2-hide-animation) !default; + +// TYPOGRAPHY +$swal2-font: inherit !default; +$swal2-font-size: 1rem !default; + +// ICONS +$swal2-icon-margin: 2.5em auto 0.6em !default; +$swal2-icon-font-family: inherit !default; +$swal2-icon-font-size: 3.75em !default; +$swal2-icon-border-width: 0.25em !default; +$swal2-icon-border-color: #000 !default; +$swal2-icon-zoom: var(--swal2-icon-zoom) !default; +$swal2-success: #a5dc86 !default; +$swal2-success-border: rgba($swal2-success, 0.3) !default; +$swal2-error: #f27474 !default; +$swal2-warning: #f8bb86 !default; +$swal2-info: #3fc3ee !default; +$swal2-question: #87adbd !default; + +// IMAGE +$swal2-image-margin: 2em auto 1em !default; + +// TITLE +$swal2-title-position: relative !default; +$swal2-title-max-width: 100% !default; +$swal2-title-margin: 0 !default; +$swal2-title-padding: var(--swal2-title-padding) !default; +$swal2-title-color: inherit !default; +$swal2-title-font-size: 1.875em !default; +$swal2-title-font-weight: 600 !default; +$swal2-title-text-align: center !default; + +// HTML CONTAINER +$swal2-html-container-justify-content: center !default; +$swal2-html-container-margin: 0 !default; +$swal2-html-container-padding: var(--swal2-html-container-padding) !default; +$swal2-html-container-overflow: auto !default; +$swal2-html-container-color: inherit !default; +$swal2-html-container-font-size: 1.125em !default; +$swal2-html-container-font-weight: normal !default; +$swal2-html-container-line-height: normal !default; +$swal2-html-container-text-align: center !default; +$swal2-html-container-word-break: break-word !default; + +// INPUT +$swal2-input-margin: 1em 2em 3px !default; +$swal2-input-width: auto !default; +$swal2-input-height: 2.625em !default; +$swal2-input-padding: 0 0.75em !default; +$swal2-input-border: var(--swal2-input-border) !default; +$swal2-input-border-radius: var(--swal2-input-border-radius) !default; +$swal2-input-box-shadow: var(--swal2-input-box-shadow) !default; +$swal2-input-font-size: 1.125em !default; +$swal2-input-background: var(--swal2-input-background) !default; +$swal2-input-color: inherit !default; +$swal2-input-transition: var(--swal2-input-transition) !default; + +// INPUT:FOCUS +$swal2-input-focus-border: var(--swal2-input-focus-border) !default; +$swal2-input-focus-outline: none !default; +$swal2-input-focus-box-shadow: var(--swal2-input-focus-box-shadow) !default; + +// TEXTAREA SPECIFIC VARIABLES +$swal2-textarea-height: 6.75em !default; +$swal2-textarea-padding: 0.75em !default; + +// INPUT LABEL +$swal2-input-label-margin: 1em auto 0 !default; +$swal2-input-label-justify-content: center !default; + +// VALIDATION MESSAGE +$swal2-validation-message-align-items: center !default; +$swal2-validation-message-justify-content: center !default; +$swal2-validation-message-margin: 1em 0 0 !default; +$swal2-validation-message-padding: 0.625em !default; +$swal2-validation-message-background: var(--swal2-validation-message-background) !default; +$swal2-validation-message-color: var(--swal2-validation-message-color) !default; +$swal2-validation-message-font-size: 1em !default; +$swal2-validation-message-font-weight: 300 !default; +$swal2-validation-message-icon-background: $swal2-error !default; +$swal2-validation-message-icon-color: #fff !default; +$swal2-validation-message-icon-zoom: null !default; + +// PROGRESS STEPS +$swal2-progress-steps-flex-wrap: wrap !default; +$swal2-progress-steps-align-items: center !default; +$swal2-progress-steps-max-width: 100% !default; +$swal2-progress-steps-background: transparent !default; +$swal2-progress-steps-margin: 1.25em auto !default; +$swal2-progress-steps-padding: 0 !default; +$swal2-progress-steps-font-weight: 600 !default; +$swal2-progress-steps-distance: 2.5em !default; +$swal2-progress-step-width: 2em; +$swal2-progress-step-height: 2em; +$swal2-progress-step-border-radius: 2em; +$swal2-progress-step-background: var(--swal2-progress-step-background) !default; +$swal2-progress-step-color: #fff !default; +$swal2-active-step-background: #2778c4 !default; +$swal2-active-step-color: #fff !default; + +// FOOTER +$swal2-footer-margin: 1em 0 0 !default; +$swal2-footer-padding: 1em 1em 0 !default; +$swal2-footer-border-color: var(--swal2-footer-border-color) !default; +$swal2-footer-background: var(--swal2-footer-background) !default; +$swal2-footer-color: var(--swal2-footer-color) !default; +$swal2-footer-font-size: 1em !default; +$swal2-footer-text-align: center !default; + +// TIMER PROGRESS BAR +$swal2-timer-progress-bar-height: 0.25em; +$swal2-timer-progress-bar-background: var(--swal2-timer-progress-bar-background) !default; + +// CLOSE BUTTON +$swal2-close-button-justify-self: end !default; +$swal2-close-button-align-items: center !default; +$swal2-close-button-justify-content: center !default; +$swal2-close-button-width: 1.2em !default; +$swal2-close-button-height: 1.2em !default; +$swal2-close-button-position: var(--swal2-close-button-position) !default; +$swal2-close-button-inset: var(--swal2-close-button-inset) !default; +$swal2-close-button-gap: 0 !default; +$swal2-close-button-padding: 0 !default; +$swal2-close-button-transition: var(--swal2-close-button-transition) !default; +$swal2-close-button-border: none !default; +$swal2-close-button-border-radius: $swal2-border-radius !default; +$swal2-close-button-outline: var(--swal2-close-button-outline) !default; +$swal2-close-button-background: transparent !default; +$swal2-close-button-color: var(--swal2-close-button-color) !default; +$swal2-close-button-font-family: monospace !default; +$swal2-close-button-font-size: var(--swal2-close-button-font-size) !default; +$swal2-close-button-box-shadow: var(--swal2-close-button-box-shadow) !default; + +// CLOSE BUTTON:HOVER +$swal2-close-button-hover-transform: var(--swal2-close-button-hover-transform) !default; +$swal2-close-button-hover-color: $swal2-error !default; +$swal2-close-button-hover-background: transparent !default; + +// CLOSE BUTTON:FOCUS +$swal2-close-button-focus-outline: none !default; +$swal2-close-button-focus-box-shadow: var(--swal2-close-button-focus-box-shadow) !default; + +// ACTIONS +$swal2-actions-flex-wrap: wrap !default; +$swal2-actions-align-items: center !default; +$swal2-actions-justify-content: var(--swal2-actions-justify-content) !default; +$swal2-actions-width: var(--swal2-actions-width) !default; +$swal2-actions-margin: var(--swal2-actions-margin) !default; +$swal2-actions-padding: var(--swal2-actions-padding) !default; +$swal2-actions-border-radius: var(--swal2-actions-border-radius) !default; +$swal2-actions-background: var(--swal2-actions-background) !default; + +// COMMON VARIABLES FOR ALL ACTION BUTTONS +$swal2-button-margin: 0.3125em !default; +$swal2-button-padding: 0.625em 1.1em !default; +$swal2-button-transition: var(--swal2-action-button-transition) !default; +$swal2-button-box-shadow: 0 0 0 3px transparent !default; +$swal2-button-font-weight: 500 !default; + +// CONFIRM BUTTON +$swal2-confirm-button-order: null !default; +$swal2-confirm-button-border: var(--swal2-confirm-button-border) !default; +$swal2-confirm-button-border-radius: var(--swal2-confirm-button-border-radius) !default; +$swal2-confirm-button-background-color: var(--swal2-confirm-button-background-color) !default; +$swal2-confirm-button-color: var(--swal2-confirm-button-color) !default; +$swal2-confirm-button-font-size: 1em !default; + +// DENY BUTTON +$swal2-deny-button-order: null !default; +$swal2-deny-button-border: var(--swal2-deny-button-border) !default; +$swal2-deny-button-border-radius: var(--swal2-deny-button-border-radius) !default; +$swal2-deny-button-background-color: var(--swal2-deny-button-background-color) !default; +$swal2-deny-button-color: var(--swal2-deny-button-color) !default; +$swal2-deny-button-font-size: 1em !default; + +// CANCEL BUTTON +$swal2-cancel-button-order: null !default; +$swal2-cancel-button-border-radius: var(--swal2-cancel-button-border-radius) !default; +$swal2-cancel-button-background-color: var(--swal2-cancel-button-background-color) !default; +$swal2-cancel-button-color: var(--swal2-cancel-button-color) !default; +$swal2-cancel-button-font-size: 1em !default; + +// LOADER +$swal2-loader-align-items: center !default; +$swal2-loader-justify-content: center !default; +$swal2-loader-width: 2.2em !default; +$swal2-loader-height: 2.2em !default; +$swal2-loader-margin: 0 1.875em !default; +$swal2-loader-animation: swal2-rotate-loading 1.5s linear 0s infinite normal !default; +$swal2-loader-border-width: 0.25em !default; +$swal2-loader-border-style: solid !default; +$swal2-loader-border-radius: 100% !default; +$swal2-loader-border-color: #2778c4 transparent #2778c4 transparent !default; + +// TOASTS +$swal2-toast-show-animation: var(--swal2-toast-show-animation) !default; +$swal2-toast-hide-animation: var(--swal2-toast-hide-animation) !default; +$swal2-toast-border: var(--swal2-toast-border) !default; +$swal2-toast-box-shadow: var(--swal2-toast-box-shadow) !default; +$swal2-toast-background: $swal2-background !default; +$swal2-toast-close-button-width: 0.8em !default; +$swal2-toast-close-button-height: 0.8em !default; +$swal2-toast-close-button-margin: 0 !default; +$swal2-toast-close-button-font-size: 2em !default; +$swal2-toast-width: 360px !default; +$swal2-toast-padding: 1em !default; +$swal2-toast-title-margin: 0.5em 1em !default; +$swal2-toast-title-padding: 0 !default; +$swal2-toast-title-font-size: 1em !default; +$swal2-toast-icon-font-size: 1.8em !default; +$swal2-toast-html-container-margin: 0.5em 1em !default; +$swal2-toast-html-container-padding: 0 !default; +$swal2-toast-html-container-font-size: 1em !default; +$swal2-toast-input-height: 2em !default; +$swal2-toast-input-margin: 0.5em !default; +$swal2-toast-input-font-size: 1em !default; +$swal2-toast-validation-font-size: 1em !default; +$swal2-toast-buttons-font-size: 1em !default; +$swal2-toast-footer-margin: 0.5em 0 0 !default; +$swal2-toast-footer-padding: 0.5em 0 0 !default; +$swal2-toast-footer-font-size: 0.8em !default; + +body { + // MODAL + &.swal2-shown:not(.swal2-no-backdrop, .swal2-toast-shown) { + overflow: hidden; // not overflow-y because of Sarari, #1253 + } + + &.swal2-height-auto { + height: auto !important; // #781 #1107 + } + + &.swal2-no-backdrop { + .swal2-container { + background-color: transparent !important; + pointer-events: none; + + .swal2-popup { + pointer-events: all; + } + + .swal2-modal { + box-shadow: 0 0 10px $swal2-backdrop; + } + } + } + + // TOAST + &.swal2-toast-shown { + .swal2-container { + box-sizing: border-box; + width: $swal2-toast-width; + max-width: 100%; + background-color: transparent; + pointer-events: none; + + &.swal2-top { + inset: 0 auto auto 50%; + transform: translateX(-50%); + } + + &.swal2-top-end, + &.swal2-top-right { + inset: 0 0 auto auto; + } + + &.swal2-top-start, + &.swal2-top-left { + inset: 0 auto auto 0; + } + + &.swal2-center-start, + &.swal2-center-left { + inset: 50% auto auto 0; + transform: translateY(-50%); + } + + &.swal2-center { + inset: 50% auto auto 50%; + transform: translate(-50%, -50%); + } + + &.swal2-center-end, + &.swal2-center-right { + inset: 50% 0 auto auto; + transform: translateY(-50%); + } + + &.swal2-bottom-start, + &.swal2-bottom-left { + inset: auto auto 0 0; + } + + &.swal2-bottom { + inset: auto auto 0 50%; + transform: translateX(-50%); + } + + &.swal2-bottom-end, + &.swal2-bottom-right { + inset: auto 0 0 auto; + } + } + } + + // PRINT + @media print { + &.swal2-shown:not(.swal2-no-backdrop, .swal2-toast-shown) { + overflow-y: scroll !important; + + > [aria-hidden='true'] { + display: none; + } + + .swal2-container { + position: static !important; + } + } + } +} + +// MODAL +div:where(.swal2-container) { + display: grid; + position: fixed; + z-index: 1060; + inset: 0; + box-sizing: border-box; + grid-template-areas: + 'top-start top top-end' + 'center-start center center-end' + 'bottom-start bottom-center bottom-end'; + grid-template-rows: minmax(min-content, auto) minmax(min-content, auto) minmax(min-content, auto); + height: 100%; // Safari + padding: $swal2-container-padding; + overflow-x: hidden; + transition: $swal2-backdrop-transition; + + // sweetalert2/issues/905 + -webkit-overflow-scrolling: touch; + + &.swal2-backdrop-show, + &.swal2-noanimation { + background: $swal2-backdrop; + } + + &.swal2-backdrop-hide { + background: transparent !important; + } + + &.swal2-top-start, + &.swal2-center-start, + &.swal2-bottom-start { + grid-template-columns: minmax(0, 1fr) auto auto; + } + + &.swal2-top, + &.swal2-center, + &.swal2-bottom { + grid-template-columns: auto minmax(0, 1fr) auto; + } + + &.swal2-top-end, + &.swal2-center-end, + &.swal2-bottom-end { + grid-template-columns: auto auto minmax(0, 1fr); + } + + &.swal2-top-start > .swal2-popup { + align-self: start; + } + + &.swal2-top > .swal2-popup { + grid-column: 2; + place-self: start center; + } + + &.swal2-top-end > .swal2-popup, + &.swal2-top-right > .swal2-popup { + grid-column: 3; + place-self: start end; + } + + &.swal2-center-start > .swal2-popup, + &.swal2-center-left > .swal2-popup { + grid-row: 2; + align-self: center; + } + + &.swal2-center > .swal2-popup { + grid-column: 2; + grid-row: 2; + place-self: center center; + } + + &.swal2-center-end > .swal2-popup, + &.swal2-center-right > .swal2-popup { + grid-column: 3; + grid-row: 2; + place-self: center end; + } + + &.swal2-bottom-start > .swal2-popup, + &.swal2-bottom-left > .swal2-popup { + grid-column: 1; + grid-row: 3; + align-self: end; + } + + &.swal2-bottom > .swal2-popup { + grid-column: 2; + grid-row: 3; + place-self: end center; + } + + &.swal2-bottom-end > .swal2-popup, + &.swal2-bottom-right > .swal2-popup { + grid-column: 3; + grid-row: 3; + place-self: end end; + } + + &.swal2-grow-row > .swal2-popup, + &.swal2-grow-fullscreen > .swal2-popup { + grid-column: 1/4; + width: 100%; + } + + &.swal2-grow-column > .swal2-popup, + &.swal2-grow-fullscreen > .swal2-popup { + grid-row: 1/4; + align-self: stretch; + } + + &.swal2-no-transition { + transition: none !important; + } + + &[popover] { + width: auto; + border: 0; + } + + div:where(.swal2-popup) { + display: none; + position: relative; + box-sizing: border-box; + grid-template-columns: minmax(0, 100%); + width: $swal2-width; + max-width: 100%; + padding: $swal2-padding; + border: $swal2-border; + border-radius: $swal2-border-radius; + background: $swal2-background; + color: $swal2-color; + font-family: $swal2-font; + font-size: $swal2-font-size; + container-name: swal2-popup; + + &:focus { + outline: none; + } + + &.swal2-loading { + overflow-y: hidden; + } + + &.swal2-draggable { + cursor: grab; + + div:where(.swal2-icon) { + cursor: grab; + } + } + + &.swal2-dragging { + cursor: grabbing; + + div:where(.swal2-icon) { + cursor: grabbing; + } + } + } + + h2:where(.swal2-title) { + position: $swal2-title-position; + max-width: $swal2-title-max-width; + margin: $swal2-title-margin; + padding: $swal2-title-padding; + color: $swal2-title-color; + font-size: $swal2-title-font-size; + font-weight: $swal2-title-font-weight; + text-align: $swal2-title-text-align; + text-transform: none; + overflow-wrap: break-word; + cursor: initial; + } + + div:where(.swal2-actions) { + display: flex; + z-index: 1; // prevent success icon from overlapping buttons + box-sizing: border-box; + flex-wrap: $swal2-actions-flex-wrap; + align-items: $swal2-actions-align-items; + justify-content: $swal2-actions-justify-content; + width: $swal2-actions-width; + margin: $swal2-actions-margin; + padding: $swal2-actions-padding; + border-radius: $swal2-actions-border-radius; + background: $swal2-actions-background; + } + + div:where(.swal2-loader) { + display: none; + align-items: $swal2-loader-align-items; + justify-content: $swal2-loader-justify-content; + width: $swal2-loader-width; + height: $swal2-loader-height; + margin: $swal2-loader-margin; + animation: $swal2-loader-animation; + border-width: $swal2-loader-border-width; + border-style: $swal2-loader-border-style; + border-radius: $swal2-loader-border-radius; + border-color: $swal2-loader-border-color; + } + + button:where(.swal2-styled) { + margin: $swal2-button-margin; + padding: $swal2-button-padding; + transition: $swal2-button-transition; + border: none; + box-shadow: $swal2-button-box-shadow; + font-weight: $swal2-button-font-weight; + + &:not([disabled]) { + cursor: pointer; + } + + &:where(.swal2-confirm) { + order: $swal2-confirm-button-order; + border-radius: $swal2-confirm-button-border-radius; + background: initial; + background-color: $swal2-confirm-button-background-color; + box-shadow: var(--swal2-confirm-button-box-shadow); + color: $swal2-confirm-button-color; + font-size: $swal2-confirm-button-font-size; + + &:hover { + background-color: color-mix(in srgb, $swal2-confirm-button-background-color, var(--swal2-action-button-hover)); + } + + &:active { + background-color: color-mix(in srgb, $swal2-confirm-button-background-color, var(--swal2-action-button-active)); + } + } + + &:where(.swal2-deny) { + order: $swal2-deny-button-order; + border-radius: $swal2-deny-button-border-radius; + background: initial; + background-color: $swal2-deny-button-background-color; + box-shadow: var(--swal2-deny-button-box-shadow); + color: $swal2-deny-button-color; + font-size: $swal2-deny-button-font-size; + + &:hover { + background-color: color-mix(in srgb, $swal2-deny-button-background-color, var(--swal2-action-button-hover)); + } + + &:active { + background-color: color-mix(in srgb, $swal2-deny-button-background-color, var(--swal2-action-button-active)); + } + } + + &:where(.swal2-cancel) { + order: $swal2-cancel-button-order; + border-radius: $swal2-cancel-button-border-radius; + background: initial; + background-color: $swal2-cancel-button-background-color; + box-shadow: var(--swal2-cancel-button-box-shadow); + color: $swal2-cancel-button-color; + font-size: $swal2-cancel-button-font-size; + + &:hover { + background-color: color-mix(in srgb, $swal2-cancel-button-background-color, var(--swal2-action-button-hover)); + } + + &:active { + background-color: color-mix(in srgb, $swal2-cancel-button-background-color, var(--swal2-action-button-active)); + } + } + + &:focus-visible { + outline: none; + box-shadow: var(--swal2-action-button-focus-box-shadow); + } + + &[disabled] { + &:not(.swal2-loading) { + opacity: 0.4; + } + } + + &::-moz-focus-inner { + border: 0; + } + } + + div:where(.swal2-footer) { + margin: $swal2-footer-margin; + padding: $swal2-footer-padding; + border-top: 1px solid $swal2-footer-border-color; + background: $swal2-footer-background; + color: $swal2-footer-color; + font-size: $swal2-footer-font-size; + text-align: $swal2-footer-text-align; + cursor: initial; + } + + .swal2-timer-progress-bar-container { + position: absolute; + right: 0; + bottom: 0; + left: 0; + grid-column: auto !important; + overflow: hidden; + border-bottom-right-radius: $swal2-border-radius; + border-bottom-left-radius: $swal2-border-radius; + } + + div:where(.swal2-timer-progress-bar) { + width: 100%; + height: $swal2-timer-progress-bar-height; + background: $swal2-timer-progress-bar-background; + } + + img:where(.swal2-image) { + max-width: 100%; + margin: $swal2-image-margin; + cursor: initial; + } + + button:where(.swal2-close) { + position: $swal2-close-button-position; + inset: $swal2-close-button-inset; + z-index: 2; // sweetalert2/issues/1617 + align-items: $swal2-close-button-align-items; + justify-content: $swal2-close-button-justify-content; + width: $swal2-close-button-width; + height: $swal2-close-button-height; + margin-top: $swal2-close-button-gap; + margin-right: $swal2-close-button-gap; + margin-bottom: -$swal2-close-button-height; + padding: $swal2-close-button-padding; + overflow: hidden; + transition: $swal2-close-button-transition; + border: $swal2-close-button-border; + border-radius: $swal2-close-button-border-radius; + outline: $swal2-close-button-outline; + background: $swal2-close-button-background; + color: $swal2-close-button-color; + font-family: $swal2-close-button-font-family; + font-size: $swal2-close-button-font-size; + cursor: pointer; + justify-self: $swal2-close-button-justify-self; + + &:hover { + transform: $swal2-close-button-hover-transform; + background: $swal2-close-button-hover-background; + color: $swal2-close-button-hover-color; + } + + &:focus-visible { + outline: $swal2-close-button-focus-outline; + box-shadow: $swal2-close-button-focus-box-shadow; + } + + &::-moz-focus-inner { + border: 0; + } + } + + div:where(.swal2-html-container) { + z-index: 1; // prevent success icon overlapping the content + justify-content: $swal2-html-container-justify-content; + margin: $swal2-html-container-margin; + padding: $swal2-html-container-padding; + overflow: $swal2-html-container-overflow; + color: $swal2-html-container-color; + font-size: $swal2-html-container-font-size; + font-weight: $swal2-html-container-font-weight; + line-height: $swal2-html-container-line-height; + text-align: $swal2-html-container-text-align; + overflow-wrap: break-word; + word-break: $swal2-html-container-word-break; + cursor: initial; + } + + input:where(.swal2-input), + input:where(.swal2-file), + textarea:where(.swal2-textarea), + select:where(.swal2-select), + div:where(.swal2-radio), + label:where(.swal2-checkbox) { + margin: $swal2-input-margin; + } + + input:where(.swal2-input), + input:where(.swal2-file), + textarea:where(.swal2-textarea) { + box-sizing: border-box; + width: $swal2-input-width; + transition: $swal2-input-transition; + border: $swal2-input-border; + border-radius: $swal2-input-border-radius; + background: $swal2-input-background; + box-shadow: $swal2-input-box-shadow; + color: $swal2-input-color; + font-size: $swal2-input-font-size; + + &.swal2-inputerror { + border-color: $swal2-error !important; + box-shadow: 0 0 2px $swal2-error !important; + } + + &:hover { + box-shadow: var(--swal2-input-hover-box-shadow); + } + + &:focus { + border: $swal2-input-focus-border; + outline: $swal2-input-focus-outline; + box-shadow: $swal2-input-focus-box-shadow; + } + + &::placeholder { + color: #ccc; + } + } + + .swal2-range { + margin: $swal2-input-margin; + background: $swal2-background; + + input { + width: 80%; + } + + output { + width: 20%; + color: $swal2-input-color; + font-weight: 600; + text-align: center; + } + + input, + output { + height: $swal2-input-height; + padding: 0; + font-size: $swal2-input-font-size; + line-height: $swal2-input-height; + } + } + + .swal2-input { + height: $swal2-input-height; + padding: $swal2-input-padding; + } + + .swal2-file { + width: 75%; + margin-right: auto; + margin-left: auto; + background: $swal2-input-background; + font-size: $swal2-input-font-size; + } + + .swal2-textarea { + height: $swal2-textarea-height; + padding: $swal2-textarea-padding; + } + + .swal2-select { + min-width: 50%; + max-width: 100%; + padding: 0.375em 0.625em; + background: $swal2-input-background; + color: $swal2-input-color; + font-size: $swal2-input-font-size; + } + + .swal2-radio, + .swal2-checkbox { + align-items: center; + justify-content: center; + background: $swal2-background; + color: $swal2-input-color; + + label { + margin: 0 0.6em; + font-size: $swal2-input-font-size; + } + + input { + flex-shrink: 0; + margin: 0 0.4em; + } + } + + label:where(.swal2-input-label) { + display: flex; + justify-content: $swal2-input-label-justify-content; + margin: $swal2-input-label-margin; + } + + div:where(.swal2-validation-message) { + align-items: $swal2-validation-message-align-items; + justify-content: $swal2-validation-message-justify-content; + margin: $swal2-validation-message-margin; + padding: $swal2-validation-message-padding; + overflow: hidden; + background: $swal2-validation-message-background; + color: $swal2-validation-message-color; + font-size: $swal2-validation-message-font-size; + font-weight: $swal2-validation-message-font-weight; + + &::before { + content: '!'; + display: inline-block; + width: 1.5em; + min-width: 1.5em; + height: 1.5em; + margin: 0 0.625em; + zoom: $swal2-validation-message-icon-zoom; + border-radius: 50%; + background-color: $swal2-validation-message-icon-background; + color: $swal2-validation-message-icon-color; + font-weight: 600; + line-height: 1.5em; + text-align: center; + } + } + + .swal2-progress-steps { + flex-wrap: $swal2-progress-steps-flex-wrap; + align-items: $swal2-progress-steps-align-items; + max-width: $swal2-progress-steps-max-width; + margin: $swal2-progress-steps-margin; + padding: $swal2-progress-steps-padding; + background: $swal2-progress-steps-background; + font-weight: $swal2-progress-steps-font-weight; + + li { + display: inline-block; + position: relative; + } + + .swal2-progress-step { + z-index: 20; + flex-shrink: 0; + width: $swal2-progress-step-width; + height: $swal2-progress-step-height; + border-radius: $swal2-progress-step-border-radius; + background: $swal2-active-step-background; + color: $swal2-active-step-color; + line-height: $swal2-progress-step-height; + text-align: center; + + &.swal2-active-progress-step { + background: $swal2-active-step-background; + + ~ .swal2-progress-step { + background: $swal2-progress-step-background; + color: $swal2-progress-step-color; + } + + ~ .swal2-progress-step-line { + background: $swal2-progress-step-background; + } + } + } + + .swal2-progress-step-line { + z-index: 10; + flex-shrink: 0; + width: $swal2-progress-steps-distance; + height: 0.4em; + margin: 0 -1px; + background: $swal2-active-step-background; + } + } +} + +// ICONS + +div:where(.swal2-icon) { + position: relative; + box-sizing: content-box; + justify-content: center; + width: 5em; + height: 5em; + margin: $swal2-icon-margin; + zoom: $swal2-icon-zoom; + border: $swal2-icon-border-width solid transparent; + border-radius: 50%; + border-color: $swal2-icon-border-color; + font-family: $swal2-icon-font-family; + line-height: 5em; + cursor: default; + user-select: none; + + .swal2-icon-content { + display: flex; + align-items: center; + font-size: $swal2-icon-font-size; + } + + &.swal2-error { + border-color: $swal2-error; + color: $swal2-error; + + .swal2-x-mark { + position: relative; + flex-grow: 1; + } + + [class^='swal2-x-mark-line'] { + display: block; + position: absolute; + top: 2.3125em; + width: 2.9375em; + height: 0.3125em; + border-radius: 0.125em; + background-color: $swal2-error; + + &[class$='left'] { + left: 1.0625em; + transform: rotate(45deg); + } + + &[class$='right'] { + right: 1em; + transform: rotate(-45deg); + } + } + + // Error icon animation + @container swal2-popup style(--swal2-icon-animations:true) { + &.swal2-icon-show { + animation: swal2-animate-error-icon 0.5s; + + .swal2-x-mark { + animation: swal2-animate-error-x-mark 0.5s; + } + } + } + } + + &.swal2-warning { + border-color: $swal2-warning; + color: $swal2-warning; + + // Warning icon animation + @container swal2-popup style(--swal2-icon-animations:true) { + &.swal2-icon-show { + animation: swal2-animate-error-icon 0.5s; + + .swal2-icon-content { + animation: swal2-animate-i-mark 0.5s; + } + } + } + } + + &.swal2-info { + border-color: $swal2-info; + color: $swal2-info; + + // Info icon animation + @container swal2-popup style(--swal2-icon-animations:true) { + &.swal2-icon-show { + animation: swal2-animate-error-icon 0.5s; + + .swal2-icon-content { + animation: swal2-animate-i-mark 0.8s; + } + } + } + } + + &.swal2-question { + border-color: $swal2-question; + color: $swal2-question; + + // Question icon animation + @container swal2-popup style(--swal2-icon-animations:true) { + &.swal2-icon-show { + animation: swal2-animate-error-icon 0.5s; + + .swal2-icon-content { + animation: swal2-animate-question-mark 0.8s; + } + } + } + } + + &.swal2-success { + border-color: $swal2-success; + color: $swal2-success; + + [class^='swal2-success-circular-line'] { + // Emulate moving circular line + position: absolute; + width: 3.75em; + height: 7.5em; + border-radius: 50%; + + &[class$='left'] { + top: -0.4375em; + left: -2.0635em; + transform: rotate(-45deg); + transform-origin: 3.75em 3.75em; + border-radius: 7.5em 0 0 7.5em; + } + + &[class$='right'] { + top: -0.6875em; + left: 1.875em; + transform: rotate(-45deg); + transform-origin: 0 3.75em; + border-radius: 0 7.5em 7.5em 0; + } + } + + .swal2-success-ring { + // Ring + position: absolute; + z-index: 2; + top: -0.25em; + left: -0.25em; + box-sizing: content-box; + width: 100%; + height: 100%; + border: 0.25em solid $swal2-success-border; + border-radius: 50%; + } + + .swal2-success-fix { + // Hide corners left from animation + position: absolute; + z-index: 1; + top: 0.5em; + left: 1.625em; + width: 0.4375em; + height: 5.625em; + transform: rotate(-45deg); + } + + [class^='swal2-success-line'] { + display: block; + position: absolute; + z-index: 2; + height: 0.3125em; + border-radius: 0.125em; + background-color: $swal2-success; + + &[class$='tip'] { + top: 2.875em; + left: 0.8125em; + width: 1.5625em; + transform: rotate(45deg); + } + + &[class$='long'] { + top: 2.375em; + right: 0.5em; + width: 2.9375em; + transform: rotate(-45deg); + } + } + + // Success icon animation + @container swal2-popup style(--swal2-icon-animations:true) { + &.swal2-icon-show { + .swal2-success-line-tip { + animation: swal2-animate-success-line-tip 0.75s; + } + + .swal2-success-line-long { + animation: swal2-animate-success-line-long 0.75s; + } + + .swal2-success-circular-line-right { + animation: swal2-rotate-success-circular-line 4.25s ease-in; + } + } + } + } +} + +// github.com/sweetalert2/sweetalert2/issues/268 +[class^='swal2'] { + -webkit-tap-highlight-color: transparent; +} + +.swal2-show { + animation: $swal2-show-animation; +} + +.swal2-hide { + animation: $swal2-hide-animation; +} + +.swal2-noanimation { + transition: none; +} + +// Measure scrollbar width for padding body during modal show/hide +.swal2-scrollbar-measure { + position: absolute; + top: -9999px; + width: 50px; + height: 50px; + overflow: scroll; +} + +// Right-to-left support +.swal2-rtl { + .swal2-close { + margin-right: initial; + margin-left: $swal2-close-button-gap; + } + + .swal2-timer-progress-bar { + right: 0; + left: auto; + } +} + +// TOAST +.swal2-toast { + box-sizing: border-box; + grid-column: 1/4 !important; + grid-row: 1/4 !important; + grid-template-columns: min-content auto min-content; + padding: $swal2-toast-padding; + overflow-y: hidden; + border: $swal2-toast-border; + background: $swal2-toast-background; + box-shadow: $swal2-toast-box-shadow; + pointer-events: all; + + > * { + grid-column: 2; + } + + h2:where(.swal2-title) { + margin: $swal2-toast-title-margin; + padding: $swal2-toast-title-padding; + font-size: $swal2-toast-title-font-size; + text-align: initial; + } + + .swal2-loading { + justify-content: center; + } + + input:where(.swal2-input) { + height: $swal2-toast-input-height; + margin: $swal2-toast-input-margin; + font-size: $swal2-toast-input-font-size; + } + + .swal2-validation-message { + font-size: $swal2-toast-validation-font-size; + } + + div:where(.swal2-footer) { + margin: $swal2-toast-footer-margin; + padding: $swal2-toast-footer-margin; + font-size: $swal2-toast-footer-font-size; + } + + button:where(.swal2-close) { + grid-column: 3/3; + grid-row: 1/99; + align-self: center; + width: $swal2-toast-close-button-width; + height: $swal2-toast-close-button-height; + margin: $swal2-toast-close-button-margin; + font-size: $swal2-toast-close-button-font-size; + } + + div:where(.swal2-html-container) { + margin: $swal2-toast-html-container-margin; + padding: $swal2-toast-html-container-padding; + overflow: initial; + font-size: $swal2-toast-html-container-font-size; + text-align: initial; + + &:empty { + padding: 0; + } + } + + .swal2-loader { + grid-column: 1; + grid-row: 1/99; + align-self: center; + width: 2em; + height: 2em; + margin: 0.25em; + } + + .swal2-icon { + grid-column: 1; + grid-row: 1/99; + align-self: center; + width: 2em; + min-width: 2em; + height: 2em; + margin: 0 0.5em 0 0; + + .swal2-icon-content { + display: flex; + align-items: center; + font-size: $swal2-toast-icon-font-size; + font-weight: bold; + } + + &.swal2-success { + .swal2-success-ring { + width: 2em; + height: 2em; + } + } + + &.swal2-error { + [class^='swal2-x-mark-line'] { + top: 0.875em; + width: 1.375em; + + &[class$='left'] { + left: 0.3125em; + } + + &[class$='right'] { + right: 0.3125em; + } + } + } + } + + div:where(.swal2-actions) { + justify-content: flex-start; + height: auto; + margin: 0; + margin-top: 0.5em; + padding: 0 0.5em; + } + + button:where(.swal2-styled) { + margin: 0.25em 0.5em; + padding: 0.4em 0.6em; + font-size: $swal2-toast-buttons-font-size; + } + + .swal2-success { + border-color: $swal2-success; + + [class^='swal2-success-circular-line'] { + // Emulate moving circular line + position: absolute; + width: 1.6em; + height: 3em; + border-radius: 50%; + + &[class$='left'] { + top: -0.8em; + left: -0.5em; + transform: rotate(-45deg); + transform-origin: 2em 2em; + border-radius: 4em 0 0 4em; + } + + &[class$='right'] { + top: -0.25em; + left: 0.9375em; + transform-origin: 0 1.5em; + border-radius: 0 4em 4em 0; + } + } + + .swal2-success-ring { + width: 2em; + height: 2em; + } + + .swal2-success-fix { + top: 0; + left: 0.4375em; + width: 0.4375em; + height: 2.6875em; + } + + [class^='swal2-success-line'] { + height: 0.3125em; + + &[class$='tip'] { + top: 1.125em; + left: 0.1875em; + width: 0.75em; + } + + &[class$='long'] { + top: 0.9375em; + right: 0.1875em; + width: 1.375em; + } + } + + @container swal2-popup style(--swal2-icon-animations:true) { + &.swal2-icon-show { + .swal2-success-line-tip { + animation: swal2-toast-animate-success-line-tip 0.75s; + } + + .swal2-success-line-long { + animation: swal2-toast-animate-success-line-long 0.75s; + } + } + } + } + + &.swal2-show { + animation: $swal2-toast-show-animation; + } + + &.swal2-hide { + animation: $swal2-toast-hide-animation; + } +} + +////////////////////////////// +// ANIMATIONS +// Appearance animation +@keyframes swal2-show { + 0% { + transform: translate3d(0, -50px, 0) scale(0.9); + opacity: 0; + } + + 100% { + transform: translate3d(0, 0, 0) scale(1); + opacity: 1; + } +} + +// Disappearance animation +@keyframes swal2-hide { + 0% { + transform: translate3d(0, 0, 0) scale(1); + opacity: 1; + } + + 100% { + transform: translate3d(0, -50px, 0) scale(0.9); + opacity: 0; + } +} + +// Success icon animations +@keyframes swal2-animate-success-line-tip { + 0% { + top: 1.1875em; + left: 0.0625em; + width: 0; + } + + 54% { + top: 1.0625em; + left: 0.125em; + width: 0; + } + + 70% { + top: 2.1875em; + left: -0.375em; + width: 3.125em; + } + + 84% { + top: 3em; + left: 1.3125em; + width: 1.0625em; + } + + 100% { + top: 2.8125em; + left: 0.8125em; + width: 1.5625em; + } +} + +@keyframes swal2-animate-success-line-long { + 0% { + top: 3.375em; + right: 2.875em; + width: 0; + } + + 65% { + top: 3.375em; + right: 2.875em; + width: 0; + } + + 84% { + top: 2.1875em; + right: 0; + width: 3.4375em; + } + + 100% { + top: 2.375em; + right: 0.5em; + width: 2.9375em; + } +} + +@keyframes swal2-rotate-success-circular-line { + 0% { + transform: rotate(-45deg); + } + + 5% { + transform: rotate(-45deg); + } + + 12% { + transform: rotate(-405deg); + } + + 100% { + transform: rotate(-405deg); + } +} + +// Error icon animations +@keyframes swal2-animate-error-x-mark { + 0% { + margin-top: 1.625em; + transform: scale(0.4); + opacity: 0; + } + + 50% { + margin-top: 1.625em; + transform: scale(0.4); + opacity: 0; + } + + 80% { + margin-top: -0.375em; + transform: scale(1.15); + } + + 100% { + margin-top: 0; + transform: scale(1); + opacity: 1; + } +} + +@keyframes swal2-animate-error-icon { + 0% { + transform: rotateX(100deg); + opacity: 0; + } + + 100% { + transform: rotateX(0deg); + opacity: 1; + } +} + +@keyframes swal2-rotate-loading { + 0% { + transform: rotate(0deg); + } + + 100% { + transform: rotate(360deg); + } +} + +// Question mark animation +@keyframes swal2-animate-question-mark { + 0% { + transform: rotateY(-360deg); + } + + 100% { + transform: rotateY(0); + } +} + +// Info and Warning mark animation +@keyframes swal2-animate-i-mark { + 0% { + transform: rotateZ(45deg); + opacity: 0; + } + + 25% { + transform: rotateZ(-25deg); + opacity: 0.4; + } + + 50% { + transform: rotateZ(15deg); + opacity: 0.8; + } + + 75% { + transform: rotateZ(-5deg); + opacity: 1; + } + + 100% { + transform: rotateX(0); + opacity: 1; + } +} + +////////////////////////////// +// TOAST ANIMATIONS +@keyframes swal2-toast-show { + 0% { + transform: translateY(-0.625em) rotateZ(2deg); + } + + 33% { + transform: translateY(0) rotateZ(-2deg); + } + + 66% { + transform: translateY(0.3125em) rotateZ(2deg); + } + + 100% { + transform: translateY(0) rotateZ(0deg); + } +} + +@keyframes swal2-toast-hide { + 100% { + transform: rotateZ(1deg); + opacity: 0; + } +} + +@keyframes swal2-toast-animate-success-line-tip { + 0% { + top: 0.5625em; + left: 0.0625em; + width: 0; + } + + 54% { + top: 0.125em; + left: 0.125em; + width: 0; + } + + 70% { + top: 0.625em; + left: -0.25em; + width: 1.625em; + } + + 84% { + top: 1.0625em; + left: 0.75em; + width: 0.5em; + } + + 100% { + top: 1.125em; + left: 0.1875em; + width: 0.75em; + } +} + +@keyframes swal2-toast-animate-success-line-long { + 0% { + top: 1.625em; + right: 1.375em; + width: 0; + } + + 65% { + top: 1.25em; + right: 0.9375em; + width: 0; + } + + 84% { + top: 0.9375em; + right: 0; + width: 1.125em; + } + + 100% { + top: 0.9375em; + right: 0.1875em; + width: 1.375em; + } +} diff --git a/public/assets/sweetalert2/src/types.js b/public/assets/sweetalert2/src/types.js new file mode 100644 index 0000000..4c70f9d --- /dev/null +++ b/public/assets/sweetalert2/src/types.js @@ -0,0 +1,125 @@ +/** + * @typedef { import('./SweetAlert').SweetAlert } SweetAlert + * @typedef { import('sweetalert2').SweetAlertOptions } SweetAlertOptions + * @typedef { import('sweetalert2').SweetAlertCustomClass } SweetAlertCustomClass + * @typedef { import('sweetalert2').SweetAlertIcon } SweetAlertIcon + * @typedef { import('sweetalert2').SweetAlertInput } SweetAlertInput + * @typedef { import('sweetalert2').SweetAlertResult } SweetAlertResult + * @typedef { import('sweetalert2').SweetAlertOptions['inputValue'] } SweetAlertInputValue + * @typedef { import('sweetalert2').DismissReason } DismissReason + */ + +/** + * @typedef { import('./utils/Timer').default } Timer + * @typedef { import('./utils/EventEmitter').default } EventEmitter + */ + +/** + * @typedef GlobalState + * @property {SweetAlert} [currentInstance] + * @property {Element | null} [previousActiveElement] + * @property {Timer} [timeout] + * @property {EventEmitter} [eventEmitter] + * @property {NodeJS.Timeout} [restoreFocusTimeout] + * @property {(this: HTMLElement, event: KeyboardEvent) => void} [keydownHandler] + * @property {HTMLElement | (Window & typeof globalThis)} [keydownTarget] + * @property {boolean} [keydownHandlerAdded] + * @property {boolean} [keydownListenerCapture] + * @property {() => void} [swalCloseEventFinishedCallback] + * @property {boolean} [isRTL] + */ + +/** + * @typedef DomCache + * @property {HTMLElement} popup + * @property {HTMLElement} container + * @property {HTMLElement} actions + * @property {HTMLElement} confirmButton + * @property {HTMLElement} denyButton + * @property {HTMLElement} cancelButton + * @property {HTMLElement} loader + * @property {HTMLElement} closeButton + * @property {HTMLElement} validationMessage + * @property {HTMLElement} progressSteps + */ + +/** + * @typedef + * { | 'container' + * | 'shown' + * | 'height-auto' + * | 'iosfix' + * | 'popup' + * | 'modal' + * | 'no-backdrop' + * | 'no-transition' + * | 'toast' + * | 'toast-shown' + * | 'show' + * | 'hide' + * | 'close' + * | 'title' + * | 'html-container' + * | 'actions' + * | 'confirm' + * | 'deny' + * | 'cancel' + * | 'footer' + * | 'icon' + * | 'icon-content' + * | 'image' + * | 'input' + * | 'file' + * | 'range' + * | 'select' + * | 'radio' + * | 'checkbox' + * | 'label' + * | 'textarea' + * | 'inputerror' + * | 'input-label' + * | 'validation-message' + * | 'progress-steps' + * | 'active-progress-step' + * | 'progress-step' + * | 'progress-step-line' + * | 'loader' + * | 'loading' + * | 'styled' + * | 'top' + * | 'top-start' + * | 'top-end' + * | 'top-left' + * | 'top-right' + * | 'center' + * | 'center-start' + * | 'center-end' + * | 'center-left' + * | 'center-right' + * | 'bottom' + * | 'bottom-start' + * | 'bottom-end' + * | 'bottom-left' + * | 'bottom-right' + * | 'grow-row' + * | 'grow-column' + * | 'grow-fullscreen' + * | 'rtl' + * | 'timer-progress-bar' + * | 'timer-progress-bar-container' + * | 'scrollbar-measure' + * | 'icon-success' + * | 'icon-warning' + * | 'icon-info' + * | 'icon-question' + * | 'icon-error' + * | 'draggable' + * | 'dragging' + * } SwalClass + */ + +/** + * @typedef {(eventName: string) => void} EventHandler + * @typedef {EventHandler[]} EventHandlers + * @typedef {Record} Events + */ diff --git a/public/assets/sweetalert2/src/utils/DismissReason.js b/public/assets/sweetalert2/src/utils/DismissReason.js new file mode 100644 index 0000000..a1b4886 --- /dev/null +++ b/public/assets/sweetalert2/src/utils/DismissReason.js @@ -0,0 +1,8 @@ +/** @type {Record} */ +export const DismissReason = Object.freeze({ + cancel: 'cancel', + backdrop: 'backdrop', + close: 'close', + esc: 'esc', + timer: 'timer', +}) diff --git a/public/assets/sweetalert2/src/utils/EventEmitter.js b/public/assets/sweetalert2/src/utils/EventEmitter.js new file mode 100644 index 0000000..297fdf0 --- /dev/null +++ b/public/assets/sweetalert2/src/utils/EventEmitter.js @@ -0,0 +1,94 @@ +// Source: https://gist.github.com/mudge/5830382?permalink_comment_id=2691957#gistcomment-2691957 + +export default class EventEmitter { + constructor() { + /** @type {Events} */ + this.events = {} + } + + /** + * @param {string} eventName + * @returns {EventHandlers} + */ + _getHandlersByEventName(eventName) { + if (typeof this.events[eventName] === 'undefined') { + // not Set because we need to keep the FIFO order + // https://github.com/sweetalert2/sweetalert2/pull/2763#discussion_r1748990334 + this.events[eventName] = [] + } + return this.events[eventName] + } + + /** + * @param {string} eventName + * @param {EventHandler} eventHandler + */ + on(eventName, eventHandler) { + const currentHandlers = this._getHandlersByEventName(eventName) + if (!currentHandlers.includes(eventHandler)) { + currentHandlers.push(eventHandler) + } + } + + /** + * @param {string} eventName + * @param {EventHandler} eventHandler + */ + once(eventName, eventHandler) { + /** + * @param {...any} args + */ + const onceFn = (...args) => { + this.removeListener(eventName, onceFn) + // @ts-ignore + eventHandler.apply(this, args) + } + this.on(eventName, onceFn) + } + + /** + * @param {string} eventName + * @param {...any} args + */ + emit(eventName, ...args) { + this._getHandlersByEventName(eventName).forEach( + /** + * @param {EventHandler} eventHandler + */ + (eventHandler) => { + try { + // @ts-ignore + eventHandler.apply(this, args) + } catch (error) { + console.error(error) + } + } + ) + } + + /** + * @param {string} eventName + * @param {EventHandler} eventHandler + */ + removeListener(eventName, eventHandler) { + const currentHandlers = this._getHandlersByEventName(eventName) + const index = currentHandlers.indexOf(eventHandler) + if (index > -1) { + currentHandlers.splice(index, 1) + } + } + + /** + * @param {string} eventName + */ + removeAllListeners(eventName) { + if (this.events[eventName] !== undefined) { + // https://github.com/sweetalert2/sweetalert2/pull/2763#discussion_r1749239222 + this.events[eventName].length = 0 + } + } + + reset() { + this.events = {} + } +} diff --git a/public/assets/sweetalert2/src/utils/Timer.js b/public/assets/sweetalert2/src/utils/Timer.js new file mode 100644 index 0000000..5d07357 --- /dev/null +++ b/public/assets/sweetalert2/src/utils/Timer.js @@ -0,0 +1,71 @@ +export default class Timer { + /** + * @param {() => void} callback + * @param {number} delay + */ + constructor(callback, delay) { + this.callback = callback + this.remaining = delay + this.running = false + + this.start() + } + + /** + * @returns {number} + */ + start() { + if (!this.running) { + this.running = true + this.started = new Date() + this.id = setTimeout(this.callback, this.remaining) + } + return this.remaining + } + + /** + * @returns {number} + */ + stop() { + if (this.started && this.running) { + this.running = false + clearTimeout(this.id) + this.remaining -= new Date().getTime() - this.started.getTime() + } + return this.remaining + } + + /** + * @param {number} n + * @returns {number} + */ + increase(n) { + const running = this.running + if (running) { + this.stop() + } + this.remaining += n + if (running) { + this.start() + } + return this.remaining + } + + /** + * @returns {number} + */ + getTimerLeft() { + if (this.running) { + this.stop() + this.start() + } + return this.remaining + } + + /** + * @returns {boolean} + */ + isRunning() { + return this.running + } +} diff --git a/public/assets/sweetalert2/src/utils/aria.js b/public/assets/sweetalert2/src/utils/aria.js new file mode 100644 index 0000000..ecceab0 --- /dev/null +++ b/public/assets/sweetalert2/src/utils/aria.js @@ -0,0 +1,33 @@ +import { getContainer } from './dom/getters.js' + +// From https://developer.paciellogroup.com/blog/2018/06/the-current-state-of-modal-dialog-accessibility/ +// Adding aria-hidden="true" to elements outside of the active modal dialog ensures that +// elements not within the active modal dialog will not be surfaced if a user opens a screen +// reader’s list of elements (headings, form controls, landmarks, etc.) in the document. + +export const setAriaHidden = () => { + const container = getContainer() + const bodyChildren = Array.from(document.body.children) + bodyChildren.forEach((el) => { + if (el.contains(container)) { + return + } + + if (el.hasAttribute('aria-hidden')) { + el.setAttribute('data-previous-aria-hidden', el.getAttribute('aria-hidden') || '') + } + el.setAttribute('aria-hidden', 'true') + }) +} + +export const unsetAriaHidden = () => { + const bodyChildren = Array.from(document.body.children) + bodyChildren.forEach((el) => { + if (el.hasAttribute('data-previous-aria-hidden')) { + el.setAttribute('aria-hidden', el.getAttribute('data-previous-aria-hidden') || '') + el.removeAttribute('data-previous-aria-hidden') + } else { + el.removeAttribute('aria-hidden') + } + }) +} diff --git a/public/assets/sweetalert2/src/utils/classes.js b/public/assets/sweetalert2/src/utils/classes.js new file mode 100644 index 0000000..8b175da --- /dev/null +++ b/public/assets/sweetalert2/src/utils/classes.js @@ -0,0 +1,97 @@ +export const swalPrefix = 'swal2-' + +/** + * @typedef {Record} SwalClasses + */ + +/** + * @typedef {'success' | 'warning' | 'info' | 'question' | 'error'} SwalIcon + * @typedef {Record} SwalIcons + */ + +/** @type {SwalClass[]} */ +const classNames = [ + 'container', + 'shown', + 'height-auto', + 'iosfix', + 'popup', + 'modal', + 'no-backdrop', + 'no-transition', + 'toast', + 'toast-shown', + 'show', + 'hide', + 'close', + 'title', + 'html-container', + 'actions', + 'confirm', + 'deny', + 'cancel', + 'footer', + 'icon', + 'icon-content', + 'image', + 'input', + 'file', + 'range', + 'select', + 'radio', + 'checkbox', + 'label', + 'textarea', + 'inputerror', + 'input-label', + 'validation-message', + 'progress-steps', + 'active-progress-step', + 'progress-step', + 'progress-step-line', + 'loader', + 'loading', + 'styled', + 'top', + 'top-start', + 'top-end', + 'top-left', + 'top-right', + 'center', + 'center-start', + 'center-end', + 'center-left', + 'center-right', + 'bottom', + 'bottom-start', + 'bottom-end', + 'bottom-left', + 'bottom-right', + 'grow-row', + 'grow-column', + 'grow-fullscreen', + 'rtl', + 'timer-progress-bar', + 'timer-progress-bar-container', + 'scrollbar-measure', + 'icon-success', + 'icon-warning', + 'icon-info', + 'icon-question', + 'icon-error', + 'draggable', + 'dragging', +] + +export const swalClasses = classNames.reduce((acc, className) => { + acc[className] = swalPrefix + className + return acc +}, /** @type {SwalClasses} */ ({})) + +/** @type {SwalIcon[]} */ +const icons = ['success', 'warning', 'info', 'question', 'error'] + +export const iconTypes = icons.reduce((acc, icon) => { + acc[icon] = swalPrefix + icon + return acc +}, /** @type {SwalIcons} */ ({})) diff --git a/public/assets/sweetalert2/src/utils/defaultInputValidators.js b/public/assets/sweetalert2/src/utils/defaultInputValidators.js new file mode 100644 index 0000000..b319c23 --- /dev/null +++ b/public/assets/sweetalert2/src/utils/defaultInputValidators.js @@ -0,0 +1,23 @@ +export default { + /** + * @param {string} string + * @param {string} [validationMessage] + * @returns {Promise} + */ + email: (string, validationMessage) => { + return /^[a-zA-Z0-9.+_'-]+@[a-zA-Z0-9.-]+\.[a-zA-Z0-9-]+$/.test(string) + ? Promise.resolve() + : Promise.resolve(validationMessage || 'Invalid email address') + }, + /** + * @param {string} string + * @param {string} [validationMessage] + * @returns {Promise} + */ + url: (string, validationMessage) => { + // taken from https://stackoverflow.com/a/3809435 with a small change from #1306 and #2013 + return /^https?:\/\/(www\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\.[a-z]{2,63}\b([-a-zA-Z0-9@:%_+.~#?&/=]*)$/.test(string) + ? Promise.resolve() + : Promise.resolve(validationMessage || 'Invalid URL') + }, +} diff --git a/public/assets/sweetalert2/src/utils/dom/domUtils.js b/public/assets/sweetalert2/src/utils/dom/domUtils.js new file mode 100644 index 0000000..712ed89 --- /dev/null +++ b/public/assets/sweetalert2/src/utils/dom/domUtils.js @@ -0,0 +1,365 @@ +import { iconTypes, swalClasses } from '../classes.js' +import { warn } from '../utils.js' +import { getCancelButton, getConfirmButton, getDenyButton, getTimerProgressBar } from './getters.js' + +/** + * Securely set innerHTML of an element + * https://github.com/sweetalert2/sweetalert2/issues/1926 + * + * @param {HTMLElement} elem + * @param {string} html + */ +export const setInnerHtml = (elem, html) => { + elem.textContent = '' + if (html) { + const parser = new DOMParser() + const parsed = parser.parseFromString(html, `text/html`) + const head = parsed.querySelector('head') + if (head) { + Array.from(head.childNodes).forEach((child) => { + elem.appendChild(child) + }) + } + const body = parsed.querySelector('body') + if (body) { + Array.from(body.childNodes).forEach((child) => { + if (child instanceof HTMLVideoElement || child instanceof HTMLAudioElement) { + elem.appendChild(child.cloneNode(true)) // https://github.com/sweetalert2/sweetalert2/issues/2507 + } else { + elem.appendChild(child) + } + }) + } + } +} + +/** + * @param {HTMLElement} elem + * @param {string} className + * @returns {boolean} + */ +export const hasClass = (elem, className) => { + if (!className) { + return false + } + const classList = className.split(/\s+/) + for (let i = 0; i < classList.length; i++) { + if (!elem.classList.contains(classList[i])) { + return false + } + } + return true +} + +/** + * @param {HTMLElement} elem + * @param {SweetAlertOptions} params + */ +const removeCustomClasses = (elem, params) => { + Array.from(elem.classList).forEach((className) => { + if ( + !Object.values(swalClasses).includes(className) && + !Object.values(iconTypes).includes(className) && + !Object.values(params.showClass || {}).includes(className) + ) { + elem.classList.remove(className) + } + }) +} + +/** + * @param {HTMLElement} elem + * @param {SweetAlertOptions} params + * @param {string} className + */ +export const applyCustomClass = (elem, params, className) => { + removeCustomClasses(elem, params) + + if (!params.customClass) { + return + } + + const customClass = params.customClass[/** @type {keyof SweetAlertCustomClass} */ (className)] + + if (!customClass) { + return + } + + if (typeof customClass !== 'string' && !customClass.forEach) { + warn(`Invalid type of customClass.${className}! Expected string or iterable object, got "${typeof customClass}"`) + return + } + + addClass(elem, customClass) +} + +/** + * @param {HTMLElement} popup + * @param {import('./renderers/renderInput').InputClass | SweetAlertInput} inputClass + * @returns {HTMLInputElement | null} + */ +export const getInput = (popup, inputClass) => { + if (!inputClass) { + return null + } + switch (inputClass) { + case 'select': + case 'textarea': + case 'file': + return popup.querySelector(`.${swalClasses.popup} > .${swalClasses[inputClass]}`) + case 'checkbox': + return popup.querySelector(`.${swalClasses.popup} > .${swalClasses.checkbox} input`) + case 'radio': + return ( + popup.querySelector(`.${swalClasses.popup} > .${swalClasses.radio} input:checked`) || + popup.querySelector(`.${swalClasses.popup} > .${swalClasses.radio} input:first-child`) + ) + case 'range': + return popup.querySelector(`.${swalClasses.popup} > .${swalClasses.range} input`) + default: + return popup.querySelector(`.${swalClasses.popup} > .${swalClasses.input}`) + } +} + +/** + * @param {HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement} input + */ +export const focusInput = (input) => { + input.focus() + + // place cursor at end of text in text input + if (input.type !== 'file') { + // http://stackoverflow.com/a/2345915 + const val = input.value + input.value = '' + input.value = val + } +} + +/** + * @param {HTMLElement | HTMLElement[] | null} target + * @param {string | string[] | readonly string[] | undefined} classList + * @param {boolean} condition + */ +export const toggleClass = (target, classList, condition) => { + if (!target || !classList) { + return + } + if (typeof classList === 'string') { + classList = classList.split(/\s+/).filter(Boolean) + } + classList.forEach((className) => { + if (Array.isArray(target)) { + target.forEach((elem) => { + if (condition) { + elem.classList.add(className) + } else { + elem.classList.remove(className) + } + }) + } else { + if (condition) { + target.classList.add(className) + } else { + target.classList.remove(className) + } + } + }) +} + +/** + * @param {HTMLElement | HTMLElement[] | null} target + * @param {string | string[] | readonly string[] | undefined} classList + */ +export const addClass = (target, classList) => { + toggleClass(target, classList, true) +} + +/** + * @param {HTMLElement | HTMLElement[] | null} target + * @param {string | string[] | readonly string[] | undefined} classList + */ +export const removeClass = (target, classList) => { + toggleClass(target, classList, false) +} + +/** + * Get direct child of an element by class name + * + * @param {HTMLElement} elem + * @param {string} className + * @returns {HTMLElement | undefined} + */ +export const getDirectChildByClass = (elem, className) => { + const children = Array.from(elem.children) + for (let i = 0; i < children.length; i++) { + const child = children[i] + if (child instanceof HTMLElement && hasClass(child, className)) { + return child + } + } +} + +/** + * @param {HTMLElement} elem + * @param {string} property + * @param {string | number | null | undefined} value + */ +export const applyNumericalStyle = (elem, property, value) => { + if (value === `${parseInt(`${value}`)}`) { + value = parseInt(value) + } + if (value || parseInt(`${value}`) === 0) { + elem.style.setProperty(property, typeof value === 'number' ? `${value}px` : /** @type {string} */ (value)) + } else { + elem.style.removeProperty(property) + } +} + +/** + * @param {HTMLElement | null} elem + * @param {string} display + */ +export const show = (elem, display = 'flex') => { + if (!elem) { + return + } + + elem.style.display = display +} + +/** + * @param {HTMLElement | null} elem + */ +export const hide = (elem) => { + if (!elem) { + return + } + + elem.style.display = 'none' +} + +/** + * @param {HTMLElement | null} elem + * @param {string} display + */ +export const showWhenInnerHtmlPresent = (elem, display = 'block') => { + if (!elem) { + return + } + new MutationObserver(() => { + toggle(elem, elem.innerHTML, display) + }).observe(elem, { childList: true, subtree: true }) +} + +/** + * @param {HTMLElement} parent + * @param {string} selector + * @param {string} property + * @param {string} value + */ +export const setStyle = (parent, selector, property, value) => { + /** @type {HTMLElement | null} */ + const el = parent.querySelector(selector) + if (el) { + el.style.setProperty(property, value) + } +} + +/** + * @param {HTMLElement} elem + * @param {boolean | string | null | undefined} condition + * @param {string} display + */ +export const toggle = (elem, condition, display = 'flex') => { + if (condition) { + show(elem, display) + } else { + hide(elem) + } +} + +/** + * borrowed from jquery $(elem).is(':visible') implementation + * + * @param {HTMLElement | null} elem + * @returns {boolean} + */ +export const isVisible = (elem) => Boolean(elem && (elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length)) + +/** + * @returns {boolean} + */ +export const allButtonsAreHidden = () => + !isVisible(getConfirmButton()) && !isVisible(getDenyButton()) && !isVisible(getCancelButton()) + +/** + * @param {HTMLElement} elem + * @returns {boolean} + */ +export const isScrollable = (elem) => Boolean(elem.scrollHeight > elem.clientHeight) + +/** + * @param {HTMLElement} element + * @param {HTMLElement} stopElement + * @returns {boolean} + */ +export const selfOrParentIsScrollable = (element, stopElement) => { + let parent = /** @type {HTMLElement | null} */ (element) + while (parent && parent !== stopElement) { + if (isScrollable(parent)) { + return true + } + parent = parent.parentElement + } + return false +} + +/** + * borrowed from https://stackoverflow.com/a/46352119 + * + * @param {HTMLElement} elem + * @returns {boolean} + */ +export const hasCssAnimation = (elem) => { + const style = window.getComputedStyle(elem) + + const animDuration = parseFloat(style.getPropertyValue('animation-duration') || '0') + const transDuration = parseFloat(style.getPropertyValue('transition-duration') || '0') + + return animDuration > 0 || transDuration > 0 +} + +/** + * @param {number} timer + * @param {boolean} reset + */ +export const animateTimerProgressBar = (timer, reset = false) => { + const timerProgressBar = getTimerProgressBar() + if (!timerProgressBar) { + return + } + if (isVisible(timerProgressBar)) { + if (reset) { + timerProgressBar.style.transition = 'none' + timerProgressBar.style.width = '100%' + } + setTimeout(() => { + timerProgressBar.style.transition = `width ${timer / 1000}s linear` + timerProgressBar.style.width = '0%' + }, 10) + } +} + +export const stopTimerProgressBar = () => { + const timerProgressBar = getTimerProgressBar() + if (!timerProgressBar) { + return + } + const timerProgressBarWidth = parseInt(window.getComputedStyle(timerProgressBar).width) + timerProgressBar.style.removeProperty('transition') + timerProgressBar.style.width = '100%' + const timerProgressBarFullWidth = parseInt(window.getComputedStyle(timerProgressBar).width) + const timerProgressBarPercent = (timerProgressBarWidth / timerProgressBarFullWidth) * 100 + timerProgressBar.style.width = `${timerProgressBarPercent}%` +} diff --git a/public/assets/sweetalert2/src/utils/dom/getters.js b/public/assets/sweetalert2/src/utils/dom/getters.js new file mode 100644 index 0000000..e9a96ff --- /dev/null +++ b/public/assets/sweetalert2/src/utils/dom/getters.js @@ -0,0 +1,198 @@ +import { swalClasses } from '../classes.js' +import { hasClass, isVisible } from './domUtils.js' + +/** + * Gets the popup container which contains the backdrop and the popup itself. + * + * @returns {HTMLElement | null} + */ +export const getContainer = () => document.body.querySelector(`.${swalClasses.container}`) + +/** + * @param {string} selectorString + * @returns {HTMLElement | null} + */ +export const elementBySelector = (selectorString) => { + const container = getContainer() + return container ? container.querySelector(selectorString) : null +} + +/** + * @param {string} className + * @returns {HTMLElement | null} + */ +const elementByClass = (className) => { + return elementBySelector(`.${className}`) +} + +/** + * @returns {HTMLElement | null} + */ +export const getPopup = () => elementByClass(swalClasses.popup) + +/** + * @returns {HTMLElement | null} + */ +export const getIcon = () => elementByClass(swalClasses.icon) + +/** + * @returns {HTMLElement | null} + */ +export const getIconContent = () => elementByClass(swalClasses['icon-content']) + +/** + * @returns {HTMLElement | null} + */ +export const getTitle = () => elementByClass(swalClasses.title) + +/** + * @returns {HTMLElement | null} + */ +export const getHtmlContainer = () => elementByClass(swalClasses['html-container']) + +/** + * @returns {HTMLElement | null} + */ +export const getImage = () => elementByClass(swalClasses.image) + +/** + * @returns {HTMLElement | null} + */ +export const getProgressSteps = () => elementByClass(swalClasses['progress-steps']) + +/** + * @returns {HTMLElement | null} + */ +export const getValidationMessage = () => elementByClass(swalClasses['validation-message']) + +/** + * @returns {HTMLButtonElement | null} + */ +export const getConfirmButton = () => + /** @type {HTMLButtonElement} */ (elementBySelector(`.${swalClasses.actions} .${swalClasses.confirm}`)) + +/** + * @returns {HTMLButtonElement | null} + */ +export const getCancelButton = () => + /** @type {HTMLButtonElement} */ (elementBySelector(`.${swalClasses.actions} .${swalClasses.cancel}`)) + +/** + * @returns {HTMLButtonElement | null} + */ +export const getDenyButton = () => + /** @type {HTMLButtonElement} */ (elementBySelector(`.${swalClasses.actions} .${swalClasses.deny}`)) + +/** + * @returns {HTMLElement | null} + */ +export const getInputLabel = () => elementByClass(swalClasses['input-label']) + +/** + * @returns {HTMLElement | null} + */ +export const getLoader = () => elementBySelector(`.${swalClasses.loader}`) + +/** + * @returns {HTMLElement | null} + */ +export const getActions = () => elementByClass(swalClasses.actions) + +/** + * @returns {HTMLElement | null} + */ +export const getFooter = () => elementByClass(swalClasses.footer) + +/** + * @returns {HTMLElement | null} + */ +export const getTimerProgressBar = () => elementByClass(swalClasses['timer-progress-bar']) + +/** + * @returns {HTMLElement | null} + */ +export const getCloseButton = () => elementByClass(swalClasses.close) + +// https://github.com/jkup/focusable/blob/master/index.js +const focusable = ` + a[href], + area[href], + input:not([disabled]), + select:not([disabled]), + textarea:not([disabled]), + button:not([disabled]), + iframe, + object, + embed, + [tabindex="0"], + [contenteditable], + audio[controls], + video[controls], + summary +` +/** + * @returns {HTMLElement[]} + */ +export const getFocusableElements = () => { + const popup = getPopup() + if (!popup) { + return [] + } + /** @type {NodeListOf} */ + const focusableElementsWithTabindex = popup.querySelectorAll('[tabindex]:not([tabindex="-1"]):not([tabindex="0"])') + const focusableElementsWithTabindexSorted = Array.from(focusableElementsWithTabindex) + // sort according to tabindex + .sort((a, b) => { + const tabindexA = parseInt(a.getAttribute('tabindex') || '0') + const tabindexB = parseInt(b.getAttribute('tabindex') || '0') + if (tabindexA > tabindexB) { + return 1 + } else if (tabindexA < tabindexB) { + return -1 + } + return 0 + }) + + /** @type {NodeListOf} */ + const otherFocusableElements = popup.querySelectorAll(focusable) + const otherFocusableElementsFiltered = Array.from(otherFocusableElements).filter( + (el) => el.getAttribute('tabindex') !== '-1' + ) + + return [...new Set(focusableElementsWithTabindexSorted.concat(otherFocusableElementsFiltered))].filter((el) => + isVisible(el) + ) +} + +/** + * @returns {boolean} + */ +export const isModal = () => { + return ( + hasClass(document.body, swalClasses.shown) && + !hasClass(document.body, swalClasses['toast-shown']) && + !hasClass(document.body, swalClasses['no-backdrop']) + ) +} + +/** + * @returns {boolean} + */ +export const isToast = () => { + const popup = getPopup() + if (!popup) { + return false + } + return hasClass(popup, swalClasses.toast) +} + +/** + * @returns {boolean} + */ +export const isLoading = () => { + const popup = getPopup() + if (!popup) { + return false + } + return popup.hasAttribute('data-loading') +} diff --git a/public/assets/sweetalert2/src/utils/dom/index.js b/public/assets/sweetalert2/src/utils/dom/index.js new file mode 100644 index 0000000..8832c9e --- /dev/null +++ b/public/assets/sweetalert2/src/utils/dom/index.js @@ -0,0 +1,5 @@ +export * from './domUtils.js' +export * from './init.js' +export * from './getters.js' +export * from './parseHtmlToContainer.js' +export * from './renderers/render.js' diff --git a/public/assets/sweetalert2/src/utils/dom/init.js b/public/assets/sweetalert2/src/utils/dom/init.js new file mode 100644 index 0000000..1e820e6 --- /dev/null +++ b/public/assets/sweetalert2/src/utils/dom/init.js @@ -0,0 +1,193 @@ +import globalState from '../../globalState.js' +import { swalClasses } from '../classes.js' +import { isNodeEnv } from '../isNodeEnv.js' +import { error } from '../utils.js' +import { addClass, getDirectChildByClass, removeClass, setInnerHtml } from './domUtils.js' +import { getContainer, getPopup } from './getters.js' + +const sweetHTML = ` +
                    + +
                      +
                      + +

                      +
                      + + +
                      + + +
                      + +
                      + + +
                      +
                      +
                      + + + +
                      +
                      +
                      +
                      +
                      +
                      +`.replace(/(^|\n)\s*/g, '') + +/** + * @returns {boolean} + */ +const resetOldContainer = () => { + const oldContainer = getContainer() + if (!oldContainer) { + return false + } + + oldContainer.remove() + removeClass( + [document.documentElement, document.body], + [ + swalClasses['no-backdrop'], + swalClasses['toast-shown'], + // @ts-ignore: 'has-column' is not defined in swalClasses but may be set dynamically + swalClasses['has-column'], + ] + ) + + return true +} + +const resetValidationMessage = () => { + if (globalState.currentInstance) { + globalState.currentInstance.resetValidationMessage() + } +} + +const addInputChangeListeners = () => { + const popup = getPopup() + if (!popup) { + return + } + + const input = getDirectChildByClass(popup, swalClasses.input) + const file = getDirectChildByClass(popup, swalClasses.file) + /** @type {HTMLInputElement | null} */ + const range = popup.querySelector(`.${swalClasses.range} input`) + /** @type {HTMLOutputElement | null} */ + const rangeOutput = popup.querySelector(`.${swalClasses.range} output`) + const select = getDirectChildByClass(popup, swalClasses.select) + /** @type {HTMLInputElement | null} */ + const checkbox = popup.querySelector(`.${swalClasses.checkbox} input`) + const textarea = getDirectChildByClass(popup, swalClasses.textarea) + + if (input) { + input.oninput = resetValidationMessage + } + if (file) { + file.onchange = resetValidationMessage + } + if (select) { + select.onchange = resetValidationMessage + } + if (checkbox) { + checkbox.onchange = resetValidationMessage + } + if (textarea) { + textarea.oninput = resetValidationMessage + } + + if (range && rangeOutput) { + range.oninput = () => { + resetValidationMessage() + rangeOutput.value = range.value + } + + range.onchange = () => { + resetValidationMessage() + rangeOutput.value = range.value + } + } +} + +/** + * @param {string | HTMLElement} target + * @returns {HTMLElement} + */ +const getTarget = (target) => { + if (typeof target === 'string') { + const element = document.querySelector(target) + if (!element) { + throw new Error(`Target element "${target}" not found`) + } + return /** @type {HTMLElement} */ (element) + } + return target +} + +/** + * @param {SweetAlertOptions} params + */ +const setupAccessibility = (params) => { + const popup = getPopup() + if (!popup) { + return + } + + popup.setAttribute('role', params.toast ? 'alert' : 'dialog') + popup.setAttribute('aria-live', params.toast ? 'polite' : 'assertive') + if (!params.toast) { + popup.setAttribute('aria-modal', 'true') + } +} + +/** + * @param {HTMLElement} targetElement + */ +const setupRTL = (targetElement) => { + if (window.getComputedStyle(targetElement).direction === 'rtl') { + addClass(getContainer(), swalClasses.rtl) + globalState.isRTL = true + } +} + +/** + * Add modal + backdrop to DOM + * + * @param {SweetAlertOptions} params + */ +export const init = (params) => { + // Clean up the old popup container if it exists + const oldContainerExisted = resetOldContainer() + + if (isNodeEnv()) { + error('SweetAlert2 requires document to initialize') + return + } + + const container = document.createElement('div') + container.className = swalClasses.container + if (oldContainerExisted) { + addClass(container, swalClasses['no-transition']) + } + setInnerHtml(container, sweetHTML) + + container.dataset['swal2Theme'] = params.theme + + const targetElement = getTarget(params.target || 'body') + targetElement.appendChild(container) + + if (params.topLayer) { + container.setAttribute('popover', '') + container.showPopover() + } + + setupAccessibility(params) + setupRTL(targetElement) + addInputChangeListeners() +} diff --git a/public/assets/sweetalert2/src/utils/dom/inputUtils.js b/public/assets/sweetalert2/src/utils/dom/inputUtils.js new file mode 100644 index 0000000..22b1a5e --- /dev/null +++ b/public/assets/sweetalert2/src/utils/dom/inputUtils.js @@ -0,0 +1,239 @@ +import { showLoading } from '../../staticMethods/showLoading.js' +import { swalClasses } from '../classes.js' +import { asPromise, error, hasToPromiseFn, isPromise } from '../utils.js' +import { getDirectChildByClass } from './domUtils.js' +import * as dom from './index.js' + +/** + * @param {SweetAlert} instance + * @param {SweetAlertOptions} params + */ +export const handleInputOptionsAndValue = (instance, params) => { + if (params.input === 'select' || params.input === 'radio') { + handleInputOptions(instance, params) + } else if ( + ['text', 'email', 'number', 'tel', 'textarea'].some((i) => i === params.input) && + (hasToPromiseFn(params.inputValue) || isPromise(params.inputValue)) + ) { + showLoading(dom.getConfirmButton()) + handleInputValue(instance, params) + } +} + +/** + * @param {SweetAlert} instance + * @param {SweetAlertOptions} innerParams + * @returns {SweetAlertInputValue} + */ +export const getInputValue = (instance, innerParams) => { + const input = instance.getInput() + if (!input) { + return null + } + switch (innerParams.input) { + case 'checkbox': + return getCheckboxValue(input) + case 'radio': + return getRadioValue(input) + case 'file': + return getFileValue(input) + default: + return innerParams.inputAutoTrim ? input.value.trim() : input.value + } +} + +/** + * @param {HTMLInputElement} input + * @returns {number} + */ +const getCheckboxValue = (input) => (input.checked ? 1 : 0) + +/** + * @param {HTMLInputElement} input + * @returns {string | null} + */ +const getRadioValue = (input) => (input.checked ? input.value : null) + +/** + * @param {HTMLInputElement} input + * @returns {FileList | File | null} + */ +const getFileValue = (input) => + input.files && input.files.length ? (input.getAttribute('multiple') !== null ? input.files : input.files[0]) : null + +/** + * @param {SweetAlert} instance + * @param {SweetAlertOptions} params + */ +const handleInputOptions = (instance, params) => { + const popup = dom.getPopup() + if (!popup) { + return + } + /** + * @param {*} inputOptions + */ + const processInputOptions = (inputOptions) => { + if (params.input === 'select') { + populateSelectOptions(popup, formatInputOptions(inputOptions), params) + } else if (params.input === 'radio') { + populateRadioOptions(popup, formatInputOptions(inputOptions), params) + } + } + if (hasToPromiseFn(params.inputOptions) || isPromise(params.inputOptions)) { + showLoading(dom.getConfirmButton()) + asPromise(params.inputOptions).then((inputOptions) => { + instance.hideLoading() + processInputOptions(inputOptions) + }) + } else if (typeof params.inputOptions === 'object') { + processInputOptions(params.inputOptions) + } else { + error(`Unexpected type of inputOptions! Expected object, Map or Promise, got ${typeof params.inputOptions}`) + } +} + +/** + * @param {SweetAlert} instance + * @param {SweetAlertOptions} params + */ +const handleInputValue = (instance, params) => { + const input = instance.getInput() + if (!input) { + return + } + dom.hide(input) + asPromise(params.inputValue) + .then((inputValue) => { + input.value = params.input === 'number' ? `${parseFloat(inputValue) || 0}` : `${inputValue}` + dom.show(input) + input.focus() + instance.hideLoading() + }) + .catch((err) => { + error(`Error in inputValue promise: ${err}`) + input.value = '' + dom.show(input) + input.focus() + instance.hideLoading() + }) +} + +/** + * @param {HTMLElement} popup + * @param {InputOptionFlattened[]} inputOptions + * @param {SweetAlertOptions} params + */ +function populateSelectOptions(popup, inputOptions, params) { + const select = getDirectChildByClass(popup, swalClasses.select) + if (!select) { + return + } + /** + * @param {HTMLElement} parent + * @param {string} optionLabel + * @param {string} optionValue + */ + const renderOption = (parent, optionLabel, optionValue) => { + const option = document.createElement('option') + option.value = optionValue + dom.setInnerHtml(option, optionLabel) + option.selected = isSelected(optionValue, params.inputValue) + parent.appendChild(option) + } + inputOptions.forEach((inputOption) => { + const optionValue = inputOption[0] + const optionLabel = inputOption[1] + // spec: + // https://www.w3.org/TR/html401/interact/forms.html#h-17.6 + // "...all OPTGROUP elements must be specified directly within a SELECT element (i.e., groups may not be nested)..." + // check whether this is a + if (Array.isArray(optionLabel)) { + // if it is an array, then it is an + const optgroup = document.createElement('optgroup') + optgroup.label = optionValue + optgroup.disabled = false // not configurable for now + select.appendChild(optgroup) + optionLabel.forEach((o) => renderOption(optgroup, o[1], o[0])) + } else { + // case of + valueFormatted = formatInputOptions(valueFormatted) + } + result.push([key, valueFormatted]) + }) + } else { + Object.keys(inputOptions).forEach((key) => { + let valueFormatted = inputOptions[key] + if (typeof valueFormatted === 'object') { + // case of + valueFormatted = formatInputOptions(valueFormatted) + } + result.push([key, valueFormatted]) + }) + } + return result +} + +/** + * @param {string} optionValue + * @param {SweetAlertInputValue} inputValue + * @returns {boolean} + */ +const isSelected = (optionValue, inputValue) => { + return Boolean(inputValue) && (inputValue !== null && inputValue !== undefined) && inputValue.toString() === optionValue.toString() +} diff --git a/public/assets/sweetalert2/src/utils/dom/parseHtmlToContainer.js b/public/assets/sweetalert2/src/utils/dom/parseHtmlToContainer.js new file mode 100644 index 0000000..60ee527 --- /dev/null +++ b/public/assets/sweetalert2/src/utils/dom/parseHtmlToContainer.js @@ -0,0 +1,53 @@ +import { setInnerHtml } from './domUtils.js' + +/** + * @param {HTMLElement | object | string} param + * @param {HTMLElement} target + */ +export const parseHtmlToContainer = (param, target) => { + // DOM element + if (param instanceof HTMLElement) { + target.appendChild(param) + } + + // Object + else if (typeof param === 'object') { + handleObject(param, target) + } + + // Plain string + else if (param) { + setInnerHtml(target, param) + } +} + +/** + * @param {object} param + * @param {HTMLElement} target + */ +const handleObject = (param, target) => { + // JQuery element(s) + if ('jquery' in param) { + handleJqueryElem(target, param) + } + + // For other objects use their string representation + else { + setInnerHtml(target, param.toString()) + } +} + +/** + * @param {HTMLElement} target + * @param {any} elem + */ +const handleJqueryElem = (target, elem) => { + target.textContent = '' + if (0 in elem) { + for (let i = 0; i in elem; i++) { + target.appendChild(elem[i].cloneNode(true)) + } + } else { + target.appendChild(elem.cloneNode(true)) + } +} diff --git a/public/assets/sweetalert2/src/utils/dom/renderers/render.js b/public/assets/sweetalert2/src/utils/dom/renderers/render.js new file mode 100644 index 0000000..84c2864 --- /dev/null +++ b/public/assets/sweetalert2/src/utils/dom/renderers/render.js @@ -0,0 +1,37 @@ +import globalState from '../../../globalState.js' +import { getPopup } from '../getters.js' +import { renderActions } from './renderActions.js' +import { renderCloseButton } from './renderCloseButton.js' +import { renderContainer } from './renderContainer.js' +import { renderContent } from './renderContent.js' +import { renderFooter } from './renderFooter.js' +import { renderIcon } from './renderIcon.js' +import { renderImage } from './renderImage.js' +import { renderPopup } from './renderPopup.js' +import { renderProgressSteps } from './renderProgressSteps.js' +import { renderTitle } from './renderTitle.js' + +/** + * @param {SweetAlert} instance + * @param {SweetAlertOptions} params + */ +export const render = (instance, params) => { + renderPopup(instance, params) + renderContainer(instance, params) + + renderProgressSteps(instance, params) + renderIcon(instance, params) + renderImage(instance, params) + renderTitle(instance, params) + renderCloseButton(instance, params) + + renderContent(instance, params) + renderActions(instance, params) + renderFooter(instance, params) + + const popup = getPopup() + if (typeof params.didRender === 'function' && popup) { + params.didRender(popup) + } + globalState.eventEmitter?.emit('didRender', popup) +} diff --git a/public/assets/sweetalert2/src/utils/dom/renderers/renderActions.js b/public/assets/sweetalert2/src/utils/dom/renderers/renderActions.js new file mode 100644 index 0000000..6edfcfe --- /dev/null +++ b/public/assets/sweetalert2/src/utils/dom/renderers/renderActions.js @@ -0,0 +1,127 @@ +import { swalClasses } from '../../classes.js' +import * as dom from '../../dom/index.js' +import { capitalizeFirstLetter } from '../../utils.js' + +/** + * @param {SweetAlert} instance + * @param {SweetAlertOptions} params + */ +export const renderActions = (instance, params) => { + const actions = dom.getActions() + const loader = dom.getLoader() + if (!actions || !loader) { + return + } + + // Actions (buttons) wrapper + if (!params.showConfirmButton && !params.showDenyButton && !params.showCancelButton) { + dom.hide(actions) + } else { + dom.show(actions) + } + + // Custom class + dom.applyCustomClass(actions, params, 'actions') + + // Render all the buttons + renderButtons(actions, loader, params) + + // Loader + dom.setInnerHtml(loader, params.loaderHtml || '') + dom.applyCustomClass(loader, params, 'loader') +} + +/** + * @param {HTMLElement} actions + * @param {HTMLElement} loader + * @param {SweetAlertOptions} params + */ +function renderButtons(actions, loader, params) { + const confirmButton = dom.getConfirmButton() + const denyButton = dom.getDenyButton() + const cancelButton = dom.getCancelButton() + if (!confirmButton || !denyButton || !cancelButton) { + return + } + + // Render buttons + renderButton(confirmButton, 'confirm', params) + renderButton(denyButton, 'deny', params) + renderButton(cancelButton, 'cancel', params) + handleButtonsStyling(confirmButton, denyButton, cancelButton, params) + + if (params.reverseButtons) { + if (params.toast) { + actions.insertBefore(cancelButton, confirmButton) + actions.insertBefore(denyButton, confirmButton) + } else { + actions.insertBefore(cancelButton, loader) + actions.insertBefore(denyButton, loader) + actions.insertBefore(confirmButton, loader) + } + } +} + +/** + * @param {HTMLElement} confirmButton + * @param {HTMLElement} denyButton + * @param {HTMLElement} cancelButton + * @param {SweetAlertOptions} params + */ +function handleButtonsStyling(confirmButton, denyButton, cancelButton, params) { + if (!params.buttonsStyling) { + dom.removeClass([confirmButton, denyButton, cancelButton], swalClasses.styled) + return + } + + dom.addClass([confirmButton, denyButton, cancelButton], swalClasses.styled) + + // Apply custom background colors to action buttons + if (params.confirmButtonColor) { + confirmButton.style.setProperty('--swal2-confirm-button-background-color', params.confirmButtonColor) + } + if (params.denyButtonColor) { + denyButton.style.setProperty('--swal2-deny-button-background-color', params.denyButtonColor) + } + if (params.cancelButtonColor) { + cancelButton.style.setProperty('--swal2-cancel-button-background-color', params.cancelButtonColor) + } + + // Apply the outline color to action buttons + applyOutlineColor(confirmButton) + applyOutlineColor(denyButton) + applyOutlineColor(cancelButton) +} + +/** + * @param {HTMLElement} button + */ +function applyOutlineColor(button) { + const buttonStyle = window.getComputedStyle(button) + if (buttonStyle.getPropertyValue('--swal2-action-button-focus-box-shadow')) { + // If the button already has a custom outline color, no need to change it + return + } + const outlineColor = buttonStyle.backgroundColor.replace(/rgba?\((\d+), (\d+), (\d+).*/, 'rgba($1, $2, $3, 0.5)') + button.style.setProperty( + '--swal2-action-button-focus-box-shadow', + buttonStyle.getPropertyValue('--swal2-outline').replace(/ rgba\(.*/, ` ${outlineColor}`) + ) +} + +/** + * @param {HTMLElement} button + * @param {'confirm' | 'deny' | 'cancel'} buttonType + * @param {SweetAlertOptions} params + */ +function renderButton(button, buttonType, params) { + const buttonName = /** @type {'Confirm' | 'Deny' | 'Cancel'} */ (capitalizeFirstLetter(buttonType)) + + dom.toggle(button, params[`show${buttonName}Button`], 'inline-block') + dom.setInnerHtml(button, params[`${buttonType}ButtonText`] || '') // Set caption text + button.setAttribute('aria-label', params[`${buttonType}ButtonAriaLabel`] || '') // ARIA label + + // Add buttons custom classes + button.className = swalClasses[buttonType] + dom.applyCustomClass(button, params, `${buttonType}Button`) +} diff --git a/public/assets/sweetalert2/src/utils/dom/renderers/renderCloseButton.js b/public/assets/sweetalert2/src/utils/dom/renderers/renderCloseButton.js new file mode 100644 index 0000000..127c4e8 --- /dev/null +++ b/public/assets/sweetalert2/src/utils/dom/renderers/renderCloseButton.js @@ -0,0 +1,20 @@ +import * as dom from '../../dom/index.js' + +/** + * @param {SweetAlert} instance + * @param {SweetAlertOptions} params + */ +export const renderCloseButton = (instance, params) => { + const closeButton = dom.getCloseButton() + if (!closeButton) { + return + } + + dom.setInnerHtml(closeButton, params.closeButtonHtml || '') + + // Custom class + dom.applyCustomClass(closeButton, params, 'closeButton') + + dom.toggle(closeButton, params.showCloseButton) + closeButton.setAttribute('aria-label', params.closeButtonAriaLabel || '') +} diff --git a/public/assets/sweetalert2/src/utils/dom/renderers/renderContainer.js b/public/assets/sweetalert2/src/utils/dom/renderers/renderContainer.js new file mode 100644 index 0000000..f79daf3 --- /dev/null +++ b/public/assets/sweetalert2/src/utils/dom/renderers/renderContainer.js @@ -0,0 +1,62 @@ +import { swalClasses } from '../../classes.js' +import * as dom from '../../dom/index.js' +import { warn } from '../../utils.js' + +/** + * @param {SweetAlert} instance + * @param {SweetAlertOptions} params + */ +export const renderContainer = (instance, params) => { + const container = dom.getContainer() + + if (!container) { + return + } + + handleBackdropParam(container, params.backdrop) + + handlePositionParam(container, params.position) + handleGrowParam(container, params.grow) + + // Custom class + dom.applyCustomClass(container, params, 'container') +} + +/** + * @param {HTMLElement} container + * @param {SweetAlertOptions['backdrop']} backdrop + */ +function handleBackdropParam(container, backdrop) { + if (typeof backdrop === 'string') { + container.style.background = backdrop + } else if (!backdrop) { + dom.addClass([document.documentElement, document.body], swalClasses['no-backdrop']) + } +} + +/** + * @param {HTMLElement} container + * @param {SweetAlertOptions['position']} position + */ +function handlePositionParam(container, position) { + if (!position) { + return + } + if (position in swalClasses) { + dom.addClass(container, swalClasses[position]) + } else { + warn('The "position" parameter is not valid, defaulting to "center"') + dom.addClass(container, swalClasses.center) + } +} + +/** + * @param {HTMLElement} container + * @param {SweetAlertOptions['grow']} grow + */ +function handleGrowParam(container, grow) { + if (!grow) { + return + } + dom.addClass(container, swalClasses[`grow-${grow}`]) +} diff --git a/public/assets/sweetalert2/src/utils/dom/renderers/renderContent.js b/public/assets/sweetalert2/src/utils/dom/renderers/renderContent.js new file mode 100644 index 0000000..e8c757e --- /dev/null +++ b/public/assets/sweetalert2/src/utils/dom/renderers/renderContent.js @@ -0,0 +1,36 @@ +import * as dom from '../../dom/index.js' +import { renderInput } from './renderInput.js' + +/** + * @param {SweetAlert} instance + * @param {SweetAlertOptions} params + */ +export const renderContent = (instance, params) => { + const htmlContainer = dom.getHtmlContainer() + if (!htmlContainer) { + return + } + + dom.showWhenInnerHtmlPresent(htmlContainer) + + dom.applyCustomClass(htmlContainer, params, 'htmlContainer') + + // Content as HTML + if (params.html) { + dom.parseHtmlToContainer(params.html, htmlContainer) + dom.show(htmlContainer, 'block') + } + + // Content as plain text + else if (params.text) { + htmlContainer.textContent = params.text + dom.show(htmlContainer, 'block') + } + + // No content + else { + dom.hide(htmlContainer) + } + + renderInput(instance, params) +} diff --git a/public/assets/sweetalert2/src/utils/dom/renderers/renderFooter.js b/public/assets/sweetalert2/src/utils/dom/renderers/renderFooter.js new file mode 100644 index 0000000..995e0d6 --- /dev/null +++ b/public/assets/sweetalert2/src/utils/dom/renderers/renderFooter.js @@ -0,0 +1,23 @@ +import * as dom from '../../dom/index.js' + +/** + * @param {SweetAlert} instance + * @param {SweetAlertOptions} params + */ +export const renderFooter = (instance, params) => { + const footer = dom.getFooter() + if (!footer) { + return + } + + dom.showWhenInnerHtmlPresent(footer) + + dom.toggle(footer, Boolean(params.footer), 'block') + + if (params.footer) { + dom.parseHtmlToContainer(params.footer, footer) + } + + // Custom class + dom.applyCustomClass(footer, params, 'footer') +} diff --git a/public/assets/sweetalert2/src/utils/dom/renderers/renderIcon.js b/public/assets/sweetalert2/src/utils/dom/renderers/renderIcon.js new file mode 100644 index 0000000..0a9e08e --- /dev/null +++ b/public/assets/sweetalert2/src/utils/dom/renderers/renderIcon.js @@ -0,0 +1,164 @@ +import privateProps from '../../../privateProps.js' +import { iconTypes, swalClasses } from '../../classes.js' +import * as dom from '../../dom/index.js' +import { error } from '../../utils.js' + +/** + * @param {SweetAlert} instance + * @param {SweetAlertOptions} params + */ +export const renderIcon = (instance, params) => { + const innerParams = privateProps.innerParams.get(instance) + const icon = dom.getIcon() + if (!icon) { + return + } + + // if the given icon already rendered, apply the styling without re-rendering the icon + if (innerParams && params.icon === innerParams.icon) { + // Custom or default content + setContent(icon, params) + + applyStyles(icon, params) + return + } + + if (!params.icon && !params.iconHtml) { + dom.hide(icon) + return + } + + if (params.icon && Object.keys(iconTypes).indexOf(params.icon) === -1) { + error(`Unknown icon! Expected "success", "error", "warning", "info" or "question", got "${params.icon}"`) + dom.hide(icon) + return + } + + dom.show(icon) + + // Custom or default content + setContent(icon, params) + + applyStyles(icon, params) + + // Animate icon + dom.addClass(icon, params.showClass && params.showClass.icon) + + // Re-adjust the success icon on system theme change + const colorSchemeQueryList = window.matchMedia('(prefers-color-scheme: dark)') + colorSchemeQueryList.addEventListener('change', adjustSuccessIconBackgroundColor) +} + +/** + * @param {HTMLElement} icon + * @param {SweetAlertOptions} params + */ +const applyStyles = (icon, params) => { + for (const [iconType, iconClassName] of Object.entries(iconTypes)) { + if (params.icon !== iconType) { + dom.removeClass(icon, iconClassName) + } + } + dom.addClass(icon, params.icon && iconTypes[params.icon]) + + // Icon color + setColor(icon, params) + + // Success icon background color + adjustSuccessIconBackgroundColor() + + // Custom class + dom.applyCustomClass(icon, params, 'icon') +} + +// Adjust success icon background color to match the popup background color +const adjustSuccessIconBackgroundColor = () => { + const popup = dom.getPopup() + if (!popup) { + return + } + const popupBackgroundColor = window.getComputedStyle(popup).getPropertyValue('background-color') + /** @type {NodeListOf} */ + const successIconParts = popup.querySelectorAll('[class^=swal2-success-circular-line], .swal2-success-fix') + for (let i = 0; i < successIconParts.length; i++) { + successIconParts[i].style.backgroundColor = popupBackgroundColor + } +} + +/** + * + * @param {SweetAlertOptions} params + * @returns {string} + */ +const successIconHtml = (params) => ` + ${params.animation ? '
                      ' : ''} + +
                      + ${params.animation ? '
                      ' : ''} + ${params.animation ? '
                      ' : ''} +` + +const errorIconHtml = ` + + + + +` + +/** + * @param {HTMLElement} icon + * @param {SweetAlertOptions} params + */ +const setContent = (icon, params) => { + if (!params.icon && !params.iconHtml) { + return + } + let oldContent = icon.innerHTML + let newContent = '' + if (params.iconHtml) { + newContent = iconContent(params.iconHtml) + } else if (params.icon === 'success') { + newContent = successIconHtml(params) + oldContent = oldContent.replace(/ style=".*?"/g, '') // undo adjustSuccessIconBackgroundColor() + } else if (params.icon === 'error') { + newContent = errorIconHtml + } else if (params.icon) { + const defaultIconHtml = { + question: '?', + warning: '!', + info: 'i', + } + newContent = iconContent(defaultIconHtml[params.icon]) + } + + if (oldContent.trim() !== newContent.trim()) { + dom.setInnerHtml(icon, newContent) + } +} + +/** + * @param {HTMLElement} icon + * @param {SweetAlertOptions} params + */ +const setColor = (icon, params) => { + if (!params.iconColor) { + return + } + icon.style.color = params.iconColor + icon.style.borderColor = params.iconColor + for (const sel of [ + '.swal2-success-line-tip', + '.swal2-success-line-long', + '.swal2-x-mark-line-left', + '.swal2-x-mark-line-right', + ]) { + dom.setStyle(icon, sel, 'background-color', params.iconColor) + } + dom.setStyle(icon, '.swal2-success-ring', 'border-color', params.iconColor) +} + +/** + * @param {string} content + * @returns {string} + */ +const iconContent = (content) => `
                      ${content}
                      ` diff --git a/public/assets/sweetalert2/src/utils/dom/renderers/renderImage.js b/public/assets/sweetalert2/src/utils/dom/renderers/renderImage.js new file mode 100644 index 0000000..a9670be --- /dev/null +++ b/public/assets/sweetalert2/src/utils/dom/renderers/renderImage.js @@ -0,0 +1,32 @@ +import { swalClasses } from '../../classes.js' +import * as dom from '../../dom/index.js' + +/** + * @param {SweetAlert} instance + * @param {SweetAlertOptions} params + */ +export const renderImage = (instance, params) => { + const image = dom.getImage() + if (!image) { + return + } + + if (!params.imageUrl) { + dom.hide(image) + return + } + + dom.show(image, '') + + // Src, alt + image.setAttribute('src', params.imageUrl) + image.setAttribute('alt', params.imageAlt || '') + + // Width, height + dom.applyNumericalStyle(image, 'width', params.imageWidth) + dom.applyNumericalStyle(image, 'height', params.imageHeight) + + // Class + image.className = swalClasses.image + dom.applyCustomClass(image, params, 'image') +} diff --git a/public/assets/sweetalert2/src/utils/dom/renderers/renderInput.js b/public/assets/sweetalert2/src/utils/dom/renderers/renderInput.js new file mode 100644 index 0000000..6ffa439 --- /dev/null +++ b/public/assets/sweetalert2/src/utils/dom/renderers/renderInput.js @@ -0,0 +1,353 @@ +/// + +/** + * @typedef { HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement } Input + * @typedef { 'input' | 'file' | 'range' | 'select' | 'radio' | 'checkbox' | 'textarea' } InputClass + */ +import privateProps from '../../../privateProps.js' +import { swalClasses } from '../../classes.js' +import * as dom from '../../dom/index.js' +import { error, isPromise, warn } from '../../utils.js' + +/** @type {InputClass[]} */ +const inputClasses = ['input', 'file', 'range', 'select', 'radio', 'checkbox', 'textarea'] + +/** + * @param {SweetAlert} instance + * @param {SweetAlertOptions} params + */ +export const renderInput = (instance, params) => { + const popup = dom.getPopup() + if (!popup) { + return + } + const innerParams = privateProps.innerParams.get(instance) + const rerender = !innerParams || params.input !== innerParams.input + + inputClasses.forEach((inputClass) => { + const inputContainer = dom.getDirectChildByClass(popup, swalClasses[inputClass]) + + if (!inputContainer) { + return + } + + // set attributes + setAttributes(inputClass, params.inputAttributes) + + // set class + inputContainer.className = swalClasses[inputClass] + + if (rerender) { + dom.hide(inputContainer) + } + }) + + if (params.input) { + if (rerender) { + showInput(params) + } + // set custom class + setCustomClass(params) + } +} + +/** + * @param {SweetAlertOptions} params + */ +const showInput = (params) => { + if (!params.input) { + return + } + + if (!renderInputType[params.input]) { + error(`Unexpected type of input! Expected ${Object.keys(renderInputType).join(' | ')}, got "${params.input}"`) + return + } + + const inputContainer = getInputContainer(params.input) + if (!inputContainer) { + return + } + + const input = renderInputType[params.input](inputContainer, params) + dom.show(inputContainer) + + // input autofocus + if (params.inputAutoFocus) { + setTimeout(() => { + dom.focusInput(input) + }) + } +} + +/** + * @param {HTMLInputElement} input + */ +const removeAttributes = (input) => { + for (let i = 0; i < input.attributes.length; i++) { + const attrName = input.attributes[i].name + if (!['id', 'type', 'value', 'style'].includes(attrName)) { + input.removeAttribute(attrName) + } + } +} + +/** + * @param {InputClass} inputClass + * @param {SweetAlertOptions['inputAttributes']} inputAttributes + */ +const setAttributes = (inputClass, inputAttributes) => { + const popup = dom.getPopup() + if (!popup) { + return + } + + const input = dom.getInput(popup, inputClass) + if (!input) { + return + } + + removeAttributes(input) + + for (const attr in inputAttributes) { + input.setAttribute(attr, inputAttributes[attr]) + } +} + +/** + * @param {SweetAlertOptions} params + */ +const setCustomClass = (params) => { + if (!params.input) { + return + } + const inputContainer = getInputContainer(params.input) + if (inputContainer) { + dom.applyCustomClass(inputContainer, params, 'input') + } +} + +/** + * @param {HTMLInputElement | HTMLTextAreaElement} input + * @param {SweetAlertOptions} params + */ +const setInputPlaceholder = (input, params) => { + if (!input.placeholder && params.inputPlaceholder) { + input.placeholder = params.inputPlaceholder + } +} + +/** + * @param {Input} input + * @param {Input} prependTo + * @param {SweetAlertOptions} params + */ +const setInputLabel = (input, prependTo, params) => { + if (params.inputLabel) { + const label = document.createElement('label') + const labelClass = swalClasses['input-label'] + label.setAttribute('for', input.id) + label.className = labelClass + if (typeof params.customClass === 'object') { + dom.addClass(label, params.customClass.inputLabel) + } + label.innerText = params.inputLabel + prependTo.insertAdjacentElement('beforebegin', label) + } +} + +/** + * @param {SweetAlertInput} inputType + * @returns {HTMLElement | undefined} + */ +const getInputContainer = (inputType) => { + const popup = dom.getPopup() + if (!popup) { + return + } + + return dom.getDirectChildByClass(popup, swalClasses[/** @type {SwalClass} */ (inputType)] || swalClasses.input) +} + +/** + * @param {HTMLInputElement | HTMLOutputElement | HTMLTextAreaElement} input + * @param {SweetAlertOptions['inputValue']} inputValue + */ +const checkAndSetInputValue = (input, inputValue) => { + if (['string', 'number'].includes(typeof inputValue)) { + input.value = `${inputValue}` + } else if (!isPromise(inputValue)) { + warn(`Unexpected type of inputValue! Expected "string", "number" or "Promise", got "${typeof inputValue}"`) + } +} + +/** @type {Record Input>} */ +const renderInputType = {} + +/** + * @param {Input | HTMLElement} input + * @param {SweetAlertOptions} params + * @returns {Input} + */ +renderInputType.text = + renderInputType.email = + renderInputType.password = + renderInputType.number = + renderInputType.tel = + renderInputType.url = + renderInputType.search = + renderInputType.date = + renderInputType['datetime-local'] = + renderInputType.time = + renderInputType.week = + renderInputType.month = + /** @type {(input: Input | HTMLElement, params: SweetAlertOptions) => Input} */ + (input, params) => { + const inputElement = /** @type {HTMLInputElement} */ (input) + checkAndSetInputValue(inputElement, params.inputValue) + setInputLabel(inputElement, inputElement, params) + setInputPlaceholder(inputElement, params) + inputElement.type = /** @type {string} */ (params.input) + return inputElement + } + +/** + * @param {Input | HTMLElement} input + * @param {SweetAlertOptions} params + * @returns {Input} + */ +renderInputType.file = (input, params) => { + const inputElement = /** @type {HTMLInputElement} */ (input) + setInputLabel(inputElement, inputElement, params) + setInputPlaceholder(inputElement, params) + return inputElement +} + +/** + * @param {Input | HTMLElement} range + * @param {SweetAlertOptions} params + * @returns {Input} + */ +renderInputType.range = (range, params) => { + const rangeContainer = /** @type {HTMLElement} */ (range) + const rangeInput = rangeContainer.querySelector('input') + const rangeOutput = rangeContainer.querySelector('output') + if (rangeInput) { + checkAndSetInputValue(rangeInput, params.inputValue) + rangeInput.type = /** @type {string} */ (params.input) + setInputLabel(rangeInput, /** @type {Input} */ (range), params) + } + if (rangeOutput) { + checkAndSetInputValue(rangeOutput, params.inputValue) + } + return /** @type {Input} */ (range) +} + +/** + * @param {Input | HTMLElement} select + * @param {SweetAlertOptions} params + * @returns {Input} + */ +renderInputType.select = (select, params) => { + const selectElement = /** @type {HTMLSelectElement} */ (select) + selectElement.textContent = '' + if (params.inputPlaceholder) { + const placeholder = document.createElement('option') + dom.setInnerHtml(placeholder, params.inputPlaceholder) + placeholder.value = '' + placeholder.disabled = true + placeholder.selected = true + selectElement.appendChild(placeholder) + } + setInputLabel(selectElement, selectElement, params) + return selectElement +} + +/** + * @param {Input | HTMLElement} radio + * @returns {Input} + */ +renderInputType.radio = (radio) => { + const radioElement = /** @type {HTMLElement} */ (radio) + radioElement.textContent = '' + return /** @type {Input} */ (radio) +} + +/** + * @param {Input | HTMLElement} checkboxContainer + * @param {SweetAlertOptions} params + * @returns {Input} + */ +renderInputType.checkbox = (checkboxContainer, params) => { + const popup = dom.getPopup() + if (!popup) { + throw new Error('Popup not found') + } + const checkbox = dom.getInput(popup, 'checkbox') + if (!checkbox) { + throw new Error('Checkbox input not found') + } + checkbox.value = '1' + checkbox.checked = Boolean(params.inputValue) + const containerElement = /** @type {HTMLElement} */ (checkboxContainer) + const label = containerElement.querySelector('span') + if (label) { + const placeholderOrLabel = params.inputPlaceholder || params.inputLabel + if (placeholderOrLabel) { + dom.setInnerHtml(label, placeholderOrLabel) + } + } + return checkbox +} + +/** + * @param {Input | HTMLElement} textarea + * @param {SweetAlertOptions} params + * @returns {Input} + */ +renderInputType.textarea = (textarea, params) => { + const textareaElement = /** @type {HTMLTextAreaElement} */ (textarea) + checkAndSetInputValue(textareaElement, params.inputValue) + setInputPlaceholder(textareaElement, params) + setInputLabel(textareaElement, textareaElement, params) + + /** + * @param {HTMLElement} el + * @returns {number} + */ + const getMargin = (el) => + parseInt(window.getComputedStyle(el).marginLeft) + parseInt(window.getComputedStyle(el).marginRight) + + // https://github.com/sweetalert2/sweetalert2/issues/2291 + setTimeout(() => { + // https://github.com/sweetalert2/sweetalert2/issues/1699 + if ('MutationObserver' in window) { + const popup = dom.getPopup() + if (!popup) { + return + } + const initialPopupWidth = parseInt(window.getComputedStyle(popup).width) + const textareaResizeHandler = () => { + // check if texarea is still in document (i.e. popup wasn't closed in the meantime) + if (!document.body.contains(textareaElement)) { + return + } + const textareaWidth = textareaElement.offsetWidth + getMargin(textareaElement) + const popupElement = dom.getPopup() + if (popupElement) { + if (textareaWidth > initialPopupWidth) { + popupElement.style.width = `${textareaWidth}px` + } else { + dom.applyNumericalStyle(popupElement, 'width', params.width) + } + } + } + new MutationObserver(textareaResizeHandler).observe(textareaElement, { + attributes: true, + attributeFilter: ['style'], + }) + } + }) + + return textareaElement +} diff --git a/public/assets/sweetalert2/src/utils/dom/renderers/renderPopup.js b/public/assets/sweetalert2/src/utils/dom/renderers/renderPopup.js new file mode 100644 index 0000000..2eaa6be --- /dev/null +++ b/public/assets/sweetalert2/src/utils/dom/renderers/renderPopup.js @@ -0,0 +1,83 @@ +import { swalClasses } from '../../classes.js' +import { addDraggableListeners, removeDraggableListeners } from '../../draggable.js' +import * as dom from '../../dom/index.js' + +/** + * @param {SweetAlert} instance + * @param {SweetAlertOptions} params + */ +export const renderPopup = (instance, params) => { + const container = dom.getContainer() + const popup = dom.getPopup() + if (!container || !popup) { + return + } + + // Width + // https://github.com/sweetalert2/sweetalert2/issues/2170 + if (params.toast) { + dom.applyNumericalStyle(container, 'width', params.width) + popup.style.width = '100%' + const loader = dom.getLoader() + if (loader) { + popup.insertBefore(loader, dom.getIcon()) + } + } else { + dom.applyNumericalStyle(popup, 'width', params.width) + } + + // Padding + dom.applyNumericalStyle(popup, 'padding', params.padding) + + // Color + if (params.color) { + popup.style.color = params.color + } + + // Background + if (params.background) { + popup.style.background = params.background + } + + dom.hide(dom.getValidationMessage()) + + // Classes + addClasses(popup, params) + + if (params.draggable && !params.toast) { + dom.addClass(popup, swalClasses.draggable) + addDraggableListeners(popup) + } else { + dom.removeClass(popup, swalClasses.draggable) + removeDraggableListeners(popup) + } +} + +/** + * @param {HTMLElement} popup + * @param {SweetAlertOptions} params + */ +const addClasses = (popup, params) => { + const showClass = params.showClass || {} + // Default Class + showClass when updating Swal.update({}) + popup.className = `${swalClasses.popup} ${dom.isVisible(popup) ? showClass.popup : ''}` + + if (params.toast) { + dom.addClass([document.documentElement, document.body], swalClasses['toast-shown']) + dom.addClass(popup, swalClasses.toast) + } else { + dom.addClass(popup, swalClasses.modal) + } + + // Custom class + dom.applyCustomClass(popup, params, 'popup') + // TODO: remove in the next major + if (typeof params.customClass === 'string') { + dom.addClass(popup, params.customClass) + } + + // Icon class (#1842) + if (params.icon) { + dom.addClass(popup, swalClasses[`icon-${params.icon}`]) + } +} diff --git a/public/assets/sweetalert2/src/utils/dom/renderers/renderProgressSteps.js b/public/assets/sweetalert2/src/utils/dom/renderers/renderProgressSteps.js new file mode 100644 index 0000000..226a83a --- /dev/null +++ b/public/assets/sweetalert2/src/utils/dom/renderers/renderProgressSteps.js @@ -0,0 +1,67 @@ +import { swalClasses } from '../../classes.js' +import * as dom from '../../dom/index.js' +import { warn } from '../../utils.js' + +/** + * @param {SweetAlert} instance + * @param {SweetAlertOptions} params + */ +export const renderProgressSteps = (instance, params) => { + const progressStepsContainer = dom.getProgressSteps() + if (!progressStepsContainer) { + return + } + + const { progressSteps, currentProgressStep } = params + + if (!progressSteps || progressSteps.length === 0 || currentProgressStep === undefined) { + dom.hide(progressStepsContainer) + return + } + + dom.show(progressStepsContainer) + progressStepsContainer.textContent = '' + if (currentProgressStep >= progressSteps.length) { + warn( + 'Invalid currentProgressStep parameter, it should be less than progressSteps.length ' + + '(currentProgressStep like JS arrays starts from 0)' + ) + } + + progressSteps.forEach((step, index) => { + const stepEl = createStepElement(step) + progressStepsContainer.appendChild(stepEl) + if (index === currentProgressStep) { + dom.addClass(stepEl, swalClasses['active-progress-step']) + } + + if (index !== progressSteps.length - 1) { + const lineEl = createLineElement(params) + progressStepsContainer.appendChild(lineEl) + } + }) +} + +/** + * @param {string} step + * @returns {HTMLLIElement} + */ +const createStepElement = (step) => { + const stepEl = document.createElement('li') + dom.addClass(stepEl, swalClasses['progress-step']) + dom.setInnerHtml(stepEl, step) + return stepEl +} + +/** + * @param {SweetAlertOptions} params + * @returns {HTMLLIElement} + */ +const createLineElement = (params) => { + const lineEl = document.createElement('li') + dom.addClass(lineEl, swalClasses['progress-step-line']) + if (params.progressStepsDistance) { + dom.applyNumericalStyle(lineEl, 'width', params.progressStepsDistance) + } + return lineEl +} diff --git a/public/assets/sweetalert2/src/utils/dom/renderers/renderTitle.js b/public/assets/sweetalert2/src/utils/dom/renderers/renderTitle.js new file mode 100644 index 0000000..fb74bbb --- /dev/null +++ b/public/assets/sweetalert2/src/utils/dom/renderers/renderTitle.js @@ -0,0 +1,27 @@ +import * as dom from '../../dom/index.js' + +/** + * @param {SweetAlert} instance + * @param {SweetAlertOptions} params + */ +export const renderTitle = (instance, params) => { + const title = dom.getTitle() + if (!title) { + return + } + + dom.showWhenInnerHtmlPresent(title) + + dom.toggle(title, Boolean(params.title || params.titleText), 'block') + + if (params.title) { + dom.parseHtmlToContainer(params.title, title) + } + + if (params.titleText) { + title.innerText = params.titleText + } + + // Custom class + dom.applyCustomClass(title, params, 'title') +} diff --git a/public/assets/sweetalert2/src/utils/draggable.js b/public/assets/sweetalert2/src/utils/draggable.js new file mode 100644 index 0000000..f075352 --- /dev/null +++ b/public/assets/sweetalert2/src/utils/draggable.js @@ -0,0 +1,99 @@ +import globalState from '../globalState.js' +import * as dom from './dom/index.js' + +let dragging = false +let mousedownX = 0 +let mousedownY = 0 +let initialX = 0 +let initialY = 0 + +/** + * @param {HTMLElement} popup + */ +export const addDraggableListeners = (popup) => { + popup.addEventListener('mousedown', down) + document.body.addEventListener('mousemove', move) + popup.addEventListener('mouseup', up) + + popup.addEventListener('touchstart', down) + document.body.addEventListener('touchmove', move) + popup.addEventListener('touchend', up) +} + +/** + * @param {HTMLElement} popup + */ +export const removeDraggableListeners = (popup) => { + popup.removeEventListener('mousedown', down) + document.body.removeEventListener('mousemove', move) + popup.removeEventListener('mouseup', up) + + popup.removeEventListener('touchstart', down) + document.body.removeEventListener('touchmove', move) + popup.removeEventListener('touchend', up) +} + +/** + * @param {MouseEvent | TouchEvent} event + */ +const down = (event) => { + const popup = dom.getPopup() + + if (!popup) { + return + } + + const icon = dom.getIcon() + if (event.target === popup || (icon && icon.contains(/** @type {HTMLElement} */ (event.target)))) { + dragging = true + const clientXY = getClientXY(event) + mousedownX = clientXY.clientX + mousedownY = clientXY.clientY + initialX = parseInt(popup.style.insetInlineStart) || 0 + initialY = parseInt(popup.style.insetBlockStart) || 0 + dom.addClass(popup, 'swal2-dragging') + } +} + +/** + * @param {MouseEvent | TouchEvent} event + */ +const move = (event) => { + const popup = dom.getPopup() + + if (!popup) { + return + } + + if (dragging) { + let { clientX, clientY } = getClientXY(event) + const deltaX = clientX - mousedownX + // In RTL mode, negate the horizontal delta since insetInlineStart refers to the right edge + popup.style.insetInlineStart = `${initialX + (globalState.isRTL ? -deltaX : deltaX)}px` + popup.style.insetBlockStart = `${initialY + (clientY - mousedownY)}px` + } +} + +const up = () => { + const popup = dom.getPopup() + + dragging = false + dom.removeClass(popup, 'swal2-dragging') +} + +/** + * @param {MouseEvent | TouchEvent} event + * @returns {{ clientX: number, clientY: number }} + */ +const getClientXY = (event) => { + let clientX = 0, + clientY = 0 + if (event.type.startsWith('mouse')) { + clientX = /** @type {MouseEvent} */ (event).clientX + clientY = /** @type {MouseEvent} */ (event).clientY + } else if (event.type.startsWith('touch')) { + clientX = /** @type {TouchEvent} */ (event).touches[0].clientX + clientY = /** @type {TouchEvent} */ (event).touches[0].clientY + } + return { clientX, clientY } +} diff --git a/public/assets/sweetalert2/src/utils/getTemplateParams.js b/public/assets/sweetalert2/src/utils/getTemplateParams.js new file mode 100644 index 0000000..13d5248 --- /dev/null +++ b/public/assets/sweetalert2/src/utils/getTemplateParams.js @@ -0,0 +1,265 @@ +import defaultParams from './params.js' +import { capitalizeFirstLetter, warn } from './utils.js' + +const swalStringParams = ['swal-title', 'swal-html', 'swal-footer'] + +/** + * @param {SweetAlertOptions} params + * @returns {SweetAlertOptions} + */ +export const getTemplateParams = (params) => { + const template = + typeof params.template === 'string' + ? /** @type {HTMLTemplateElement} */ (document.querySelector(params.template)) + : params.template + if (!template) { + return {} + } + /** @type {DocumentFragment} */ + const templateContent = template.content + + showWarningsForElements(templateContent) + + const result = Object.assign( + getSwalParams(templateContent), + getSwalFunctionParams(templateContent), + getSwalButtons(templateContent), + getSwalImage(templateContent), + getSwalIcon(templateContent), + getSwalInput(templateContent), + getSwalStringParams(templateContent, swalStringParams) + ) + return result +} + +/** + * @param {DocumentFragment} templateContent + * @returns {Record} + */ +const getSwalParams = (templateContent) => { + /** @type {Record} */ + const result = {} + /** @type {HTMLElement[]} */ + const swalParams = Array.from(templateContent.querySelectorAll('swal-param')) + swalParams.forEach((param) => { + showWarningsForAttributes(param, ['name', 'value']) + const paramName = /** @type {keyof SweetAlertOptions} */ (param.getAttribute('name')) + const value = param.getAttribute('value') + if (!paramName || !value) { + return + } + if ( + paramName in defaultParams && + typeof defaultParams[/** @type {keyof typeof defaultParams} */ (paramName)] === 'boolean' + ) { + result[paramName] = value !== 'false' + } else if ( + paramName in defaultParams && + typeof defaultParams[/** @type {keyof typeof defaultParams} */ (paramName)] === 'object' + ) { + result[paramName] = JSON.parse(value) + } else { + result[paramName] = value + } + }) + return result +} + +/** + * @param {DocumentFragment} templateContent + * @returns {Record void>} + */ +const getSwalFunctionParams = (templateContent) => { + /** @type {Record void>} */ + const result = {} + /** @type {HTMLElement[]} */ + const swalFunctions = Array.from(templateContent.querySelectorAll('swal-function-param')) + swalFunctions.forEach((param) => { + const paramName = /** @type {keyof SweetAlertOptions} */ param.getAttribute('name') + const value = param.getAttribute('value') + if (!paramName || !value) { + return + } + result[paramName] = new Function(`return ${value}`)() + }) + return result +} + +/** + * @param {DocumentFragment} templateContent + * @returns {Record} + */ +const getSwalButtons = (templateContent) => { + /** @type {Record} */ + const result = {} + /** @type {HTMLElement[]} */ + const swalButtons = Array.from(templateContent.querySelectorAll('swal-button')) + swalButtons.forEach((button) => { + showWarningsForAttributes(button, ['type', 'color', 'aria-label']) + const type = button.getAttribute('type') + if (!type || !['confirm', 'cancel', 'deny'].includes(type)) { + return + } + result[`${type}ButtonText`] = button.innerHTML + result[`show${capitalizeFirstLetter(type)}Button`] = true + if (button.hasAttribute('color')) { + const color = button.getAttribute('color') + if (color !== null) { + result[`${type}ButtonColor`] = color + } + } + if (button.hasAttribute('aria-label')) { + const ariaLabel = button.getAttribute('aria-label') + if (ariaLabel !== null) { + result[`${type}ButtonAriaLabel`] = ariaLabel + } + } + }) + return result +} + +/** + * @param {DocumentFragment} templateContent + * @returns {Pick} + */ +const getSwalImage = (templateContent) => { + const result = {} + /** @type {HTMLElement | null} */ + const image = templateContent.querySelector('swal-image') + if (image) { + showWarningsForAttributes(image, ['src', 'width', 'height', 'alt']) + if (image.hasAttribute('src')) { + result.imageUrl = image.getAttribute('src') || undefined + } + if (image.hasAttribute('width')) { + result.imageWidth = image.getAttribute('width') || undefined + } + if (image.hasAttribute('height')) { + result.imageHeight = image.getAttribute('height') || undefined + } + if (image.hasAttribute('alt')) { + result.imageAlt = image.getAttribute('alt') || undefined + } + } + return result +} + +/** + * @param {DocumentFragment} templateContent + * @returns {object} + */ +const getSwalIcon = (templateContent) => { + const result = {} + /** @type {HTMLElement | null} */ + const icon = templateContent.querySelector('swal-icon') + if (icon) { + showWarningsForAttributes(icon, ['type', 'color']) + if (icon.hasAttribute('type')) { + result.icon = icon.getAttribute('type') + } + if (icon.hasAttribute('color')) { + result.iconColor = icon.getAttribute('color') + } + result.iconHtml = icon.innerHTML + } + return result +} + +/** + * @param {DocumentFragment} templateContent + * @returns {object} + */ +const getSwalInput = (templateContent) => { + /** @type {Record} */ + const result = {} + /** @type {HTMLElement | null} */ + const input = templateContent.querySelector('swal-input') + if (input) { + showWarningsForAttributes(input, ['type', 'label', 'placeholder', 'value']) + result.input = input.getAttribute('type') || 'text' + if (input.hasAttribute('label')) { + result.inputLabel = input.getAttribute('label') + } + if (input.hasAttribute('placeholder')) { + result.inputPlaceholder = input.getAttribute('placeholder') + } + if (input.hasAttribute('value')) { + result.inputValue = input.getAttribute('value') + } + } + /** @type {HTMLElement[]} */ + const inputOptions = Array.from(templateContent.querySelectorAll('swal-input-option')) + if (inputOptions.length) { + result.inputOptions = {} + inputOptions.forEach((option) => { + showWarningsForAttributes(option, ['value']) + const optionValue = option.getAttribute('value') + if (!optionValue) { + return + } + const optionName = option.innerHTML + result.inputOptions[optionValue] = optionName + }) + } + return result +} + +/** + * @param {DocumentFragment} templateContent + * @param {string[]} paramNames + * @returns {Record} + */ +const getSwalStringParams = (templateContent, paramNames) => { + /** @type {Record} */ + const result = {} + for (const i in paramNames) { + const paramName = paramNames[i] + /** @type {HTMLElement | null} */ + const tag = templateContent.querySelector(paramName) + if (tag) { + showWarningsForAttributes(tag, []) + result[paramName.replace(/^swal-/, '')] = tag.innerHTML.trim() + } + } + return result +} + +/** + * @param {DocumentFragment} templateContent + */ +const showWarningsForElements = (templateContent) => { + const allowedElements = swalStringParams.concat([ + 'swal-param', + 'swal-function-param', + 'swal-button', + 'swal-image', + 'swal-icon', + 'swal-input', + 'swal-input-option', + ]) + Array.from(templateContent.children).forEach((el) => { + const tagName = el.tagName.toLowerCase() + if (!allowedElements.includes(tagName)) { + warn(`Unrecognized element <${tagName}>`) + } + }) +} + +/** + * @param {HTMLElement} el + * @param {string[]} allowedAttributes + */ +const showWarningsForAttributes = (el, allowedAttributes) => { + Array.from(el.attributes).forEach((attribute) => { + if (allowedAttributes.indexOf(attribute.name) === -1) { + warn([ + `Unrecognized attribute "${attribute.name}" on <${el.tagName.toLowerCase()}>.`, + `${ + allowedAttributes.length + ? `Allowed attributes are: ${allowedAttributes.join(', ')}` + : 'To set the value, use HTML within the element.' + }`, + ]) + } + }) +} diff --git a/public/assets/sweetalert2/src/utils/iosFix.js b/public/assets/sweetalert2/src/utils/iosFix.js new file mode 100644 index 0000000..6ac7986 --- /dev/null +++ b/public/assets/sweetalert2/src/utils/iosFix.js @@ -0,0 +1,112 @@ +import { swalClasses } from '../utils/classes.js' +import * as dom from './dom/index.js' + +// @ts-ignore +export const isSafariOrIOS = typeof window !== 'undefined' && Boolean(window.GestureEvent) // true for Safari desktop + all iOS browsers https://stackoverflow.com/a/70585394 + +/** + * Fix iOS scrolling + * http://stackoverflow.com/q/39626302 + */ +export const iOSfix = () => { + if (isSafariOrIOS && !dom.hasClass(document.body, swalClasses.iosfix)) { + const offset = document.body.scrollTop + document.body.style.top = `${offset * -1}px` + dom.addClass(document.body, swalClasses.iosfix) + lockBodyScroll() + } +} + +/** + * https://github.com/sweetalert2/sweetalert2/issues/1246 + */ +const lockBodyScroll = () => { + const container = dom.getContainer() + if (!container) { + return + } + /** @type {boolean} */ + let preventTouchMove + /** + * @param {TouchEvent} event + */ + container.ontouchstart = (event) => { + preventTouchMove = shouldPreventTouchMove(event) + } + /** + * @param {TouchEvent} event + */ + container.ontouchmove = (event) => { + if (preventTouchMove) { + event.preventDefault() + event.stopPropagation() + } + } +} + +/** + * @param {TouchEvent} event + * @returns {boolean} + */ +const shouldPreventTouchMove = (event) => { + const target = event.target + const container = dom.getContainer() + const htmlContainer = dom.getHtmlContainer() + if (!container || !htmlContainer) { + return false + } + if (isStylus(event) || isZoom(event)) { + return false + } + if (target === container) { + return true + } + if ( + !dom.isScrollable(container) && + target instanceof HTMLElement && + !dom.selfOrParentIsScrollable(target, htmlContainer) && // #2823 + target.tagName !== 'INPUT' && // #1603 + target.tagName !== 'TEXTAREA' && // #2266 + !( + dom.isScrollable(htmlContainer) && // #1944 + htmlContainer.contains(target) + ) + ) { + return true + } + return false +} + +/** + * https://github.com/sweetalert2/sweetalert2/issues/1786 + * + * @param {TouchEvent} event + * @returns {boolean} + */ +const isStylus = (event) => { + return Boolean( + event.touches && + event.touches.length && + // @ts-ignore - touchType is not a standard property + event.touches[0].touchType === 'stylus' + ) +} + +/** + * https://github.com/sweetalert2/sweetalert2/issues/1891 + * + * @param {TouchEvent} event + * @returns {boolean} + */ +const isZoom = (event) => { + return event.touches && event.touches.length > 1 +} + +export const undoIOSfix = () => { + if (dom.hasClass(document.body, swalClasses.iosfix)) { + const offset = parseInt(document.body.style.top, 10) + dom.removeClass(document.body, swalClasses.iosfix) + document.body.style.top = '' + document.body.scrollTop = offset * -1 + } +} diff --git a/public/assets/sweetalert2/src/utils/isNodeEnv.js b/public/assets/sweetalert2/src/utils/isNodeEnv.js new file mode 100644 index 0000000..6a775ea --- /dev/null +++ b/public/assets/sweetalert2/src/utils/isNodeEnv.js @@ -0,0 +1,6 @@ +/** + * Detect Node env + * + * @returns {boolean} + */ +export const isNodeEnv = () => typeof window === 'undefined' || typeof document === 'undefined' diff --git a/public/assets/sweetalert2/src/utils/openPopup.js b/public/assets/sweetalert2/src/utils/openPopup.js new file mode 100644 index 0000000..a58ee72 --- /dev/null +++ b/public/assets/sweetalert2/src/utils/openPopup.js @@ -0,0 +1,139 @@ +import globalState from '../globalState.js' +import { setAriaHidden } from './aria.js' +import { swalClasses } from './classes.js' +import * as dom from './dom/index.js' +import { iOSfix } from './iosFix.js' +import { replaceScrollbarWithPadding } from './scrollbar.js' + +export const SHOW_CLASS_TIMEOUT = 10 + +/** + * Open popup, add necessary classes and styles, fix scrollbar + * + * @param {SweetAlertOptions} params + */ +export const openPopup = (params) => { + const container = dom.getContainer() + const popup = dom.getPopup() + + if (!container || !popup) { + return + } + + if (typeof params.willOpen === 'function') { + params.willOpen(popup) + } + globalState.eventEmitter?.emit('willOpen', popup) + + const bodyStyles = window.getComputedStyle(document.body) + const initialBodyOverflow = bodyStyles.overflowY + addClasses(container, popup, params) + + // scrolling is 'hidden' until animation is done, after that 'auto' + setTimeout(() => { + setScrollingVisibility(container, popup) + }, SHOW_CLASS_TIMEOUT) + + if (dom.isModal()) { + // Using ternary instead of ?? operator for Webpack 4 compatibility + fixScrollContainer( + container, + params.scrollbarPadding !== undefined ? params.scrollbarPadding : false, + initialBodyOverflow + ) + setAriaHidden() + } + + if (!dom.isToast() && !globalState.previousActiveElement) { + globalState.previousActiveElement = document.activeElement + } + + if (typeof params.didOpen === 'function') { + const didOpen = params.didOpen + setTimeout(() => didOpen(popup)) + } + globalState.eventEmitter?.emit('didOpen', popup) +} + +/** + * @param {Event} event + */ +const swalOpenAnimationFinished = (event) => { + const popup = dom.getPopup() + if (!popup || event.target !== popup) { + return + } + const container = dom.getContainer() + if (!container) { + return + } + popup.removeEventListener('animationend', swalOpenAnimationFinished) + popup.removeEventListener('transitionend', swalOpenAnimationFinished) + container.style.overflowY = 'auto' + + // no-transition is added in init() in case one swal is opened right after another + dom.removeClass(container, swalClasses['no-transition']) +} + +/** + * @param {HTMLElement} container + * @param {HTMLElement} popup + */ +const setScrollingVisibility = (container, popup) => { + if (dom.hasCssAnimation(popup)) { + container.style.overflowY = 'hidden' + popup.addEventListener('animationend', swalOpenAnimationFinished) + popup.addEventListener('transitionend', swalOpenAnimationFinished) + } else { + container.style.overflowY = 'auto' + } +} + +/** + * @param {HTMLElement} container + * @param {boolean} scrollbarPadding + * @param {string} initialBodyOverflow + */ +const fixScrollContainer = (container, scrollbarPadding, initialBodyOverflow) => { + iOSfix() + + if (scrollbarPadding && initialBodyOverflow !== 'hidden') { + replaceScrollbarWithPadding(initialBodyOverflow) + } + + // sweetalert2/issues/1247 + setTimeout(() => { + container.scrollTop = 0 + }) +} + +/** + * @param {HTMLElement} container + * @param {HTMLElement} popup + * @param {SweetAlertOptions} params + */ +const addClasses = (container, popup, params) => { + if (params.showClass?.backdrop) { + dom.addClass(container, params.showClass.backdrop) + } + if (params.animation) { + // this workaround with opacity is needed for https://github.com/sweetalert2/sweetalert2/issues/2059 + popup.style.setProperty('opacity', '0', 'important') + dom.show(popup, 'grid') + setTimeout(() => { + // Animate popup right after showing it + if (params.showClass?.popup) { + dom.addClass(popup, params.showClass.popup) + } + // and remove the opacity workaround + popup.style.removeProperty('opacity') + }, SHOW_CLASS_TIMEOUT) // 10ms in order to fix #2062 + } else { + dom.show(popup, 'grid') + } + + dom.addClass([document.documentElement, document.body], swalClasses.shown) + if (params.heightAuto && params.backdrop && !params.toast) { + dom.addClass([document.documentElement, document.body], swalClasses['height-auto']) + } +} diff --git a/public/assets/sweetalert2/src/utils/params.js b/public/assets/sweetalert2/src/utils/params.js new file mode 100644 index 0000000..ed5b817 --- /dev/null +++ b/public/assets/sweetalert2/src/utils/params.js @@ -0,0 +1,269 @@ +import { warn, warnAboutDeprecation } from '../utils/utils.js' + +export const defaultParams = { + title: '', + titleText: '', + text: '', + html: '', + footer: '', + icon: undefined, + iconColor: undefined, + iconHtml: undefined, + template: undefined, + toast: false, + draggable: false, + animation: true, + theme: 'light', + showClass: { + popup: 'swal2-show', + backdrop: 'swal2-backdrop-show', + icon: 'swal2-icon-show', + }, + hideClass: { + popup: 'swal2-hide', + backdrop: 'swal2-backdrop-hide', + icon: 'swal2-icon-hide', + }, + customClass: {}, + target: 'body', + color: undefined, + backdrop: true, + heightAuto: true, + allowOutsideClick: true, + allowEscapeKey: true, + allowEnterKey: true, + stopKeydownPropagation: true, + keydownListenerCapture: false, + showConfirmButton: true, + showDenyButton: false, + showCancelButton: false, + preConfirm: undefined, + preDeny: undefined, + confirmButtonText: 'OK', + confirmButtonAriaLabel: '', + confirmButtonColor: undefined, + denyButtonText: 'No', + denyButtonAriaLabel: '', + denyButtonColor: undefined, + cancelButtonText: 'Cancel', + cancelButtonAriaLabel: '', + cancelButtonColor: undefined, + buttonsStyling: true, + reverseButtons: false, + focusConfirm: true, + focusDeny: false, + focusCancel: false, + returnFocus: true, + showCloseButton: false, + closeButtonHtml: '×', + closeButtonAriaLabel: 'Close this dialog', + loaderHtml: '', + showLoaderOnConfirm: false, + showLoaderOnDeny: false, + imageUrl: undefined, + imageWidth: undefined, + imageHeight: undefined, + imageAlt: '', + timer: undefined, + timerProgressBar: false, + width: undefined, + padding: undefined, + background: undefined, + input: undefined, + inputPlaceholder: '', + inputLabel: '', + inputValue: '', + inputOptions: {}, + inputAutoFocus: true, + inputAutoTrim: true, + inputAttributes: {}, + inputValidator: undefined, + returnInputValueOnDeny: false, + validationMessage: undefined, + grow: false, + position: 'center', + progressSteps: [], + currentProgressStep: undefined, + progressStepsDistance: undefined, + willOpen: undefined, + didOpen: undefined, + didRender: undefined, + willClose: undefined, + didClose: undefined, + didDestroy: undefined, + scrollbarPadding: true, + topLayer: false, +} + +export const updatableParams = [ + 'allowEscapeKey', + 'allowOutsideClick', + 'background', + 'buttonsStyling', + 'cancelButtonAriaLabel', + 'cancelButtonColor', + 'cancelButtonText', + 'closeButtonAriaLabel', + 'closeButtonHtml', + 'color', + 'confirmButtonAriaLabel', + 'confirmButtonColor', + 'confirmButtonText', + 'currentProgressStep', + 'customClass', + 'denyButtonAriaLabel', + 'denyButtonColor', + 'denyButtonText', + 'didClose', + 'didDestroy', + 'draggable', + 'footer', + 'hideClass', + 'html', + 'icon', + 'iconColor', + 'iconHtml', + 'imageAlt', + 'imageHeight', + 'imageUrl', + 'imageWidth', + 'preConfirm', + 'preDeny', + 'progressSteps', + 'returnFocus', + 'reverseButtons', + 'showCancelButton', + 'showCloseButton', + 'showConfirmButton', + 'showDenyButton', + 'text', + 'title', + 'titleText', + 'theme', + 'willClose', +] + +/** @type {Record} */ +export const deprecatedParams = { + allowEnterKey: undefined, +} + +const toastIncompatibleParams = [ + 'allowOutsideClick', + 'allowEnterKey', + 'backdrop', + 'draggable', + 'focusConfirm', + 'focusDeny', + 'focusCancel', + 'returnFocus', + 'heightAuto', + 'keydownListenerCapture', +] + +/** + * Is valid parameter + * + * @param {string} paramName + * @returns {boolean} + */ +export const isValidParameter = (paramName) => { + return Object.prototype.hasOwnProperty.call(defaultParams, paramName) +} + +/** + * Is valid parameter for Swal.update() method + * + * @param {string} paramName + * @returns {boolean} + */ +export const isUpdatableParameter = (paramName) => { + return updatableParams.indexOf(paramName) !== -1 +} + +/** + * Is deprecated parameter + * + * @param {string} paramName + * @returns {string | undefined} + */ +export const isDeprecatedParameter = (paramName) => { + return deprecatedParams[paramName] +} + +/** + * @param {string} param + */ +const checkIfParamIsValid = (param) => { + if (!isValidParameter(param)) { + warn(`Unknown parameter "${param}"`) + } +} + +/** + * @param {string} param + */ +const checkIfToastParamIsValid = (param) => { + if (toastIncompatibleParams.includes(param)) { + warn(`The parameter "${param}" is incompatible with toasts`) + } +} + +/** + * @param {string} param + */ +const checkIfParamIsDeprecated = (param) => { + const isDeprecated = isDeprecatedParameter(param) + if (isDeprecated) { + warnAboutDeprecation(param, isDeprecated) + } +} + +/** + * Show relevant warnings for given params + * + * @param {SweetAlertOptions} params + */ +export const showWarningsForParams = (params) => { + if (params.backdrop === false && params.allowOutsideClick) { + warn('"allowOutsideClick" parameter requires `backdrop` parameter to be set to `true`') + } + + if ( + params.theme && + ![ + 'light', + 'dark', + 'auto', + 'minimal', + 'borderless', + 'bootstrap-4', + 'bootstrap-4-light', + 'bootstrap-4-dark', + 'bootstrap-5', + 'bootstrap-5-light', + 'bootstrap-5-dark', + 'material-ui', + 'material-ui-light', + 'material-ui-dark', + 'embed-iframe', + 'bulma', + 'bulma-light', + 'bulma-dark', + ].includes(params.theme) + ) { + warn(`Invalid theme "${params.theme}"`) + } + + for (const param in params) { + checkIfParamIsValid(param) + + if (params.toast) { + checkIfToastParamIsValid(param) + } + + checkIfParamIsDeprecated(param) + } +} + +export default defaultParams diff --git a/public/assets/sweetalert2/src/utils/scrollbar.js b/public/assets/sweetalert2/src/utils/scrollbar.js new file mode 100644 index 0000000..7f9bf9c --- /dev/null +++ b/public/assets/sweetalert2/src/utils/scrollbar.js @@ -0,0 +1,48 @@ +import { swalClasses } from './classes.js' + +/** + * Measure scrollbar width for padding body during modal show/hide + * https://github.com/twbs/bootstrap/blob/master/js/src/modal.js + * + * @returns {number} + */ +export const measureScrollbar = () => { + const scrollDiv = document.createElement('div') + scrollDiv.className = swalClasses['scrollbar-measure'] + document.body.appendChild(scrollDiv) + const scrollbarWidth = scrollDiv.getBoundingClientRect().width - scrollDiv.clientWidth + document.body.removeChild(scrollDiv) + return scrollbarWidth +} + +/** + * Remember state in cases where opening and handling a modal will fiddle with it. + * @type {number | null} + */ +let previousBodyPadding = null + +/** + * @param {string} initialBodyOverflow + */ +export const replaceScrollbarWithPadding = (initialBodyOverflow) => { + // for queues, do not do this more than once + if (previousBodyPadding !== null) { + return + } + // if the body has overflow + if ( + document.body.scrollHeight > window.innerHeight || + initialBodyOverflow === 'scroll' // https://github.com/sweetalert2/sweetalert2/issues/2663 + ) { + // add padding so the content doesn't shift after removal of scrollbar + previousBodyPadding = parseInt(window.getComputedStyle(document.body).getPropertyValue('padding-right')) + document.body.style.paddingRight = `${previousBodyPadding + measureScrollbar()}px` + } +} + +export const undoReplaceScrollbarWithPadding = () => { + if (previousBodyPadding !== null) { + document.body.style.paddingRight = `${previousBodyPadding}px` + previousBodyPadding = null + } +} diff --git a/public/assets/sweetalert2/src/utils/setParameters.js b/public/assets/sweetalert2/src/utils/setParameters.js new file mode 100644 index 0000000..2b44439 --- /dev/null +++ b/public/assets/sweetalert2/src/utils/setParameters.js @@ -0,0 +1,61 @@ +import defaultInputValidators from './defaultInputValidators.js' +import * as dom from './dom/index.js' +import { warn } from './utils.js' + +/** + * @param {SweetAlertOptions} params + */ +function setDefaultInputValidators(params) { + // Use default `inputValidator` for supported input types if not provided + if (params.inputValidator) { + return + } + if (params.input === 'email') { + params.inputValidator = defaultInputValidators['email'] + } + if (params.input === 'url') { + params.inputValidator = defaultInputValidators['url'] + } +} + +/** + * @param {SweetAlertOptions} params + */ +function validateCustomTargetElement(params) { + // Determine if the custom target element is valid + if ( + !params.target || + (typeof params.target === 'string' && !document.querySelector(params.target)) || + (typeof params.target !== 'string' && !params.target.appendChild) + ) { + warn('Target parameter is not valid, defaulting to "body"') + params.target = 'body' + } +} + +/** + * Set type, text and actions on popup + * + * @param {SweetAlertOptions} params + */ +export default function setParameters(params) { + setDefaultInputValidators(params) + + // showLoaderOnConfirm && preConfirm + if (params.showLoaderOnConfirm && !params.preConfirm) { + warn( + 'showLoaderOnConfirm is set to true, but preConfirm is not defined.\n' + + 'showLoaderOnConfirm should be used together with preConfirm, see usage example:\n' + + 'https://sweetalert2.github.io/#ajax-request' + ) + } + + validateCustomTargetElement(params) + + // Replace newlines with
                      in title + if (typeof params.title === 'string') { + params.title = params.title.split('\n').join('
                      ') + } + + dom.init(params) +} diff --git a/public/assets/sweetalert2/src/utils/utils.js b/public/assets/sweetalert2/src/utils/utils.js new file mode 100644 index 0000000..5f2424a --- /dev/null +++ b/public/assets/sweetalert2/src/utils/utils.js @@ -0,0 +1,88 @@ +export const consolePrefix = 'SweetAlert2:' + +/** + * Capitalize the first letter of a string + * + * @param {string} str + * @returns {string} + */ +export const capitalizeFirstLetter = (str) => str.charAt(0).toUpperCase() + str.slice(1) + +/** + * Standardize console warnings + * + * @param {string | string[]} message + */ +export const warn = (message) => { + console.warn(`${consolePrefix} ${typeof message === 'object' ? message.join(' ') : message}`) +} + +/** + * Standardize console errors + * + * @param {string} message + */ +export const error = (message) => { + console.error(`${consolePrefix} ${message}`) +} + +/** + * Private global state for `warnOnce` + * + * @type {string[]} + * @private + */ +const previousWarnOnceMessages = [] + +/** + * Show a console warning, but only if it hasn't already been shown + * + * @param {string} message + */ +export const warnOnce = (message) => { + if (!previousWarnOnceMessages.includes(message)) { + previousWarnOnceMessages.push(message) + warn(message) + } +} + +/** + * Show a one-time console warning about deprecated params/methods + * + * @param {string} deprecatedParam + * @param {string?} useInstead + */ +export const warnAboutDeprecation = (deprecatedParam, useInstead = null) => { + warnOnce( + `"${deprecatedParam}" is deprecated and will be removed in the next major release.${ + useInstead ? ` Use "${useInstead}" instead.` : '' + }` + ) +} + +/** + * If `arg` is a function, call it (with no arguments or context) and return the result. + * Otherwise, just pass the value through + * + * @param {(() => *) | *} arg + * @returns {*} + */ +export const callIfFunction = (arg) => (typeof arg === 'function' ? arg() : arg) + +/** + * @param {*} arg + * @returns {boolean} + */ +export const hasToPromiseFn = (arg) => arg && typeof arg.toPromise === 'function' + +/** + * @param {*} arg + * @returns {Promise<*>} + */ +export const asPromise = (arg) => (hasToPromiseFn(arg) ? arg.toPromise() : Promise.resolve(arg)) + +/** + * @param {*} arg + * @returns {boolean} + */ +export const isPromise = (arg) => arg && Promise.resolve(arg) === arg diff --git a/public/assets/sweetalert2/sweetalert2.d.ts b/public/assets/sweetalert2/sweetalert2.d.ts new file mode 100644 index 0000000..9f7781b --- /dev/null +++ b/public/assets/sweetalert2/sweetalert2.d.ts @@ -0,0 +1,1315 @@ +declare module 'sweetalert2' { + /** + * A namespace inside the default function, containing utility function for controlling the currently-displayed popup. + * + * Example: + * ``` + * Swal.fire('Hey user!', 'You are the rockstar!', 'info'); + * + * Swal.update({ + * icon: 'success' + * }) + * ``` + */ + namespace Swal { + /** + * Function to display a SweetAlert2 popup, with an object of options, all being optional. + * See the `SweetAlertOptions` interface for the list of accepted fields and values. + * + * Example: + * ``` + * Swal.fire({ + * title: 'Auto close alert!', + * text: 'I will close in 2 seconds.', + * timer: 2000 + * }) + * ``` + */ + function fire(options: SweetAlertOptions): Promise>> + + /** + * Function to display a simple SweetAlert2 popup. + * + * Example: + * ``` + * Swal.fire('The Internet?', 'That thing is still around?', 'question'); + * ``` + */ + function fire(title?: string, html?: string, icon?: SweetAlertIcon): Promise>> + + /** + * Reuse configuration by creating a `Swal` instance. + * + * Example: + * ``` + * const Toast = Swal.mixin({ + * toast: true, + * position: 'top-end', + * timer: 3000, + * timerProgressBar: true + * }) + * Toast.fire('Something interesting happened', '', 'info') + * ``` + * + * @param options the default options to set for this instance. + */ + function mixin(options: SweetAlertOptions): typeof Swal + + /** + * Determines if a popup is shown. + */ + function isVisible(): boolean + + /** + * Updates popup options. + * See the `SweetAlertOptions` interface for the list of accepted fields and values. + * + * Example: + * ``` + * Swal.update({ + * icon: 'error' + * }) + * ``` + */ + function update(options: Pick): void + + /** + * Closes the currently open SweetAlert2 popup programmatically. + * + * @param result The promise originally returned by `Swal.fire()` will be resolved with this value. + * If no object is given, the promise is resolved with an empty `SweetAlertResult` object. + */ + function close(result?: Partial): void + + /** + * Gets the popup container which contains the backdrop and the popup itself. + */ + function getContainer(): HTMLElement | null + + /** + * Gets the popup. + */ + function getPopup(): HTMLElement | null + + /** + * Gets the popup title. + */ + function getTitle(): HTMLElement | null + + /** + * Gets progress steps. + */ + function getProgressSteps(): HTMLElement | null + + /** + * Gets the DOM element where the `html`/`text` parameter is rendered to. + */ + function getHtmlContainer(): HTMLElement | null + + /** + * Gets the image. + */ + function getImage(): HTMLElement | null + + /** + * Gets the close button. + */ + function getCloseButton(): HTMLButtonElement | null + + /** + * Gets the icon. + */ + function getIcon(): HTMLElement | null + + /** + * Gets the icon content (without border). + */ + function getIconContent(): HTMLElement | null + + /** + * Gets the "Confirm" button. + */ + function getConfirmButton(): HTMLButtonElement | null + + /** + * Gets the "Deny" button. + */ + function getDenyButton(): HTMLButtonElement | null + + /** + * Gets the "Cancel" button. + */ + function getCancelButton(): HTMLButtonElement | null + + /** + * Gets actions (buttons) wrapper. + */ + function getActions(): HTMLElement | null + + /** + * Gets the popup footer. + */ + function getFooter(): HTMLElement | null + + /** + * Gets the timer progress bar (see the `timerProgressBar` param). + */ + function getTimerProgressBar(): HTMLElement | null + + /** + * Gets all focusable elements in the popup. + */ + function getFocusableElements(): readonly HTMLElement[] + + /** + * Enables "Confirm" and "Cancel" buttons. + */ + function enableButtons(): void + + /** + * Disables "Confirm" and "Cancel" buttons. + */ + function disableButtons(): void + + /** + * Shows loader (spinner), this is useful with AJAX requests. + * + * By default the loader be shown instead of the "Confirm" button, but if you want + * another button to be replaced with a loader, just pass it like this: + * ``` + * Swal.showLoading(Swal.getDenyButton()) + * ``` + */ + function showLoading(buttonToReplace?: HTMLButtonElement | null): void + + /** + * Hides loader and shows back the button which was hidden by .showLoading() + */ + function hideLoading(): void + + /** + * Determines if popup is in the loading state. + */ + function isLoading(): boolean + + /** + * Clicks the "Confirm" button programmatically. + */ + function clickConfirm(): void + + /** + * Clicks the "Deny" button programmatically. + */ + function clickDeny(): void + + /** + * Clicks the "Cancel" button programmatically. + */ + function clickCancel(): void + + /** + * Shows a validation message. + * + * @param validationMessage The validation message. + */ + function showValidationMessage(validationMessage: string): void + + /** + * Hides validation message. + */ + function resetValidationMessage(): void + + /** + * Gets the input DOM node, this method works with input parameter. + */ + function getInput(): HTMLInputElement | null + + /** + * Disables the popup input. A disabled input element is unusable and un-clickable. + */ + function disableInput(): void + + /** + * Enables the popup input. + */ + function enableInput(): void + + /** + * Gets the validation message container. + */ + function getValidationMessage(): HTMLElement | null + + /** + * If `timer` parameter is set, returns number of milliseconds of timer remained. + * Otherwise, returns undefined. + */ + function getTimerLeft(): number | undefined + + /** + * Stop timer. Returns number of milliseconds of timer remained. + * If `timer` parameter isn't set, returns `undefined`. + */ + function stopTimer(): number | undefined + + /** + * Resume timer. Returns number of milliseconds of timer remained. + * If `timer` parameter isn't set, returns `undefined`. + */ + function resumeTimer(): number | undefined + + /** + * Toggle timer. Returns number of milliseconds of timer remained. + * If `timer` parameter isn't set, returns `undefined`. + */ + function toggleTimer(): number | undefined + + /** + * Check if timer is running. Returns true if timer is running, + * and false is timer is paused / stopped. + * If `timer` parameter isn't set, returns `undefined`. + */ + function isTimerRunning(): boolean | undefined + + /** + * Increase timer. Returns number of milliseconds of an updated timer. + * If `timer` parameter isn't set, returns `undefined`. + * + * @param ms The number of milliseconds to add to the current timer + */ + function increaseTimer(ms: number): number | undefined + + /** + * Allows to trigger popups declaratively: + * + * ``` + * + * + * + * ``` + * + * @param attribute The attribute name to search for, defaults to `data-swal-template` + */ + function bindClickHandler(attribute?: string): void + + /** + * Determines if a given parameter name is valid. + * + * @param paramName The parameter to check + */ + function isValidParameter(paramName: string): paramName is keyof SweetAlertOptions + + /** + * Determines if a given parameter name is valid for `Swal.update()` method. + * + * @param paramName The parameter to check + */ + function isUpdatableParameter(paramName: string): paramName is SweetAlertUpdatableParameters + + /** + * Normalizes the arguments you can give to Swal.fire() in an object of type SweetAlertOptions. + * + * Example: + * ``` + * Swal.argsToParams(['title', 'text']); //=> { title: 'title', text: 'text' } + * Swal.argsToParams([{ title: 'title', text: 'text' }]); //=> { title: 'title', text: 'text' } + * ``` + * + * @param params The array of arguments to normalize. + */ + function argsToParams(params: SweetAlertArrayOptions | readonly [SweetAlertOptions]): SweetAlertOptions + + /** + * An object of possible reasons that can explain an alert dismissal. + */ + const DismissReason: { + readonly cancel: 'cancel' + readonly backdrop: 'backdrop' + readonly close: 'close' + readonly esc: 'esc' + readonly timer: 'timer' + } + + /** + * SweetAlert2's version + */ + const version: string + } + + interface SweetAlertHideShowClass { + backdrop?: string | readonly string[] + icon?: string | readonly string[] + popup?: string | readonly string[] + } + + type Awaited = T extends Promise ? U : T + + type SyncOrAsync = T | Promise | { toPromise: () => T } + + type ValueOrThunk = T | (() => T) + + export type SweetAlertArrayOptions = readonly [string?, string?, SweetAlertIcon?] + + export type SweetAlertGrow = 'row' | 'column' | 'fullscreen' | false + + export type SweetAlertHideClass = SweetAlertHideShowClass + + export type SweetAlertShowClass = Readonly + + export type SweetAlertIcon = 'success' | 'error' | 'warning' | 'info' | 'question' + + export type SweetAlertEventName = 'didRender' | 'willOpen' | 'didOpen' | 'willClose' | 'didClose' | 'didDestroy' + + export type SweetAlertInput = + | 'text' + | 'email' + | 'password' + | 'number' + | 'tel' + | 'search' + | 'range' + | 'textarea' + | 'select' + | 'radio' + | 'checkbox' + | 'file' + | 'url' + | 'date' + | 'datetime-local' + | 'time' + | 'week' + | 'month' + + type SweetAlertStringInput = Exclude + + type SweetAlertInputValidator = + | { + input?: SweetAlertStringInput + /** + * Validator for input field, may be async (Promise-returning) or sync. + * + * Example: + * ``` + * Swal.fire({ + * input: 'radio', + * inputValidator: result => !result && 'You need to select something!' + * }) + * ``` + * + * @default undefined + */ + inputValidator?: (value: string) => SyncOrAsync + } + | { + input: 'file' + /** + * Validator for input field, may be async (Promise-returning) or sync. + * + * Example: + * ``` + * Swal.fire({ + * input: 'file', + * inputValidator: result => !result && 'You need to select something!' + * }) + * ``` + * + * @default undefined + */ + inputValidator?: (file: File | FileList | null) => SyncOrAsync + } + + export type SweetAlertTheme = + | 'light' + | 'dark' + | 'auto' + | 'minimal' + | 'borderless' + | 'bootstrap-4' + | 'bootstrap-4-light' + | 'bootstrap-4-dark' + | 'bootstrap-5' + | 'bootstrap-5-light' + | 'bootstrap-5-dark' + | 'material-ui' + | 'material-ui-light' + | 'material-ui-dark' + | 'embed-iframe' + | 'bulma' + | 'bulma-light' + | 'bulma-dark' + + export type SweetAlertPosition = + | 'top' + | 'top-start' + | 'top-end' + | 'top-left' + | 'top-right' + | 'center' + | 'center-start' + | 'center-end' + | 'center-left' + | 'center-right' + | 'bottom' + | 'bottom-start' + | 'bottom-end' + | 'bottom-left' + | 'bottom-right' + + export type SweetAlertUpdatableParameters = + | 'allowEscapeKey' + | 'allowOutsideClick' + | 'background' + | 'buttonsStyling' + | 'cancelButtonAriaLabel' + | 'cancelButtonColor' + | 'cancelButtonText' + | 'closeButtonAriaLabel' + | 'closeButtonHtml' + | 'confirmButtonAriaLabel' + | 'confirmButtonColor' + | 'confirmButtonText' + | 'currentProgressStep' + | 'customClass' + | 'denyButtonAriaLabel' + | 'denyButtonColor' + | 'denyButtonText' + | 'didClose' + | 'didDestroy' + | 'footer' + | 'hideClass' + | 'html' + | 'icon' + | 'iconColor' + | 'imageAlt' + | 'imageHeight' + | 'imageUrl' + | 'imageWidth' + | 'preConfirm' + | 'preDeny' + | 'progressSteps' + | 'reverseButtons' + | 'showCancelButton' + | 'showCloseButton' + | 'showConfirmButton' + | 'showDenyButton' + | 'text' + | 'title' + | 'titleText' + | 'theme' + | 'willClose' + + export type DismissReason = 'cancel' | 'backdrop' | 'close' | 'esc' | 'timer' + + export interface SweetAlertCustomClass { + container?: string | readonly string[] + popup?: string | readonly string[] + title?: string | readonly string[] + closeButton?: string | readonly string[] + icon?: string | readonly string[] + image?: string | readonly string[] + htmlContainer?: string | readonly string[] + input?: string | readonly string[] + inputLabel?: string | readonly string[] + validationMessage?: string | readonly string[] + actions?: string | readonly string[] + confirmButton?: string | readonly string[] + denyButton?: string | readonly string[] + cancelButton?: string | readonly string[] + loader?: string | readonly string[] + footer?: string | readonly string[] + timerProgressBar?: string | readonly string[] + } + + export interface SweetAlertResult { + readonly isConfirmed: boolean + readonly isDenied: boolean + readonly isDismissed: boolean + readonly value?: T + readonly dismiss?: DismissReason + } + + export type SweetAlertOptions = SweetAlertInputValidator & { + /** + * The title of the popup, as HTML. + * It can either be added to the object under the key `title` or passed as the first parameter of `Swal.fire()`. + * + * @default '' + */ + title?: string | HTMLElement | JQuery | undefined + + /** + * The title of the popup, as text. Useful to avoid HTML injection. + * + * @default '' + */ + titleText?: string | undefined + + /** + * A description for the popup. + * If `text` and `html` parameters are provided in the same time, `html` will be used. + * + * @default '' + */ + text?: string | undefined + + /** + * A HTML description for the popup. + * If `text` and `html` parameters are provided in the same time, `html` will be used. + * + * [Security] SweetAlert2 does NOT sanitize this parameter. It is the developer's responsibility + * to escape any user input when using the `html` option, so XSS attacks would be prevented. + * + * @default '' + */ + html?: string | HTMLElement | JQuery | undefined + + /** + * The icon of the popup. + * SweetAlert2 comes with 5 built-in icons which will show a corresponding icon animation: + * `'warning'`, `'error'`, `'success'`, `'info'` and `'question'`. + * It can either be put to the object under the key `icon` or passed as the third parameter of `Swal.fire()`. + * + * @default undefined + */ + icon?: SweetAlertIcon | undefined + + /** + * Use this to change the color of the icon. + * + * @default undefined + */ + iconColor?: string | undefined + + /** + * The custom HTML content for an icon. + * + * Example: + * ``` + * Swal.fire({ + * icon: 'error', + * iconHtml: '' + * }) + * ``` + * + * @default undefined + */ + iconHtml?: string | undefined + + /** + * The footer of the popup, as HTML. + * + * @default '' + */ + footer?: string | HTMLElement | JQuery | undefined + + /** + * The declarative